从c#运行Powershell脚本

时间:2015-06-15 11:41:42

标签: c# powershell

我尝试使用C#代码运行PowerShell脚本,但我遇到了一些问题(可能是环境问题):

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

  1. PowerShell以Admin
  2. 启动并加载
  3. PowerShell窗口立即关闭(显然),没有错误
  4. 注意:

    • 该脚本有效。当我从ISE运行它时,它运行没有错误。
    • 如果我右键单击该脚本并选择使用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
    

    我也有同样的问题。

2 个答案:

答案 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。