我尝试使用C#代码运行PowerShell脚本,但我遇到了一些问题(可能是环境问题):
在我尝试运行它的机器上,会发生以下情况:
Set-ExecutionPolicy:Windows PowerShell已成功更新您的执行策略,但该设置被a覆盖 在更具体的范围内定义的政策。由于覆盖,您的shell将保持其当前有效执行 RemoteSigned政策。输入" Get-ExecutionPolicy -List"查看执行策略设置。有关更多信息,请 请参阅" Get-Help Set-ExecutionPolicy"。 在行:1字符:46 + if((Get-ExecutionPolicy)-ne' AllSigned'){Set-ExecutionPolicy -Scope Process ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:PermissionDenied:(:) [Set-ExecutionPolicy],SecurityException + FullyQualifiedErrorId:ExecutionPolicyOverride,Microsoft.PowerShell.Commands.SetExecutionPolicyCommand
Get-ExecutionPolicy -List
Scope ExecutionPolicy
----- ---------------
MachinePolicy Unrestricted
UserPolicy Undefined
Process Bypass
CurrentUser Unrestricted
LocalMachine Unrestricted
我认为这是环境因素:
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();
}
脚本本身无关紧要,因为我已将其更改为简单的
Write-Host "Hello"
$d=Read-Host
我也有同样的问题。
答案 0 :(得分:4)
问题出在脚本的路径上。它在这台特定的机器上有空间,我没有处理过。
窗口关闭太快,无法看到任何错误,但设置
process.StartInfo.RedirectStandardOutput = true;
帮助我抓住了它。
执行政策与我的错误无关。
要修复它,我改变了c#代码中的路径,如下所述:Executing a Powershell script in CMD.EXE from a location with "Illegal characters in path"
完整代码:
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);
}
}
答案 1 :(得分:0)
当您列出政策时,显然已针对您的计算机实施了一项组策略(即使它不在域中,仍然有本地GP生效)更改MachinePolicy
,这超出了所有本地设置的策略到“RemoteSigned”,这在代码执行方面比“Unrestricted”更强大。如果您的PC位于域中,则可以以本地管理员身份运行“策略的结果集(日志记录)”,并获取影响PC的域策略。如果没有,请从“控制面板”/“管理工具”运行“本地安全策略”,然后导航“计算机配置 - 管理模板 - Windows组件 - Windows PowerShell”并检查其中的策略值(“启用方案执行” - 大致从本地化翻译),如果需要,你可以改变那里的价值。完成后,重新加载Powershell。