簡體   English   中英

C# PowerShell 腳本不適用於 ExecutionPolicy

[英]C# PowerShell Script not working with ExecutionPolicy

我正在嘗試在 .netCore 上使用 C# 運行 PowerShell 腳本。

我現在嘗試了許多不同的解決方案,但似乎沒有一個有效。 我只想執行一個 PowerShell 腳本並設置 ExecutionPolicies 和 Scope 以使其工作。 但我總是有一個例外,即 ExecutionPolicies 不允許我以這種方式運行腳本。

盡管有實際的配置和代碼,你會在下面找到,在到達.Invoke();之后,我沒有從調試器那里得到任何反饋 被執行。 等待響應並讓軟件在后台執行其操作總是會導致 stackoverflow 異常。

commandParameters 是一個簡單的 Dictionary<string, string>

對此有何想法?

干杯。


var iss = InitialSessionState.CreateDefault2();
        // Set its script-file execution policy.
        iss.ExecutionPolicy = Microsoft.PowerShell.ExecutionPolicy.Unrestricted;
        iss.ExecutionPolicy = (ExecutionPolicy)Microsoft.PowerShell.ExecutionPolicyScope.CurrentUser;

        // Create a PowerShell instance with a runspace based on the 
        // initial session state.
        PowerShell ps = PowerShell.Create(iss);

 ps.AddCommand(path + "\\" + fileName);
        ps.AddParameters(commandParameters);
        var results = ps.InvokeAsync().GetAwaiter().GetResult();
  • 分配給iss.ExecutionPolicy只控制當前進程的執行策略

  • 不要指派Microsoft.PowerShell.ExecutionPolicyScope價值,因為它是一個無關的枚舉定義執行政策范圍,只與該Set-ExecutionPolicyGet-ExecutionPolicy cmdlet的。 此無關枚舉的數值恰好與適當的[Microsoft.PowerShell.ExecutionPolicy]枚舉值重疊,因此策略范圍CurrentUser映射到策略RemoteSigned (值0x1 )。

    • 實際上,您的第二個iss.ExecutionPolicy = ...分配覆蓋了第一個並將流程范圍執行策略設置為RemoteSigned
    • 進程范圍執行策略,即針對當前進程,是唯一可以通過初始會話狀態設置的策略; 有關如何更改持久作用域的策略,請參閱下一節。

因此, iss.ExecutionPolicy = Microsoft.PowerShell.ExecutionPolicy.Unrestricted; 單獨調用當前會話中的*.ps1文件就足夠了-刪除第二個iss.ExecutionPolicy = ...賦值。


如果要持久修改執行策略,則必須使用.AddCommand('Set-ExecutionPolicy')和適當的參數並調用該命令。 警告

  • 更改持久當前用戶配置也會對相應 PowerShell 版本中的常規PowerShell 會話(交互式會話/CLI 調用)生效。

  • 相比之下,如果您更改持久機器配置 - 這需要以提升運行(以管理員身份):

    • 對於Windows PowerShell SDK,此更改也會對常規 PowerShell 會話生效。
    • 使用PowerShell (Core) SDK,只對手頭的 SDK 項目生效。 [1]
  • 有關示例代碼,請參閱此答案

警告

  • 如果當前用戶/機器的執行策略是通過GPO (組策略對象)控制的,則您基本上無法以編程方式覆蓋它(通過 GPO 更改除外)。

  • 要檢查基於 GPO 的策略是否有效

    • 運行Get-ExecutionPolicy -List以按優先級降序Get-ExecutionPolicy -List為每個可用范圍定義的策略。
    • 如果兩個MachinePolicyUserPolicy范圍比其它的值Undefined ,那么GPO策略生效(運行Get-ExecutionPolicy不帶參數來查看當前會話的有效的政策)。

[1] Windows PowerShell將執行策略存儲在注冊表中,常規會話和 SDK 都會咨詢。 相比之下, PowerShell (Core)將它們存儲在powershell.config.json文件中,並且在機器策略的情況下與 PowerShell 可執行文件 (DLL) 一起存儲 由於SDK的項目有自己的可執行文件,隨之而來的JSON文件不是由一個普通的PowerShell(核心)安裝可執行看到。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM