2

我们正在尝试从 C# 中的远程计算机设置用户的登录脚本。但是,我们收到错误消息“‘Set-ADUser’一词未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后重试。” 您对如何解决此错误有任何想法吗?

using System;

using System.Security;

using System.Management.Automation;

using System.Management.Automation.Runspaces;



namespace PowershellAdUser

{

    class PowershellAdUser

    {

        static void Main(string[] args)

        {

            string runasUsername = @"login";

            string runasPassword = "pass1234";

            SecureString ssRunasPassword = new SecureString();

            foreach (char x in runasPassword)

                ssRunasPassword.AppendChar(x);

            PSCredential credentials =

                new PSCredential(runasUsername, ssRunasPassword);



            var connInfo = new WSManConnectionInfo(

                new Uri("http://1.2.3.4/PowerShell"),

                "http://schemas.microsoft.com/powershell/Microsoft.Exchange",

                credentials);

            connInfo.AuthenticationMechanism =

                AuthenticationMechanism.Basic;



            var runspace = RunspaceFactory.CreateRunspace(connInfo);

            runspace.Open();

            var pipeline = runspace.CreatePipeline();

            var command = new Command("Set-ADUser");

            command.Parameters.Add("ScriptPath", "logonScript.bat");

            command.Parameters.Add("Identity", "test.com/Users/Test User");

            pipeline.Commands.Add(command);

            var results = pipeline.Invoke();

            runspace.Dispose();

        }

    }

}

我们还尝试添加

var command = new Command("Import-Module activedirectory");
 pipeline.Commands.Add(command);

var pipeline = runspace.CreatePipeline();

这是我们添加它时得到的

“‘Import-Module activedirectory’一词未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后重试。”

毕竟这不起作用,我们试图同时传递连接信息和初始会话状态,以绕过之前的“导入模块无法识别”错误。但是,函数 RunspaceFactory.CreateRunspace 似乎将采用 WSManConnectionInfo 对象或 InitialSessionState 对象,但不能同时采用两者。我们还尝试在创建运行空间后设置初始会话状态,但运行空间的 InitialSessionState 成员似乎是私有的。有什么方法可以同时使用 WSManConnectionInfo 对象或 InitialSessionState 对象初始化运行空间?

using System;
using System.DirectoryServices;
using System.Security;
using System.Management.Automation;
using System.Management.Automation.Runspaces;

namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            var target = "servername";
            var user = "login";
            user = string.Format("{0}\\{1}", target, user);
            string shell = "http://schemas.microsoft.com/powershell/Microsoft.PowerShell";
            var targetWsMan = new Uri(string.Format("http://{0}:5985/wsman", target));

            var password = "pass1234";
            var ssPassword = new SecureString();
            foreach (char c in password)
            {
                ssPassword.AppendChar(c);
            }

            var cred = new PSCredential(user, ssPassword);
            var connectionInfo = new WSManConnectionInfo(targetWsMan, shell, cred);

            InitialSessionState init_state = InitialSessionState.CreateDefault();
            init_state.ImportPSModule(new[] { "ActiveDirectory" });
            using (var runSpace = RunspaceFactory.CreateRunspace(connectionInfo))
            {
                runSpace.InitialSessionState = init_state;
                var p = runSpace.CreatePipeline();
                runSpace.Open();
                var command = new Command("Set-ADUser");
                command.Parameters.Add("ScriptPath", "logonScript.bat");
                command.Parameters.Add("Identity", "test.com/Users/Test760 Blah760");
                p.Commands.Add(command);

                var returnValue = p.Invoke();
                foreach (var v in returnValue)
                    Console.WriteLine(v.ToString());
            }


            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }
    }
}

此外,我们还尝试使用“dsadd”命令代替“Set-ADUser”命令。如果我们不带任何参数调用“dsadd”,它将返回它的帮助信息。但是,如果我们尝试传递任何参数,它不会抛出任何错误,但它似乎也不会执行命令。有谁知道如何从 Pipeline 对象调用“dsadd”命令?

using (var runSpace = RunspaceFactory.CreateRunspace(connectionInfo))
{
    runSpace.InitialSessionState = init_state;
    var p = runSpace.CreatePipeline();
    runSpace.Open();

    Command cmd = new Command("dsadd");
    cmd.Parameters.Add("ou", "\"OU=test5,OU=Users,DC=test,DC=com\"");

    var returnValue = p.Invoke();
    foreach (var v in returnValue)
        Console.WriteLine(v.ToString());
}

附加信息:术语“Set-ADUser”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确并重试。

        var p = runSpace.CreatePipeline();
        runSpace.Open();
        Command com1 = new Command("Import-Module");
        com1.Parameters.Add("Name", "ActiveDirectory");
        p.Commands.Add(com1);
        Command command = new Command("Set-ADUser");
        command.Parameters.Add("Identity", "tuser19");
        command.Parameters.Add("ScriptPath", "logonScript.bat");
        p.Commands.Add(command);
        var returnValue = p.Invoke();
4

2 回答 2

0

再次尝试该Import-Module命令,但不要将参数与命令名称混合,即将参数分开并通过参数集合添加:

var command = new Command('Import-Module').Parameters.Add('Name', 'ActiveDirectory');

此外,请确保 ActiveDirectory 模块位于远程计算机上。如果该模块仅加载到特定的位控制台(32 位或 64 位),请确保您使用的是相应的远程处理端点。

于 2013-07-16T16:54:36.403 回答
0

试试这个代码。它对我有用

        InitialSessionState iss = InitialSessionState.CreateDefault();
        iss.ImportPSModule(new String[] { @"<Module name or module path>" });


        using (Runspace runspace = RunspaceFactory.CreateRunspace(iss))
        {
        }
于 2015-12-15T06:08:06.583 回答