繁体   English   中英

在 C# 中检查 PowerShell 执行策略的最佳方法是什么?

[英]What is the best way to check PowerShell Execution Policy in C#?

当您在 PowerShell 中运行Get-ExecutionPolicy时,它会获取有效的执行策略 我需要知道在 C# 中获取该信息的最佳方式。 我不需要像许多其他关于 PowerShell 执行策略的问题一样知道如何更改它,我只需要知道如何在 C# 中获取它。

笔记:

  • PowerShell 执行策略仅适用于 Windows

  • 对于 Windows,下面的答案涵盖了两个 PowerShell 版本。


可以从boxdog在评论中指出的文档中推断出来,但要拼写出来:

using System;
using System.Management.Automation;

namespace demo
{
  class ConsoleApp {
    static void Main() {
      using (var ps = PowerShell.Create()) {
        var effectivePolicy = ps.AddCommand("Get-ExecutionPolicy").Invoke()[0].ToString();
        ps.Commands.Clear();
        Console.WriteLine("Effective execution policy: " + effectivePolicy);
      }
    }
  }
}

笔记:

  • 以上假设您使用的是 PowerShell SDK - 请参阅此答案以了解要添加到项目中的适当 NuGet 包。

  • 如果您使用的是PowerShell (Core) 7+ SDK,则需要考虑其他注意事项:

    • 类 Unix平台上,执行策略基本上不适用(报告了Unrestricted ,尽管实际上它是Bypass ),因此以下仅适用于 Windows:

    • 任何的LocalMachine范围 - 根据定义按需安装 - PowerShell (Core) 7+ 版本适用; 只有 - 如果已定义 - CurrentUser和基于 GPO 的策略(抢占前者)才可以。

  • 在 Windows 上:

    • 在没有定义相关执行策略的情况下, Restricted是默认设置,它绝对阻止脚本文件 ( .ps1 ) 的执行。

    • 如果您的应用程序需要在托管 PowerShell SDK 时执行.ps1文件,为了可预测的行为,最好设置执行策略,仅针对当前进程,如本答案所示。

最优雅的解决方案可能是在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell中获取ExecutionPolicy注册表项。 要使此解决方案正常工作,您的程序需要在与其运行的操作系统相同的体系结构(x64 或 x86)上运行,否则将无法看到注册表项。 执行此操作的代码如下所示:

using Microsoft.Win32
...
string executionPolicy = Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell", "ExecutionPolicy", null)?.ToString();

如果由于任何原因您无法执行第一个解决方案,我推荐的第二种方法是使用System.Management.Automation.PowerShell NuGet 包。 这个方法看起来像这样:

using(var ps = PowerShell.Create()){
  ps.AddScript("Get-ExecutionPolicy");
  Collection<PSObject> output = ps.Invoke();
  Console.WriteLine($"Execution policy is {output[0]}")
}

如果你真的不想在你的项目中添加额外的 NuGet 包,还有另一种方法,但使用System.Diagnostics.Process和它的输出流来做这件事有点混乱。 它看起来像这样:

var procInfo = new ProcessStartInfo("powershell.exe", "-Command \"Get-ExecutionPolicy\"")
{
  CreateNoWindow = true,
  UseShellExecute = false,
  RedirectStandardOutput = true
};

var proc = new Process
{
  StartInfo = procInfo
};
proc.OutputDataReceived += Proc_OutputDataReceived;

proc.Start();
proc.BeginOutputReadLine();
Console.ReadLine();

...

private static void Proc_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
  if (!string.IsNullOrWhiteSpace(e.Data))
    Console.WriteLine($"Execution policy is {e.Data}");
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM