【问题标题】:c# remote powershell create AD/Exchange user account and modifyc#远程powershell创建AD/Exchange用户账号并修改
【发布时间】:2013-07-13 23:35:29
【问题描述】:

我们正在尝试在 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();

【问题讨论】:

    标签: c# powershell active-directory exchange-server


    【解决方案1】:

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

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

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

    【讨论】:

    • 我们仍然收到“找不到与参数 'activedirectory' 匹配的参数,而且我们验证了我们可以在目标服务器上运行命令。
    • 我的错,Parameters.Add() 需要两个值,参数名称和参数值。
    • 我们这个 :) 附加信息:术语“Set-ADUser”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确并重试。我在主帖中添加了代码
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-16
      • 2011-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多