Вероятно, это ошибка, связанная с powershell.Если вы запускаете код с удаленного компьютера (не сервера обмена), вам необходимо разрешить удаленный доступ PowerShell для данного пользователя и убедиться, что брандмауэр (-ы) разрешает подключения к серверу обмена через порт 80. На сервере Exchangeсервер:
Set-User –identity username –RemotePowershellEnabled $True
Пользователь также должен быть членом роли управления обменом, позволяющей создавать почтовые ящики.
Если вы используете балансировщик нагрузки и / или у вас есть группа доступности базы данных, вам может потребоваться настроить альтернативную учетную запись службы для включения аутентификации Kerberos.Подробнее см. http://technet.microsoft.com/en-us/library/ff808313.aspx.Я должен был включить это, чтобы заставить код работать в моей среде.Я немного изменил код, чтобы просто проверить, могу ли я запускать команды exchange powershell.Следующий код отвечает полным именем пользователя USERIDENT в случае успеха.
static void Main(string[] args)
{
SecureString password = new SecureString();
string str_password = "PASS";
string username = "domain\\user";
//FQDN is ofcourse the (fully qualified) name of our exchange server..
string liveIdconnectionUri = "http://SERVERFQDN/Powershell?serializationLevel=Full";
foreach (char x in str_password)
{
password.AppendChar(x);
}
PSCredential credential = new PSCredential(username, password);
WSManConnectionInfo connectionInfo = new WSManConnectionInfo((new Uri(liveIdconnectionUri)), "http://schemas.microsoft.com/powershell/Microsoft.Exchange", credential);
Runspace runspace = null;
PowerShell powershell = PowerShell.Create();
PSCommand command = new PSCommand();
command.AddCommand("Get-Mailbox");
command.AddParameter("Identity", "USERIDENT");
powershell.Commands = command;
try
{
connectionInfo.AuthenticationMechanism = AuthenticationMechanism.Default;
runspace = System.Management.Automation.Runspaces.RunspaceFactory.CreateRunspace(connectionInfo);
runspace.Open();
powershell.Runspace = runspace;
Collection<PSObject> commandResults = powershell.Invoke<PSObject>();
foreach (PSObject result in commandResults)
{
Console.WriteLine(result.ToString());
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
runspace.Dispose();
runspace = null;
powershell.Dispose();
powershell = null;
}
}