从c#调用Exchange命令行管理程序时出现连接错误

时间:2011-07-26 21:59:02

标签: c# cmdlets

解决SSL证书问题后,我得到一个奇怪的例外。请帮忙! 我的代码: PSCredential凭证=新PSCredential(“域\管理员”,securePwd);

    WSManConnectionInfo connectionInfo = new WSManConnectionInfo(new Uri("https://www.xxx.com/powershell"), "http://schemas.microsoft.com/powershell/Microsoft.Exchange", credential);
    Runspace runspace = System.Management.Automation.Runspaces.RunspaceFactory.CreateRunspace(connectionInfo);
    connectionInfo.AuthenticationMechanism = AuthenticationMechanism.Basic;
    using (runspace)
    {
        Collection<PSObject> psObject = GetUserInformation(10, runspace);

    }

public Collection GetUserInformation(int count,Runspace runspace)     {         使用(PowerShell powershell = PowerShell.Create())         {

        powershell.AddCommand("Get-Users");
        powershell.AddParameter("ResultSize", count);

        runspace.Open();//**error happens**

        powershell.Runspace = runspace;

        return powershell.Invoke();
    }
}

错误讯息: “连接到远程服务器失败,并显示以下错误消息:WinRM客户端无法处理请求.WinRM客户端尝试使用协商身份验证机制,但目标计算机(www.xxx.com:443)返回'访问权限拒绝'错误。更改配置以允许使用协商身份验证机制或指定服务器支持的身份验证机制之一。要使用Kerberos,请将本地计算机名称指定为远程目标。还要验证客户端计算机和目标要使用Basic,请将本地计算机名称指定为远程目标,指定基本身份验证并提供用户名和密码。“

我使用基本身份验证,并提供用户名和凭据,为什么说“尝试使用协商身份验证机制”?

3 个答案:

答案 0 :(得分:3)

首先,尝试在创建运行空间之前设置connectionInfo.AuthenticationMechanism属性。因此,在第一个代码段上交换第2行和第3行的顺序。

如果不能解决问题,请确保在PowerShell网站上启用了基本身份验证。

要执行此操作,您需要转到IIS管理器,站点,默认网站,PowerShell,选择身份验证功能,然后启用基本身份验证。

如果基本身份验证不是身份验证功能页面上的选项,则需要通过转到服务器管理器来安装它,在树视图的安全性节点下选择Web服务器角色,说“添加角色服务”,然后选择基本身份验证。

答案 1 :(得分:1)

除非在服务器上明确配置,否则在此方案中不允许使用基本身份验证...您可以在服务器端启用它或使用Kerberos / NTLM ...

有关详细信息,请参阅http://technet.microsoft.com/en-us/library/dd351136.aspxhttp://technet.microsoft.com/en-us/library/dd347642.aspx

答案 2 :(得分:0)

我可以总结一下使基本身份验证在域外的计算机上工作的步骤:

  • 在客户端和服务器上将Set-ExecutionPolicy设置为Unrestricted
  • 在客户端和服务器上正确配置TrustedHosts
  • 在客户端和服务器上启用基本身份验证
  • 确保在“Web服务器安全性(IIS)
  • 下安装基本身份验证角色”
  • 为PowerShell虚拟目录启用基本身份验证
  • 使用HTTP而不是https来访问服务器。

以下是工作代码:

PowerShell powershell = PowerShell.Create();
String pass = "password";
SecureString passSecure = new SecureString();
foreach (char c in pass.ToCharArray())
{
    passSecure.AppendChar(c);
}
PSCredential cred = new PSCredential("user", passSecure);

string schemaURI = "http://schemas.microsoft.com/powershell/Microsoft.Exchange";
Uri connectTo = new Uri("http://192.168.69.116/powershell/");            
WSManConnectionInfo connectionInfo = new WSManConnectionInfo(connectTo, schemaURI, cred);
connectionInfo.MaximumConnectionRedirectionCount = 5;
connectionInfo.AuthenticationMechanism = AuthenticationMechanism.Basic;
//connectionInfo.AuthenticationMechanism = AuthenticationMechanism.Default;
connectionInfo.SkipCACheck = true;
connectionInfo.SkipCNCheck = true;
connectionInfo.SkipRevocationCheck = true;
Runspace remoteRunspace=null;
try
{
   remoteRunspace = RunspaceFactory.CreateRunspace(connectionInfo);
   remoteRunspace.Open();
}
catch (Exception err)
{
    //Handle error 
}