2014-02-18 2 views
3

Я работаю над веб-службой 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 где угодно.

ответ

7

В итоге я получил поддержку от Microsoft, и они предоставили следующее решение, которое работает. Вместо подключения через сеанс удаленной Powerhell можно подключиться к локальной powershell, а затем импортировать удаленный сеанс. Это исправляет проблему.

Обработка ошибок не включена в примере ниже

var runspace = RunspaceFactory.CreateRunspace(); 
runspace.Open(); 

object psSessionConnection; 

// Create a powershell session for remote exchange server 
using (var powershell = PowerShell.Create()) 
{ 
    var command = new PSCommand(); 
    command.AddCommand("New-PSSession"); 
    command.AddParameter("ConfigurationName", "Microsoft.Exchange"); 
    command.AddParameter("ConnectionUri", new Uri(_exchangeConnectionUri)); 
    command.AddParameter("Authentication", "Kerberos"); 
    powershell.Commands = command; 
    powershell.Runspace = runspace; 

    // TODO: Handle errors 
    var result = powershell.Invoke(); 
    psSessionConnection = result[0]; 
} 

// Set ExecutionPolicy on the process to unrestricted 
using (var powershell = PowerShell.Create()) 
{ 
    var command = new PSCommand(); 
    command.AddCommand("Set-ExecutionPolicy"); 
    command.AddParameter("Scope", "Process"); 
    command.AddParameter("ExecutionPolicy", "Unrestricted"); 
    powershell.Commands = command; 
    powershell.Runspace = runspace; 

    powershell.Invoke() 
} 

// Import remote exchange session into runspace 
using (var powershell = PowerShell.Create()) 
{ 
    var command = new PSCommand(); 
    command.AddCommand("Import-PSSession"); 
    command.AddParameter("Session", psSessionConnection); 
    powershell.Commands = command; 
    powershell.Runspace = runspace; 

    powershell.Invoke() 
} 
+0

спасибо, была такая же проблема. Нужно ли мне запускать эти 3 [пользователя] для каждого сценария, который я хочу использовать? – Zakos

+1

Запуск этих 3 сеансов подготовит пробел для других команд. Первый занимает довольно много времени (около 5 секунд для нас), поэтому выполнить каждую команду нецелесообразно. Мы закончили тем, что сохранили пробел в статической переменной и повторно использовали его для новых команд. – andreas

+0

Внезапно, я получаю 0 результат при первом использовании-Invoke, поэтому psSessionConnection = result [0]; throw outOfRange expcetions, знаете ли вы, почему? – Zakos

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