无法在C#中运行Disable-Mailbox Powershell

时间:2017-11-24 13:34:47

标签: c# powershell exchange-server

我试图在C#中重现以下工作的Powershell块。 我们正在连接Exchange2010实例。

$ExURI = "http://ExchangeUrl/PowerShell/"

$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri $ExURI -Authentication Kerberos
$userName = "patatem"

Import-PSSession $Session -AllowClobber -EA SilentlyContinue | Out-Null

Get-Recipient $userName

Disable-Mailbox -Identity $userName -Confirm:$False
#enable-mailbox -identity $userName -Alias $userName -database "AnExchangeDatabase"

remove-PSSession $Session  

我一直在按照此处引用的步骤进行操作:https://blogs.msdn.microsoft.com/wushuai/2016/09/18/access-exchange-online-by-powershell-in-c/

在以下代码块中,当我致电Get-MailboxGet-Recipient时,我得到了积极的结果。

调用Disable-Mailbox时,出现以下错误

  

术语'禁用 - 邮箱'不被识别为cmdlet的名称,   功能,脚本文件或可操作程序。检查拼写   名称,或者如果包含路径,请验证路径是否正确   再试一次。

为什么它会识别Get-Mailbox而不是Disable-Mailbox

(我已经尝试添加另一块代码来执行Powershell的导入会话部分,但这并没有改变任何内容。)

   public void EnableCommand(string identity, string database)
            {
                if (!string.IsNullOrWhiteSpace(identity))
                {
                    using (var runspace = RunspaceFactory.CreateRunspace())
                    {
                        runspace.Open();
                        var powershell = PowerShell.Create();

                        var command = new PSCommand();
                        command.AddCommand("New-PSSession");
                        command.AddParameter("ConfigurationName", "Microsoft.Exchange");
                        command.AddParameter("ConnectionUri", new Uri(Constants.DefaultOutLookUrl));
                        command.AddParameter("Authentication", "Kerberos");
                        powershell.Commands = command;

                        powershell.Runspace = runspace;
                        var result = powershell.Invoke();
                        if (powershell.Streams.Error.Count > 0 || result.Count != 1)
                        {
                            throw new Exception("Fail to establish the connection");
                        }

                        powershell = PowerShell.Create();
                        command = new PSCommand();
                        command.AddCommand("Invoke-Command");
                        command.AddParameter("ScriptBlock", System.Management.Automation.ScriptBlock.Create("Get-Mailbox"));
                        command.AddParameter("Session", result[0]);
                        powershell.Commands = command;
                        powershell.Runspace = runspace;
                        var mailBoxes = powershell.Invoke();

// This will give me a result
                        var returnValue = new StringBuilder();
                        foreach (var item in mailBoxes)
                        {
                            returnValue.AppendLine(item.ToString());
                        }


                        // check the other output streams (for example, the error stream)
                        if (powershell.Streams.Error.Count > 0)
                        {
                            returnValue.AppendLine($"{powershell.Streams.Error.Count} errors: ");
                            foreach (var err in powershell.Streams.Error)
                            {
                                returnValue.AppendLine($"{err.ToString()}");
                            }
                        }

// This will also work
                        powershell = PowerShell.Create();
                        command = new PSCommand();
                        command.AddCommand("Invoke-Command");
                        command.AddParameter("ScriptBlock", System.Management.Automation.ScriptBlock.Create("Get-Recipient SomeEmail"));
                        command.AddParameter("Session", result[0]);
                        powershell.Commands = command;
                        powershell.Runspace = runspace;
                        var mailBoxes2 = powershell.Invoke();

                        foreach (var item in mailBoxes2)
                        {
                            returnValue.AppendLine(item.ToString());
                        }


                        if (powershell.Streams.Error.Count > 0)
                        {
                            returnValue.AppendLine($"{powershell.Streams.Error.Count} errors: ");
                            foreach (var err in powershell.Streams.Error)
                            {
                              returnValue.AppendLine($"{err.ToString()}");
                            }
                        }

// this will give me The term 'Disable-Mailbox' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

                        powershell = PowerShell.Create();
                        command = new PSCommand();
                        command.AddCommand("Invoke-Command");
                        command.AddParameter("ScriptBlock", System.Management.Automation.ScriptBlock.Create("Disable-Mailbox -Identity patatem -Confirm:$False"));
                        command.AddParameter("Session", result[0]);
                        powershell.Commands = command;
                        powershell.Runspace = runspace;
                        var mailBoxes3 = powershell.Invoke();

                        foreach (var item in mailBoxes3)
                        {
                            returnValue.AppendLine(item.ToString());
                        }

                        // check the other output streams (for example, the error stream)
                        if (powershell.Streams.Error.Count > 0)
                        {
                            returnValue.AppendLine($"{powershell.Streams.Error.Count} errors: ");
                            foreach (var err in powershell.Streams.Error)
                            {
                              returnValue.AppendLine($"{err.ToString()}");
                            }
                        }

                        Console.WriteLine(returnValue);
                    }
                }

1 个答案:

答案 0 :(得分:3)

  

“禁用邮箱”一词未被识别为cmdlet的名称,   功能,脚本文件或可操作程序。检查拼写   名称,或者如果包含路径,请验证路径是否正确   再试一次。

如果尝试运行Disable-Mailbox - cmdlet的用户没有足够的权限来禁用邮箱(RBAC),则会发出此非特定错误消息。

运行具有足够权限的代码,它应该可以正常工作。

TechNet文章:Understanding Role Based Access Control