PowerShell:Execution Policy

當已經習慣使用Powershell來管理或設定電腦時,很容易卡到Powershell腳本執行原則的設定。

Powershell有下面數種Policy可以設定
Unrestricted——-任何腳本皆可以執行,但是網路下載的會出現警示。
RemoteSigned—-本機撰寫的可以執行,網際網路下載來的需要經過簽署。
AllSigned———–只允許受信任的發行的腳本可以執行
Restricted———-關閉腳本執行功能。這是預設值
Default
Bypass
Undefined

下面的指令可以查看現在的Powershell執行原則

Get-ExecutionPolicy

下面的指令可以設定執行原則(需要管理員權限)

Set-ExecutionPolicy RemoteSigned

先說一下問題來源,因為Windows 預設就是關閉腳本執行預設值,所以你把Set-ExecutionPolicy RemoteSigned寫成Powershell腳本檔然後直接執行是行不通的。因為系統就不准你執行。同時,這一段指令也是必須要系統管理員權限才能執行。所以如果我今天是在一般使用者環境更可不能直接執行。另外Powershell也因為安全策略問題,所以他也不太能從Share Folder直接執行,大部分的情況下都會被拒絕。

先前一直沒有時間仔細去思考簡化這一段,導致每台電腦設定之前還要手打這一段指令,今天突然想到搭配Command批次檔來一起處理不能用一鍵設定好執行原則的問題。

這一個小小的設定一共需要3個檔案,1個bat檔、2個PS1檔案
我的情境是,三個檔案都放在網路分享資料夾上。

由Bat檔做導入,下面的批次會從Share Folder複製需要的PS1檔案到本機來,並且執行PSexec.ps1,執行完成之後再刪除檔案,不要留垃圾在User電腦

REM==========PSExec.bat====================
copy \\192.168.1.1\share\psexec.ps1 c:\tools /Y
copy \\192.168.1.1\share\psexec_sub.ps1 c:\tools /Y
powershell c:\tools\PSexec.ps1
del c:\tools\psexec.ps1 /F
del c:\tools\psexec_sub.ps1 /F

執行子層的PS1檔案PSExec_sub.ps1加上後面的參數
-Verb runas >> 這是為了讓powershell跳出提升權限的輸入帳號密碼的視窗
-Wait >> 這是要讓Powershell等候這一行執行完成關閉後才能繼續往下執行,
因為如果跑太快會回到前面的Bat檔案接續執行把需要的PS1檔案都刪掉。

#============PSExec.ps1=================
Start-Process powershell C:\tools\PSExec_sub.ps1 -Verb runas -Wait

再來才是核心重點,設定腳本執行權限

#============PSExec_sub.ps1==============
Set-ExecutionPolicy RemoteSigned

雖然只是一個很簡單的設定指令,但是由於微軟為安全性設下的重重關卡,所以只好靠點小技巧去簡化它,讓我可以用滑鼠雙擊就完成要打一串指令的麻煩。

======更新======
經過測試,在完全沒有手動執行過指令的,無法使用這個方式來變更Policy
第一次,至少必須用管理員執行Powershell,輸入

Set-ExecutionPolicy RemoteSigned

之後才能用script做調整設定。
如果還有找到新方式我會在此更新。