系统相关
首页 > 系统相关> > 无法在C#中运行Disable-Mailbox Powershell

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

作者:互联网

我正在尝试在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-Mailbox,Get-Recipient时,我得到了积极的结果.

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

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.

为什么它识别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);
                    }
                }

解决方法:

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.

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

以足够的权限运行您的代码,它应该可以工作.

TechNet文章:Understanding Role Based Access Control

标签:powershell,exchange-server,c
来源: https://codeday.me/bug/20191110/2014740.html