Exchange управляемая оболочка из C#
Я пытаюсь запустить следующий скрипт удаленно с клиентского компьютера:
Get-Mailbox | foreach {Get-InboxRule -Mailbox $ _. Имя | Remove-InboxRule }
Вот мой код:
private const string SHELL_URI = "http://schemas.microsoft.com/powershell/Microsoft.Exchange";
static public void RunPowerShellScript(string scriptfile, List<CommandParameter> cmdList, string runasUsername, string runasPassword, string serverIP)
{
// Prepare the credentials that will be used when connecting
// to the server. More info on the user to use on the notes
// below this code snippet.
System.Uri serverUri = new Uri(String.Format("http://{0}/POWERSHELL?serializationLevel=Full", serverIP));
System.Security.SecureString securePassword = new System.Security.SecureString();
foreach (char c in runasPassword.ToCharArray())
{
securePassword.AppendChar(c);
}
System.Management.Automation.PSCredential creds = new System.Management.Automation.PSCredential(runasUsername, securePassword);
RunspaceConfiguration rc = RunspaceConfiguration.Create();
WSManConnectionInfo wsManInfo = new WSManConnectionInfo(serverUri, SHELL_URI, creds);
wsManInfo.AuthenticationMechanism = AuthenticationMechanism.Basic;
RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create();
Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration);
runspace.Open();
RunspaceInvoke scriptInvoker = new RunspaceInvoke(runspace);
Pipeline pipeline = runspace.CreatePipeline();
//Here's how you add a new script with arguments
Command myCommand = new Command(scriptfile, true);
if(cmdList != null)
{
foreach (var cmd in cmdList)
myCommand.Parameters.Add(cmd);
}
pipeline.Commands.Add(myCommand);
// Execute PowerShell script
var results = pipeline.Invoke();
}
В результате последняя строка выдает исключение:
Термин "Get-Mailbox" не распознается как имя командлета, функции, файла сценария или работоспособной программы. Проверьте правильность написания имени или, если путь был указан, проверьте правильность пути и повторите попытку.
Я знаю, что я использую PowerShell там, а не ExchangeManagedShell. Я пытался добавить оснастку так:
RunspaceConfiguration rsConfig = RunspaceConfiguration.Create();
PSSnapInException snapInException = null;
PSSnapInInfo info = rsConfig.AddPSSnapIn("Microsoft.Exchange.Management.PowerShell.Admin", out snapInException);
Runspace myRunSpace = RunspaceFactory.CreateRunspace(rsConfig);
myRunSpace.Open(rsConfig);
но на клиентском компьютере нет ExchangeManagedShell.
PS Я пытаюсь подключиться к Exchange2013.
Что я делаю не так?
[ВЫПУСК № 1]
О, я узнал, что я делаю не так:
WSManConnectionInfo wsManInfo = new WSManConnectionInfo(serverUri, SHELL_URI, creds);
wsManInfo.AuthenticationMechanism = AuthenticationMechanism.Basic;
RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create();
Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration);
runspace.Open();
Я даже не подключаюсь к удаленному компьютеру. Создание wsManInfo, но не используйте его в RunspaceFactory.CreateRunspace();,
Но я до сих пор не знаю, как решить проблему...
2 ответа
Решение простое. Просто нужно было написать это
System.Uri serverUri = new Uri(String.Format("https://{0}/POWERSHELL/Microsoft.Exchange", serverIP));
вместо этого
System.Uri serverUri = new Uri(String.Format("http://{0}/POWERSHELL?serializationLevel=Full", serverIP));
Только что добавил "Microsoft.Exchange"
Вы проверили, имеют ли используемые вами учетные данные право вызывать команду "Get-Mailbox"? Если нет, учетная запись должна быть предоставлена привилегия для выполнения команды через RBAC.