Попробуйте выполнить свой шаг Set-ExecutionPolicy -Scope CurrentUser
в пространстве выполнения, как это.
Во-первых, с моим ExecutionPolicy для этого пользователя в Restricted, и я вижу следующую ошибку при запуске этого кода:
RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create();
using (Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration))
{
runspace.Open();
RunspaceInvoke scriptInvoker = new RunspaceInvoke(runspace);
//scriptInvoker.Invoke("Set-ExecutionPolicy Unrestricted -Scope CurrentUser ");
Pipeline pipeline = runspace.CreatePipeline();
Command scriptCommand = new Command("C:\\temp\\test.ps1");
Collection<CommandParameter> commandParameters = new Collection<CommandParameter>();
pipeline.Commands.Add(scriptCommand);
Collection<PSObject> psObjects;
psObjects = pipeline.Invoke();
}
RunspaceInvoke scriptInvoker = new RunspaceInvoke(runspace);
scriptInvoker.Invoke("Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted");
дает мне
System.Management.Automation.PSSecurityException: «Файл C: \ temp \ test.ps1 не может быть загружен, так как в этой системе отключены запущенные сценарии. Для получения дополнительной информации см. About_Execution_Policies по адресу https: /go.microsoft.com/fwlink/? LinkID = 135170. '
Далее я перезапускаю ее, раскомментируя эту строку:
scriptInvoker.Invoke("Set-ExecutionPolicy Unrestricted -Scope CurrentUser ");
И без ошибок! Однако это изменит пользователей ExecutionPolicy , что, на мой взгляд, является плохим поведением, поэтому вместо этого я собираюсь обернуть свою функцию этим и установить Users ExecutionPolicy обратно так, как я его нашел.
using (Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration))
{
runspace.Open();
RunspaceInvoke scriptInvoker = new RunspaceInvoke(runspace);
scriptInvoker.Invoke("$ExecutionPolicy = Get-ExecutionPolicy -Scope CurrentUser");
scriptInvoker.Invoke("Set-ExecutionPolicy Unrestricted -Scope CurrentUser ");
Pipeline pipeline = runspace.CreatePipeline();
Command scriptCommand = new Command("C:\\temp\\test.ps1");
Collection<CommandParameter> commandParameters = new Collection<CommandParameter>();
pipeline.Commands.Add(scriptCommand);
Collection<PSObject> psObjects;
psObjects = pipeline.Invoke();
scriptInvoker.Invoke("Set-ExecutionPolicy -Scope CurrentUser $ExecutionPolicy -Force");
}
Теперь наша функция работает, и мы не вмешиваемся в системные настройки пользователя.