Ошибка выполнения командлетов Powershell с использованием C # - PullRequest
4 голосов
/ 04 июля 2011

У меня есть следующий код, который я протестировал и работает:

    using (new Impersonator("Administrator", "dev.dev", #########"))
    {
        RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create();
        Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration);

        runspace.Open();

        RunspaceInvoke scriptInvoker = new RunspaceInvoke(runspace);
        scriptInvoker.Invoke("Set-ExecutionPolicy Unrestricted");

        Pipeline pipeline = runspace.CreatePipeline();
        Command myCmd = new Command(@"C:\test.ps1");
        myCmd.Parameters.Add(new CommandParameter("upn", upn));
        myCmd.Parameters.Add(new CommandParameter("sipAddress", sipAddress));
        pipeline.Commands.Add(myCmd);

        // Execute PowerShell script
        Collection<PSObject> results = pipeline.Invoke();
    }

Однако, когда я пытаюсь включить функцию в другой проект, чтобы она вызывалась из веб-службы, она вызывает исключение:

    System.Management.Automation.CmdletInvocationException: Access to the registry key 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell' is denied. ---> System.UnauthorizedAccessException: Access to the registry key 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell' is denied.

Понятия не имею, почему это происходит.Любая помощь будет оценена.

Ответы [ 2 ]

8 голосов
/ 04 июля 2011

Происходит то, что Impersonator олицетворяет только поток, а область выполнения PowerShell работает в другом потоке.

Чтобы сделать эту работу, необходимо добавить:

runspace.ApartmentState = System.Threading.ApartmentState.STA;
runspace.ThreadOptions = System.Management.Automation.Runspaces.PSThreadOptions.UseCurrentThread;

как раз перед тем, как открыть пространство выполнения.

Это заставит пространство выполнения работать в том же потоке, что и олицетворенный токен.

Надеюсь, это поможет,

1 голос
/ 25 июня 2014

Используйте эти пространства имен:

using System.Management.Automation;
using System.Management.Automation.Runspaces;
using System.Threading;

Создание пространства выполнения с InitialSessionState

InitialSessionState initialSessionState = InitialSessionState.CreateDefault();
initialSessionState.ApartmentState = ApartmentState.STA;
initialSessionState.ThreadOptions = PSThreadOptions.UseCurrentThread;

using ( Runspace runspace = RunspaceFactory.CreateRunspace ( initialSessionState ) )
{
  runspace.Open();

  // scripts invocation                 

  runspace.Close();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...