2013/11/1

[PowerShell] cannot be loaded because the execution of scripts is disabled on this system - Server 2008 R2

最近在研究PowerShell,在執行的時候遇到了一些問題
直接打開PowerShell執行 xxx.ps1 的Script是可以正常運作的
但是要使用C# 去呼叫寫好的 xxx.ps1就會發生問題了

xxx.ps1 檔案無法載入,因為這個系統上已停用指令碼執行。如需詳細資訊,請參閱 \"get-help about_signing\"。"}

英文版

xxx.ps1 cannot be loaded because the execution of scripts is disabled on this system.

依照他的提示打指令"get-help about_signing"看了一下 
PowerShell有些執行上的政策去限制了檔案(.ps1)的執行

有四種執行的政策

Restricted - 限制任何的.ps1的執行....這是預設值

AllSigned - 要執行的.ps1都要經過信任者的簽名發行

RemoteSigned - 這是允許存取本機電腦上.ps1,但是透過網路去存取的就不行

UnRestricted - 完全不限制.ps1的執行
指令"Get-ExecutionPolicy" 可以取得目前的政策狀況
如果是自己寫的.ps1應該是 RemoteSigned 的權限就可以執行了
指令"Set-ExecutionPolicy RemoteSigned" 可以去更改執行政策



如畫面顯示我的執行政策已經是 UnRestricted 但是還是出現一樣的錯誤

後來才發現我使用的作業系統是 Server 2008 R2
同時會存在著 X86 和 X64兩種版本
需要檢查兩個版本是否都是可以執行的權限

X86的路徑
C:\Windows\system32\cmd.exe



X86的執行政策是 UnRestricted

接下來檢查X64的設定
C:\Windows\SysWOW64\cmd.exe

就會發現X64的執行政策是 Restricted,難怪一直都不能執行!!!
只要修改X64的政策就能執行了


這個問題困擾了我一陣子,經過這一次的經驗
下次在處理Server的問題時,就會多注意到X64和X86的版本問題

從失敗中學經驗~~

參考資料:
http://stackoverflow.com/questions/4037939/powershell-execution-of-scripts-is-disabled-on-this-system