Estoy tratando de ejecutar un script de PowerShell desde el código C#, pero tengo algunos problemas (quizás ambientales):
En una máquina donde intento ejecutarlo, ocurre lo siguiente:
Set-ExecutionPolicy: Windows PowerShell actualizó correctamente su política de ejecución, pero la configuración se anula con una política definida en un ámbito más específico. Debido a la anulación, su shell conservará su actual política de ejecución efectiva de RemoteSigned. Escriba "Get-ExecutionPolicy -List" para ver la configuración de su política de ejecución. Para obtener más información, consulte "Get-Help Set-ExecutionPolicy". En línea:1 char:46 + if((Get-ExecutionPolicy ) -ne 'AllSigned') { Set-ExecutionPolicy -Scope Process ... + ~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ + Información de categoría: Permiso denegado: (:) [Establecer política de ejecución], SecurityException + Id. de error totalmente calificado: ExecutionPolicyOverride, Microsoft.PowerShell.Commands.SetExecutionPolicyCommand
Get-ExecutionPolicy-List
Scope ExecutionPolicy ----- --------------- MachinePolicy Unrestricted UserPolicy Undefined Process Bypass CurrentUser Unrestricted LocalMachine UnrestrictedCreo que esto es ambiental porque:
if (File.Exists("Start.ps1")) { string strCmdText = Path.Combine(Directory.GetCurrentDirectory(), "Start.ps1"); var process = System.Diagnostics.Process.Start(@"C:\windows\system32\windowspowershell\v1.0\powershell.exe ", strCmdText); process.WaitForExit(); }El guión en sí es irrelevante, ya que lo he cambiado a un simple
Write-Host "Hello" $d=Read-Hosty tengo el mismo problema.
El problema estaba en la ruta del script. Tenía espacios en esta máquina en particular y no había manejado eso.
La ventana se cerró demasiado rápido para ver cualquier error, pero la configuración
process.StartInfo.RedirectStandardOutput = true;me ayudó a atraparlo.
La política de ejecución no tuvo nada que ver con mi error.
Para solucionarlo, cambié la ruta en el código c# como se explica aquí: Ejecutar un script de Powershell en CMD.EXE desde una ubicación con "Caracteres ilegales en la ruta"
Código completo:
if (File.Exists("Start.ps1")) { File.GetAttributes("Start.ps1"); string strCmdText = Path.Combine(Directory.GetCurrentDirectory(), "Start.ps1"); var process = new Process(); process.StartInfo.UseShellExecute = false; process.StartInfo.RedirectStandardOutput = true; process.StartInfo.FileName = @"C:\windows\system32\windowspowershell\v1.0\powershell.exe"; process.StartInfo.Arguments = "\"&'"+strCmdText+"'\""; process.Start(); string s = process.StandardOutput.ReadToEnd(); process.WaitForExit(); using (StreamWriter outfile = new StreamWriter("StandardOutput.txt", true)) { outfile.Write(s); } }A medida que enumera las políticas, aparentemente hay una política de grupo implementada contra su computadora (incluso si no está en el dominio, todavía hay un GP local vigente) que cambia MachinePolicy , que es sobre todas las políticas establecidas localmente a "RemoteSigned", que es política más fuerte que "Sin restricciones" en términos de ejecución de código. Si su PC está en un dominio, puede ejecutar el "Conjunto resultante de políticas (registro)" como administrador local y obtener la política de dominio que afecta a su PC. De lo contrario, ejecute la Política de seguridad local desde el Panel de control/Herramientas administrativas y navegue por "Configuración de la computadora - Plantillas administrativas - Componentes de Windows - Windows PowerShell" y verifique el valor de las políticas allí ("Habilitar ejecución de escenario" - traducido aproximadamente del localizado), y si necesario, puede cambiar el valor allí. Después de hacerlo, vuelva a cargar Powershell.