簡體   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