Контроллер MVC с имитацией пространства выполнения - PullRequest
2 голосов
/ 01 февраля 2012

Попытка выполнить командлет Powershell с контроллера MVC 3, используя олицетворение, но продолжает получать «Запрошенный доступ к реестру не разрешен». исключение при вызове Runspace.Open ()

StringBuilder stringBuilder = new StringBuilder();   

RunspaceConfiguration rsConfig = RunspaceConfiguration.Create();

using (new Impersonator("username", "domain", "password"))
{
    Runspace runspace = RunspaceFactory.CreateRunspace(rsConfig);

    runspace.Open();

    Pipeline pipeLine = runspace.CreatePipeline();

    string script = "get-process";
    pipeLine.Commands.AddScript(script);

    Collection<PSObject> commandResults = pipeLine.Invoke();                

    foreach (PSObject obj in commandResults)
    {
        stringBuilder.AppendLine(obj.Properties["ProcessName"].Value.ToString());
    }

Отладка показывает, что ошибка реестра связана с попыткой чтения ключа реестра в HKCU \ Environment. Выполнение вышеуказанного без олицетворения работает успешно.

Примечание: здесь был найден класс олицетворения: http://platinumdogs.wordpress.com/2008/10/30/net-c-impersonation-with-network-credentials/

Любые идеи о том, почему это происходит или что можно сделать, чтобы решить эту проблему?

UPDATE:

После некоторого сна я решил, что перемещение Runspace.Open () над линией олицетворения позволит пространству выполнения получить доступ к необходимым данным реестра (переменным среды), и это действительно помогло.

Теперь код отлично работает со встроенными командлетами, но когда я загружаю «Microsoft.Exchange.Management.PowerShell.Admin» и пробую любой из командлетов Exchange, приложение вылетает.

1 Ответ

1 голос
/ 07 февраля 2012

Успех!

В случае, если это будет полезно для кого-то еще, вот как я заставил его работать:

  1. Установите инструменты управления Exchange
  2. Применить последний пакет обновления
  3. Убедитесь, что вы добавили параметр для контроллера домена (Microsoft - KB943937)
...