Я создаю приложение 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" };
}
}
Это может быть связано с вами не в руме nning сценарий powershell в том же экземпляре, когда вы выполняете изменение политики выполнения, попробуйте 'powershell -ExecutionPolicy Bypass -File C: \ Path \ to \ Script'. Вы захотите запустить это как команду оболочки (CMD), а не команду powershell, и она откроет скрипт powershell. – Harvey
Я не уверен, что вы предлагаете, должен ли я изменить свой код C# для запуска сценария из cmd вместо использования RunspaceFactory? Потому что это действительно работает с cmd, но это не ново, оно также работает из окон powershell, но не из приложения C#. – Marc
Используйте 'System.Diagnostics.Process.Start (« CMD.exe », powershell -ExecutionPolicy Bypass -File C: \ Path \ to \ Script); '' Это откроет cmd и запустит скрипт Powershell с политикой выполнения bypassed – Harvey