2016-04-18 3 views
0

Я использую приведенный ниже код для подключения к office365 и получения информации о почтовом ящике с помощью C# с удаленной системой PowerShell.Подключение к удаленному серверу ps.outlook.com не удалось

strExchange2010PSURI = "https://ps.outlook.com/PowerShell-LiveID?PSVersion=3.0"; 
strAccountName = "[email protected]"; 
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(); 
     } 
    } 

} 

Он работает в моей среде разработки, но когда я пытаюсь то же самое в производстве я получаю «Подключение к удаленному серверу ps.outlook.com не удался со следующим сообщением об ошибке:. Доступ запрещен Для получения дополнительной информации см about_Remote_Troubleshooting Справка. ".

Может ли кто-нибудь помочь?

+0

брандмауэр между сервером и прод в Интернете? в целом, для серверов не обязательно иметь прямой доступ в Интернет – BugFinder

ответ

0

Похоже, механизм аутентификации не работает. Я хотел бы избежать использования 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 

т.д.

Смежные вопросы