[英]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.