C#无法为Powershell远程使用加载ActiveDirectory模块

时间:2015-02-18 00:50:21

标签: c# powershell active-directory remote-access

我正在尝试远程执行一些非常简单的Powershell / ActiveDirectory cmdlts,但我无法加载ActiveDirectory模块。我尝试过几个不同的东西,包括在加载模块的远程服务器上注册一个远程shell,但我也无法做到这一点。

什么有效:远程设置有效。我的C#代码可以连接到远程计算机并执行Exchange命令,例如 New-Mailbox 。但是,我无法执行 Add-ADGroupMember 之类的命令。

如果我登录到远程计算机,我可以验证所有Powershell cmdlts是否可用, Exchange和AD 。所以我知道如果我刚刚登陆Powershell,他们就可以在远程机器上工作了。

尝试执行 Add-ADGroupMember 会给我一个错误,即它无法识别为cmdlet。这表明,我没有加载ActiveDirectory模块。但是,如果我尝试导入它,就像这样:

ps.Commands.AddCommand("Import-Module").AddArgument("ActiveDirectory");

此命令失败,并显示“Import-Module”一词也不是可识别的cmdlet。

我还尝试连接到专门加载ActiveDirectory模块的shellURI,但它无法连接。我收到一个错误,即在WS-Management目录中找不到资源URI。

这也带来了另一件奇怪的事情;我不明白为什么我无法连接到远程Powershell中列出的资源URI。如果我执行PS_GetSessionConfiguration,我会看到以下内容:

ADExchange(我自己的定制) Microsoft.Powershell Microsoft.Powershell.Workflow Microsoft.Powershell32 Microsoft.ServerManager

但是,我无法连接到其中任何一个。当我设置我的连接信息对象时,我必须使用以下URI:

string shell = "http://schemas.microsoft.com/powershell/Microsoft.Exchange";

所有其他URI都失败了。那是为什么?

无论如何,这里有一些代码:

using (Runspace runspace = RunspaceFactory.CreateRunspace(connInfo))
            {

                runspace.Open();

                using (PowerShell ps = PowerShell.Create())
                {
                    ps.Runspace = runspace;

                    Pipeline pipe = runspace.CreatePipeline();

                    ps.Commands.AddCommand("Import-Module").AddArgument("ActiveDirectory");
                    ps.Invoke();

                    ps.Commands.AddCommand(CreateNewUserCommand());
                    ps.Commands.AddCommand(CreateAddGroupCommand("FacnStaff"));
                    //ps.Commands.AddCommand(CreateAddGroupCommand("AllFacStaff"));
                    //ps.Commands.AddCommand(CreateAddGroupCommand("PasswordManagerFacStaff"));

                    results = ps.Invoke();
                }
            }

第一个命令CreateNewUserCommand执行“New-Mailbox”。如果我注释掉其他命令,这将单独工作。

其他命令都做了一些变化:

  private Command CreateAddGroupCommand(string group)
        {
            var command = new Command("Add-ADGroupMember");
            command.Parameters.Add("Identity", group);
            command.Parameters.Add("Members", _username);

            return command;
        }

所以我的问题:

1)我无法远程运行AD Powershell命令 2)我无法远程加载ActiveDirectory模块 3)我无法连接到不同的Powershell shell配置

请帮忙

1 个答案:

答案 0 :(得分:0)

所有症状都指向远程shell被限制为NoLanguage模式。这对于Exchange远程会话来说是正常的。您在该会话中唯一可以执行的是Exchange cmdlet。没有其他cmdlet甚至基本语言元素可用(您甚至无法创建变量)。

Shay Levy撰写了一篇文章,描述您为完全语言模式重新配置这些会话以解决这些限制。

get-full-control-over-your-exchange-remote-powershell-session