2022年10月7日 星期五

PowerShell ExecutionPolicy 權限變更詳細解說

PowerShell ExecutionPolicy 權限變更詳細解說



執行原則

ExecutionPolicy(執行原則) 是 Windows 的保護機制,預設狀態是最低權限只能執行有簽証證的ps1檔案。預設有5+1個設定值,最後一個1是預設的空欄未設定。

執行原則的官方說明:關於執行原則 - PowerShell | Microsoft Learn


先上蓋略圖 (実行ポリシーExecution Policy)

執行原則有簽證無簽證
本地檔案經由網路下載的檔案
Restricted×
無法執行
×
無法執行
×
無法執行
AllSigned
可執行
×
無法執行
×
無法執行
RemoteSigned
可執行

可執行
×
無法執行
Unrestricted
可執行

可執行

會跳出確認事項
Bypass
可執行

可執行

可執行


大概比較有疑問的是本地檔案跟經由網路下載的檔案有什麼區別,我也沒有測出變成網路檔案的條件,大概列舉幾個案例

  1. 上傳雲端再下載毫無疑問會變成網路檔案
  2. 透過隨身碟傳輸到其他電腦似乎不受影響是可以的執行的
  3. 透過網路芳鄰直接點兩下執行,會被當作網路檔案




作用範圍

範例代碼
# 計算當前執行原則
Get-ExecutionPolicy

#獲取各個範圍的詳細執行原則
Get-ExecutionPolicy -List


詳細執行原則會把每個範圍的原則寫出來,會有權限大小互相覆蓋的問題。第一行的指令會自動幫你計算,各個範圍總合起來後目前應該是什麼權限。

預設的執行原則全部都是 Undefined 這個就是未設定 NULL 的意思,預設值全 Undefined 的形況下經過第一行計算出來會返回 Restricted 權限的結果。


範圍有這些
        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser       Undefined
 LocalMachine       Undefined


1. MachinePolicy,  UserPolicy

前兩個Policy結尾的是從登錄檔設定的,下面是 MachinePolicy 設定的範例。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\PowerShell]
"EnableScripts"=dword:00000001
"ExecutionPolicy"="RemoteSigned"


快速命令 (MachinePolicy)

reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\PowerShell" /v "EnableScripts" /t REG_DWORD /d 1 /f
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\PowerShell" /v "ExecutionPolicy" /t REG_SZ /d RemoteSigned /f


快速命令 (UserPolicy)

reg add "HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Windows\PowerShell" /v "EnableScripts" /t REG_DWORD /d 1 /f
reg add "HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Windows\PowerShell" /v "ExecutionPolicy" /t REG_SZ /d RemoteSigned /f


ExecutionPolicy的值自行依照情況修改,這邊預設是 RemoteSigned 通用性比較高



2. Process, CurrentUser

直接在 PowerShgell內 用 Set-ExecutionPolicy 追加範圍提示即可修改

Set-ExecutionPolicy Bypass CurrentUser -Force
Set-ExecutionPolicy Bypass Process -Force

範圍 Process 是本次運行的程序,可以當作臨時的當前視窗關掉就沒了


3. LocalMachine

最後一個是 Set-ExecutionPolicy 的預設修改選項,不給範圍會改變 LocalMachine

Set-ExecutionPolicy Bypass -Force

相比於 CurrentUser 這個不分使用者任何人登陸都一樣




PowerShell 參數 -ExecutionPolicy

這是另外執行新視窗 PowerShell 的時候設定權限,有兩種方式可以執行。

權限範圍僅限制在新執行的視窗內,預設執行完會自動退出,退出後回到原本的視窗就沒有權限了,可以視為權限僅這一行。


1. 以傳入命令的方式執行

Powershell.exe -nop -exec bypass -c "Write-Host 'Hello Word'"

注意 -c 之後不能有其他命令選項,該選項限定只能是所有選項的最結尾。


2. 以傳入檔名的方式執行腳本

Powershell.exe -nop -exec bypass -file ".\example.ps1"

如果 example.ps1 是高級腳本需要輸入參數,直接補在後面就可以了。





以讀取的方式使用Invoke-Expression執行

這個是最終極的手段可以突破執行原則,不要把 ps1 當成檔案執行或載入,把它當作 txt 讀取然後執行即可。

因為安全限制是針對執行檔案而不是執行命令,想要要確保萬無一失直接用這個辦法比較保險絕對不會出錯的。


$Path = 'D:\MyPwshFile.ps1'
$Enc  = [Text.Encoding]::GetEncoding('UTF-8')
Invoke-Expression( [Io.File]::ReadAllText($Path, $Enc) )


注意路徑盡量使用絕對路徑,因為C#的路徑未必會跟 PowerShell 路徑相同,可能會導致函式 [Io.File]::ReadAllText 找不到路徑。

解決辦法可以參考這篇站內文:PowerShell 如何轉換絕對路徑




沒有留言:

張貼留言