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