从C#powershell启用邮箱

时间:2017-08-20 03:16:29

标签: c# visual-studio powershell iis exchange-server

在Visual Studio中以调试模式运行时,为本地交换服务器启用邮箱的代码工作,但在同一实例上的IIS上部署时失败。这些命令也可以在Powershell控制台中运行 它抛出异常无法连接到服务器访问被拒绝。

有人可以帮助我吗?

PFB从Visual Studio调试模式运行时完全正常运行的代码段,从IIS上部署的代码运行时运行失败

 string connectionUri = strConURI;
  string loginPassword = Pwd;
           SecureString secpassword = new SecureString();
           foreach (char c in loginPassword)
           {
               secpassword.AppendChar(c);
           }
           PSCredential credential = new PSCredential(Usercred, secpassword);

            Runspace runspace = System.Management.Automation.Runspaces.RunspaceFactory.CreateRunspace();
            PowerShell powershell = PowerShell.Create();

           PSCommand command = new PSCommand();
            command.AddCommand("New-PSSession");
            command.AddParameter("ConfigurationName", "Microsoft.Exchange");
            command.AddParameter("ConnectionUri", new Uri(connectionUri));
            command.AddParameter("Credential", credential);
            command.AddParameter("Authentication", "Basic");
        //    command.AddCommand("Set-ExecutionPolicy RemoteSigned");
            powershell.Commands = command;


            runspace.Open();
            powershell.Runspace = runspace;
            Collection<System.Management.Automation.PSObject> 
                result = powershell.Invoke();

            if (powershell.Streams.Error.Count > 0 || result.Count != 1)
            {

                throw new Exception("failed");
            }


                powershell = PowerShell.Create();
                command = new PSCommand();
                command.AddCommand("Invoke-Command");

                const String ScriptBlock = "Get-User {0} | Enable-RemoteMailbox -RemoteRoutingAddress {1};";
               String ScriptBlockstr = string.Format(ScriptBlock, GetUser, MailboxUser);

               command.AddParameter("ScriptBlock", System.Management.Automation.ScriptBlock.Create(ScriptBlockstr));
                command.AddParameter("Session", result[0]);

               powershell.Commands = command;
                powershell.Runspace = runspace;
                var mailBoxes = powershell.Invoke();

1 个答案:

答案 0 :(得分:1)

由于我们不知道如何配置MS Exchange服务器以及如何触发应用程序,因此不容易对其进行故障排除。

首先请注意,根据您的配置,您可以使用端口5985(http WinRM),5986(https WinRM)或443或80(如Microsoft here所述)或您可能拥有的任何端口配置。当您使用New-PsSession时,使用ComputerName 5985/5986。如果您使用ConnectionURI,则使用端口80或443(有关更多信息,请参阅here)。

在您的脑海中,现在要检查一些基本的故障排除步骤:

  1. 检查您是否使用https或http作为ConnectionUri,以及它们之间是否存在差异以及是否按预期工作
  2. 最好的方法是使用https(通过ComputerName或ConnectionURI)来消除强制https的任何“安全实施”问题,然后在尝试绕过https时中断。要为winRM配置https(通过5986),请使用(查看here以获取更多详细信息):
  3. winrm quickconfig -transport:https

    因为如果使用WinRM并且HTTPS不是传输,则必须在可信主机列表中配置目标远程计算机(有关更多信息,请参见下文和here)。

    1. 如果您使用https(通过ComputerName或ConnectionURI),请确保运行解决方案的服务器信任该连接。如果您使用的是ConnectionURI,请在非Exchange服务器的浏览器中输入URL,并检查是否存在任何SSL证书问题。确保您在此处使用完全合格的域名。
    2. 如果您在非Exchange Server上配置了代理,请确保您的连接绕过代理(请参阅here)以避免尝试通过代理进行连接,这不是您的方式喜欢有。
    3. 使用telnet检查从受影响的服务器到MS Exchange Server的端口是否已打开(请参阅该帖子顶部的端口信息)
    4. 根据您的配置,您可能需要使用不同的身份验证(例如Negotiate,Basic,Kerberos,...)。确保您在此处使用正确的身份验证。请注意,Kerberos仅适用于域上下文,这意味着必须将非Exchange服务器添加到同一ActiveDirectory域中!要测试连接,您可以使用powershell(通过以不同用户身份运行),并且您可能还会在此连接检查期间绕过一些SSL验证检查(SkipCACheck,SkipCNCheck,SkipRevocationCheck)。请参阅下面的一些示例(更多信息here),同时查看http和https选项:
    5. $UserCredential = Get-Credential $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://<FQDN of Exchange Mailbox server>/PowerShell/ -Authentication Negotiate -Credential $UserCredential -SkipCACheck -SkipCNCheck -SkipRevocationCheck Import-PSSession $Session

      或者,如果您知道应该使用哪种身份验证,请使用:

      $UserCredential = Get-Credential $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://<FQDN of Exchange Mailbox server>/PowerShell/ -Authentication Kerberos -Credential $UserCredential -SkipCACheck -SkipCNCheck -SkipRevocationCheck Import-PSSession $Session

      $UserCredential = Get-Credential $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://<FQDN of Exchange Mailbox server>/PowerShell/ -Authentication Basic -Credential $UserCredential -SkipCACheck -SkipCNCheck -SkipRevocationCheck Import-PSSession $Session

      1. 是否为您正在使用的taskuser启用了远程PowerShell?
      2. Set-User YourTaskUser -RemotePowerShellEnabled $True

        1. 确保根据您的需要配置了MS Exchange powershell目录(例如,配置了预期的身份验证方法)。从:
        2. 开始

          Get-PowerShellVirtualDirectory "Exchange2010\PowerShell (Default Web Site)"

          1. 在大多数情况下,您将能够使用其他域中的远程计算机。但是,如果远程计算机不在受信任的域中,则远程计算机可能无法验证您的凭据。要启用身份验证,您需要将远程计算机添加到WinRM中本地计算机的可信主机列表中(请参阅here)。为此,请键入:

            winrm s winrm/config/client '@{TrustedHosts="RemoteComputer"}'

          2. 检查身份验证(= Basic)是否已更改或者AllowUnencrypted是否设置为true。两者都不是默认设置,如果完成可能会导致意外问题(除了限制安全性的事实)。

          3. 您还可以使用Test-WSMan检查基本和/或kerberos身份验证是否按预期工作(通过http或https以及您配置/使用的WinRM端口)。以下是一些例子:

          4. Test-WSMan -ComputerName https://server2008:5986 -Auth basic -Cred B\MY_USER_NAME

            和/或

            Test-WSMan -ComputerName https://server2008:5986 -Auth kerberos

            1. 使用WinRM时,请确保将taskuser添加到本地操作系统WinRMRemoteWMIUsers组,因为默认WinRM仅限于该组中的用户或本地管理组中的用户(请参阅here)。 / LI>