从c#运行Powershell脚本

我试图从C#代码运行PowerShell脚本,但我遇到了一些(也许是环境)问题:

在我试图运行它的机器上,会发生以下情况:

  • PowerShell启动并以管理员身份加载
  • PowerShell窗口立即关闭(显然)没有错误
  • 笔记:

  • 该脚本起作用。 当我从ISE运行它时,它运行时没有错误。
  • 如果我右键单击该脚本并选择“使用PowerShell运行”,即使我未在脚本中更改它,我也会收到执行策略错误。

  • Set-ExecutionPolicy:Windows PowerShell成功更新了您的执行策略,但该设置被在更具体范围内定义的策略覆盖。 由于覆盖,您的shell将保留其当前有效的RemoteSigned执行策略。 键入“Get-ExecutionPolicy -List”查看您的执行策略设置。 有关更多信息,请参阅“Get-Help Set-ExecutionPolicy”。 在行:1 char: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:windowssystem32windowspowershellv1.0powershell.exe ", strCmdText);
        process.WaitForExit();
    }
    

    脚本本身并不重要,因为我已将它改为简单

    Write-Host "Hello"
    $d=Read-Host
    

    和我有同样的问题。


    问题出在脚本的路径上。 它在这台机器上有空间,我没有处理。

    窗户关闭太快,看不到任何错误,但设置

    process.StartInfo.RedirectStandardOutput = true;
    

    帮我抓住了它。

    执行政策与我的错误没有任何关系。

    为了解决这个问题,我改变了C#代码的路径,就像这里解释的一样:在CMD.EXE中从一个位置用“非法字符在路径中”执行一个Powershell脚本

    完整的代码:

    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:windowssystem32windowspowershellv1.0powershell.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);
                    }
    
                }
    

    当您列出这些策略时,显然存在针对您的计算机实施的组策略(即使它不在域中,仍然存在本地GP),这会将MachinePolicy首先是本地设置的策略)更改为“RemoteSigned”,即在代码执行方面比“无限制”更强大的策略。 如果您的PC在一个域中,您可以运行“结果设置策略(日志记录)”作为本地管理员,并获取影响您PC的域策略。 如果没有,请从控制面板/管理工具运行本地安全策略并浏览“计算机配置 - 管理模板 - Windows组件 - Windows PowerShell”并检查策略的值(“启用场景执行” - 粗略翻译为本地化),并且如果需要的话,你可以改变那里的值。 做完之后,重新加载Powershell。

    链接地址: http://www.djcxy.com/p/29087.html

    上一篇: Running a Powershell script from c#

    下一篇: Unable to run powershell script on all machines in network from server machine