【问题标题】:Running a Powershell script from c#从 c# 运行 Powershell 脚本
【发布时间】:2015-06-15 11:41:42
【问题描述】:

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

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

  1. PowerShell 以管理员身份启动和加载
  2. PowerShell 窗口立即关闭(显然)没有错误

注意事项:

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

Set-ExecutionPolicy:Windows PowerShell 成功更新了您的执行策略,但该设置被 在更具体的范围内定义的政策。由于覆盖,您的 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

我也有同样的问题。

【问题讨论】:

  • 你试过这个开关-NoProfile -ExecutionPolicy UnRestricted 吗?
  • @AramKocharyan 他设置了机器策略,不会这样做。
  • 将 GP 更改为 Unrestricted 以避免混淆。
  • 嗯。将脚本更改为Copy-Item 调用如何,以便您可以跟踪它是否确实执行了某些操作?可悲的是,虽然我可以在 Powershell 中模拟它,但无法测试 C# 代码。编辑:模拟,对于我的 PC,Powershell->Powershell 确实使用了测试脚本,也就是说,它等待 Read-Host 提供数据。
  • 请发布关于如何设置执行策略的确切代码,它是 C# 还是 Powershell 代码,以及它是如何调用的。您可能会忽略该错误,尤其是当您将政策设置为更严格的政策时。

标签: c# powershell


【解决方案1】:

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

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

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);
                }

            }

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我设置了机器策略,希望它能解决问题。这就是我注意到通过右键单击运行脚本会隐藏绕过的方式。将其设置为无限制并不能解决问题。
    猜你喜欢
    • 2019-09-30
    • 2021-09-11
    • 1970-01-01
    • 2014-07-23
    • 2014-09-12
    • 1970-01-01
    • 2021-08-16
    • 2017-08-17
    • 1970-01-01
    相关资源
    最近更新 更多