C# 连接到远程服务器ps.outlook.com失败

C# 连接到远程服务器ps.outlook.com失败,c#,.net,powershell,C#,.net,Powershell,我使用下面的代码连接到office365,并使用带有远程powershell的c#检索邮箱信息 strExchange2010PSURI = "https://ps.outlook.com/PowerShell-LiveID?PSVersion=3.0"; strAccountName = "uuuu@kcstaff.onmicrosoft.com"; strAccountPwd = "ppp"; public DataTable GetMailboxes(string searchMailb

我使用下面的代码连接到office365,并使用带有远程powershell的c#检索邮箱信息

strExchange2010PSURI = "https://ps.outlook.com/PowerShell-LiveID?PSVersion=3.0";
strAccountName = "uuuu@kcstaff.onmicrosoft.com";
strAccountPwd = "ppp";

public DataTable GetMailboxes(string searchMailbox)
{
    DataTable dt = null;
    List<string> mailboxes = new List<string>();
    Command psCmd1 = new Command("Get-Mailbox");
    psCmd1.Parameters.Add(new CommandParameter("Identity", "*" + searchMailbox + "*"));
    Collection<PSObject> psExchMailboxInfo = fnGetPSData(psCmd1, null);

    if (psExchMailboxInfo != null && psExchMailboxInfo.Count > 0)
    {
//logic to get the mailbox details in a datatable
        dt = GetMailboxInfo(mailboxes);
    }

    return dt;
}

private Collection<PSObject> fnGetPSData(Command psCmd1, Command psCmd2)
{
    Pipeline psPipeLine = null;
    Runspace psRunSpace = null;
    WSManConnectionInfo psConnInfo = null;
    var varSecurePwd = new SecureString();
    try
    {
        foreach (var c in strAccountPwd)
        {
            varSecurePwd.AppendChar(c);
        }
        PSCredential psCreds = new PSCredential(strAccountName, varSecurePwd);
        psConnInfo = new WSManConnectionInfo(new Uri(strExchange2010PSURI), "Microsoft.Exchange", psCreds);
        psConnInfo.AuthenticationMechanism = AuthenticationMechanism.Basic;
        psRunSpace = RunspaceFactory.CreateRunspace(psConnInfo);

        psRunSpace.Open();
        psPipeLine = psRunSpace.CreatePipeline();

        if (psCmd1 != null)
        {
            psPipeLine.Commands.Add(psCmd1);
        }
        if (psCmd2 != null)
        {
            psPipeLine.Commands.Add(psCmd2);
        }
        Collection<PSObject> psObjects = psPipeLine.Invoke();

        return psObjects;
    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally
    {
        if (psPipeLine != null && psPipeLine.Commands != null)
        {
            psPipeLine.Commands.Clear();
            psPipeLine.Dispose();
        }

        if (psRunSpace != null)
        {
            psRunSpace.Close();
            psRunSpace.Dispose();
        }
    }

}
Strexchange2010 PSURI=”https://ps.outlook.com/PowerShell-LiveID?PSVersion=3.0";
strAccountName=”uuuu@kcstaff.onmicrosoft.com";
strAccountPwd=“ppp”;
公共数据表GetMailboxes(字符串搜索邮箱)
{
数据表dt=null;
列表邮箱=新列表();
命令psCmd1=新命令(“获取邮箱”);
psCmd1.Parameters.Add(新的CommandParameter(“标识”)、“*”+searchMailbox+“*”);
集合psExchMailboxInfo=fnGetPSData(psCmd1,null);
如果(psExchMailboxInfo!=null&&psExchMailboxInfo.Count>0)
{
//获取数据表中邮箱详细信息的逻辑
dt=GetMailboxInfo(邮箱);
}
返回dt;
}
私有集合fnGetPSData(命令psCmd1、命令psCmd2)
{
管道psPipeLine=null;
运行空间psRunSpace=null;
WSManConnectionInfo psConnInfo=null;
var varSecurePwd=new SecureString();
尝试
{
foreach(strAccountPwd中的var c)
{
varSecurePwd.AppendChar(c);
}
PSCredential psCreds=新PSCredential(strAccountName,varSecurePwd);
psConnInfo=新的WSManConnectionInfo(新的Uri(Strexchange2010 PSURI),“Microsoft.Exchange”,psCreds);
psconnfo.AuthenticationMechanism=AuthenticationMechanism.Basic;
psRunSpace=RunspaceFactory.CreateRunspace(psConnInfo);
psRunSpace.Open();
psPipeLine=psRunSpace.CreatePipeline();
如果(psCmd1!=null)
{
psPipeLine.Commands.Add(psCmd1);
}
如果(psCmd2!=null)
{
psPipeLine.Commands.Add(psCmd2);
}
集合psObjects=psPipeLine.Invoke();
返回psObjects;
}
捕获(例外情况除外)
{
掷骰子;
}
最后
{
if(psPipeLine!=null&&psPipeLine.Commands!=null)
{
psPipeLine.Commands.Clear();
psPipeLine.Dispose();
}
if(psRunSpace!=null)
{
psRunSpace.Close();
psRunSpace.Dispose();
}
}
}
它在我的开发环境中工作,但当我在生产环境中尝试同样的方法时,我得到“连接到远程服务器ps.outlook.com失败,错误消息如下:访问被拒绝。有关详细信息,请参阅关于远程\u疑难解答帮助主题。”


有人能帮忙吗?

似乎身份验证机制不起作用。我将避免使用ConnInfo,并在打开PSRunspace后尝试以下操作:

Command PSCredentialCommand = new Command("Set-Variable");
PSCredentialCommand.Parameters.Add("Name", "PSCredentials");
PSCredentialCommand.Parameters.Add("Value", pscreds);

pipeline.Commands.Add(PSCredentialCommand);
pipeline.Commands.AddScript(script);
其中脚本内容类似于:

$O365Session = New-PSSession -ConfigurationName 'Microsoft.Exchange' -ConnectionUri 'https://ps.outlook.com/powershell' -Credential $PSCredentials -Authentication 'Basic' -AllowRedirection
Import-PSSession $O365Session -AllowClobber | Out-Null

等等。

prod服务器和web之间的防火墙?毕竟,服务器不直接访问互联网是很常见的