2016-03-07 4 views
0

Я создаю приложение C#, которое должно запускать скрипты powershell.Windows Server 2012 - Доступ к реестру запрещен при запуске сценариев PowerShell с C#

Хотя приложение хорошо работает на всех компьютерах моих коллег, у меня есть проблема с тем, чтобы он работал правильно на виртуальной машине Windows Server 2012.

Всякий раз, когда я бег сценария через приложение я получаю следующее сообщение об ошибке:

доступ к ключу реестра 'HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 1 \ ShellIds \ Microsoft.PowerShell' является отказано. Чтобы изменить политику выполнения для области по умолчанию (LocalMachine), запустите Windows PowerShell с параметром «Запуск от имени администратора». Чтобы изменить политику выполнения для текущего пользователя, запустите «Set-ExecutionPolicy -Scope CurrentUser».

Я точен, что я прошел через много тем и пытался много вещей, которые не решить мою проблему я попробовал:

установка ExecutionPolicy неограниченный

Set-ExecutionPolicy неограниченный -Scope -CurrentUser

и, конечно, я запустил эти команды на обоих x64 и x86 случаях Powershell (работа Powershell приложения от имени администратора)

Теперь странная часть заключается в том, что я без проблем запускаю скрипт через окно powershell непосредственно, ошибка возникает только при запуске скрипта через приложение C#.

Вот код участвуют:

public static List<string> RunPowerShellScript(Sequence sq, Script script) 
    { 
     try 
     { 
      script.Results = new List<Result>(); 

      Runspace runspace = RunspaceFactory.CreateRunspace(); 
      runspace.Open(); 
      RunspaceInvoke runspaceInvoker = new RunspaceInvoke(runspace); 
      //runspaceInvoker.Invoke("set-executionpolicy bypass"); 
      runspaceInvoker.Invoke("set-executionpolicy unrestricted"); 

      //Create a pipeline to send variables 
      Pipeline pipeline = runspace.CreatePipeline(); 

      //Create a command 
      Command myCommand = new Command(Properties.Settings.Default.Scripts + "\\" + script.ScriptName + ".ps1", false); 
      foreach (Parameter p in script.Parameters) 
      { 
       CommandParameter param = new CommandParameter(p.ParameterName, sq.GetUpdatedParameter(p)); 
       myCommand.Parameters.Add(param); 
      } 

      pipeline.Commands.Add(myCommand); 

      //Return the output from the script 
      Collection<PSObject> returnObjects = pipeline.Invoke(); 
      runspace.Close(); 

      List<string> output = new List<string>(); 
      foreach (PSObject po in returnObjects) 
      { 
       if (po != null) 
        output.Add(po.ToString()); 
      } 

      return output; 
     } 
     catch(Exception e) 
     { 
      return new List<string> { e.Message, "1" }; 
     } 
    } 
+0

Это может быть связано с вами не в руме nning сценарий powershell в том же экземпляре, когда вы выполняете изменение политики выполнения, попробуйте 'powershell -ExecutionPolicy Bypass -File C: \ Path \ to \ Script'. Вы захотите запустить это как команду оболочки (CMD), а не команду powershell, и она откроет скрипт powershell. – Harvey

+0

Я не уверен, что вы предлагаете, должен ли я изменить свой код C# для запуска сценария из cmd вместо использования RunspaceFactory? Потому что это действительно работает с cmd, но это не ново, оно также работает из окон powershell, но не из приложения C#. – Marc

+0

Используйте 'System.Diagnostics.Process.Start (« CMD.exe », powershell -ExecutionPolicy Bypass -File C: \ Path \ to \ Script); '' Это откроет cmd и запустит скрипт Powershell с политикой выполнения bypassed – Harvey

ответ

0

может быть это может решить вашу проблему:

1- открыта "Visual Studio" аз администратор
2- открыть проектное решение с VisualStudio
3- запустить его

+0

К сожалению, сервер Windows не является машиной dev, и приложение должно запускаться без помощи визуальной студии – Marc

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