Я работаю над веб-службой C#, которая будет развернута на сервере Exchange 2013. Эта служба будет отвечать за запуск команд powershell для настройки Exchange.Powershell to Exchange 2013 - ошибка режима ограниченного языка
подключает через созданное как пространство выполнения этой
const string shellUri = "http://schemas.microsoft.com/powershell/microsoft.exchange";
var uri = new Uri(_exchangeConnectionUri);
var credentials = (PSCredential)null; // Windows authentication
var connectionInfo = new WSManConnectionInfo(uri, shellUri, credentials);
connectionInfo.AuthenticationMechanism = AuthenticationMechanism.Kerberos;
var runspace = RunspaceFactory.CreateRunspace(connectionInfo);
Используя это пространство выполнения Я могу запустить основные команды Powershell на сервере.
get-mailbox -ResultSize unlimited
Но работает более сложные команды дает мне ошибки (это работает, если запускать непосредственно через PowerShell)
get-mailbox -ResultSize unlimited | where {$_.emailaddresses -like "*test.com"}
At line:1 char:43
+ get-mailbox -ResultSize unlimited | where {$_.emailaddresses -like "*test.com ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Script block literals are not allowed in restricted language mode or a Data section.
At line:1 char:44
+ get-mailbox -ResultSize unlimited | where {$_.emailaddresses -like "*test.com ...
+ ~~~~~~~~~~~~~~~~~
Property references are not allowed in restricted language mode or a Data section.
At line:1 char:44
+ get-mailbox -ResultSize unlimited | where {$_.emailaddresses -like "*test.com ...
+ ~~
A variable that cannot be referenced in restricted language mode or a Data section is being referenced. Variables that can be referenced include the following: $PSCulture, $PSUICulture, $true, $false, and $null.
После поиска я обнаружил, что я мог бы зарегистрировать новый PSSessionConfiguration и убедитесь, что сценарии работают под PSLanguageMode = FullLanguage. See this post
Я попытался сделать это, но как только я сменил shellUri на http://schemas.microsoft.com/powershell/MyConfigName
, я получаю следующее сообщение об ошибке.
The WS-Management service cannot process the request.
Cannot find the MyConfigName session configuration in the WSMan: drive on the ComputerName computer.
Используя следующий shelllUri дал мне ту же ошибку http://schemas.microsoft.com/powershell/Microsoft.Powershell
Это привело меня попробовать следующий непосредственно через PowerShell на сервере обмена
> Get-PSSessionConfiguration | format-list -property name
result:
Name : MyConfigName
Name : microsoft.powershell
Name : microsoft.powershell.workflow
Name : microsoft.powershell32
Name : microsoft.windows.servermanagerworkflows
> $session = New-PSSession -ConfigurationName MyConfigName -ConnectionUri $uri -Authentication Kerberos
result:
error "Cannot find the MyConfigName session configuration in the WSMan: drive on the ComputerName computer."
> $session = New-PSSession -ConfigurationName Microsoft.Powershell -ConnectionUri $uri -Authentication Kerberos
result:
error "Cannot find the Microsoft.Powershell session configuration in the WSMan: drive on the ComputerName."
> $session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri $uri -Authentication Kerberos
result:
nothing, meaning $session variable set correctly
Как из C# код, я могу используйте конфигурацию Microsoft.Exchange, но эта конфигурация не существует в соответствии с Get-PSSessionConfiguration
, и конфигурации, которые существуют в этом списке, не будут работать.
Теперь мне интересно, как добавить конфигурацию с помощью FullLanguage, которую я могу использовать при вызове powershell из кода. Возможно, я тоже ошибаюсь, и моя проблема вообще не связана с PSSessionConfigurations, но я все же удивляюсь, почему я не вижу конфигурацию Microsoft.Exchange где угодно.
спасибо, была такая же проблема. Нужно ли мне запускать эти 3 [пользователя] для каждого сценария, который я хочу использовать? – Zakos
Запуск этих 3 сеансов подготовит пробел для других команд. Первый занимает довольно много времени (около 5 секунд для нас), поэтому выполнить каждую команду нецелесообразно. Мы закончили тем, что сохранили пробел в статической переменной и повторно использовали его для новых команд. – andreas
Внезапно, я получаю 0 результат при первом использовании-Invoke, поэтому psSessionConnection = result [0]; throw outOfRange expcetions, знаете ли вы, почему? – Zakos