Powershell 檔案無法載入 執行已遭軟體限制原則封鎖, win 7 home edition


http://wp.me/ph3BR-1hI

 

自己寫好的 powershell script, 測試正常後, self signed

Set-ExecutionPolicy RemotedSinged, 或

Set-ExecutionPolicy AllSinged

都可以正常執行, 要搞這個的原因是 (http://wp.me/ph3BR-1gF). 放到別台電腦, 使用者第一次安裝使用時, 誤選 " V 永遠不執行" , 以致出現 “已遭軟體限制原則封鎖" 的情形, 請問怎樣恢復其使用 ??!! 用 Set-ExecutionPolicy bypass 或 Set-ExecutionPolicy unrestricted, 是辦法但不是解決方案.

題外話, 如果是第一次寫 Powershell  script, 需要把 powersell 的 execution policy 從內定的 Restricted 改為 RemoteSigned, 學習用 Powershell 改可以, 用俺的自己匯入機碼的方法也可以, 繼續看下去就知道有多簡單好用了, Win7, Win8 試驗通過的 “開放源碼".

 

好, 繼續解決 powershell script “已遭軟體限制原則封鎖" 的問題. 看了幾個網頁, 說 gpedit.msc (Group Policy editor) 可以解決問題, 只是 win 7 home, 看來是被 Microsoft 閹割了這個程序或功能, 這樣表示, Microsoft 有點不上道, 有沒有必要閹割著工具呢 ?!

再看了幾個網頁, 有說某個電玩公司的人, 自己寫了一個 add_gpedit.msc 的安裝程序, 可以在 win7 home 上面按裝, 就可以使用 Group policy editor 一樣的功能,

http://answers.microsoft.com/en-us/windows/forum/windows_7-system/gpeditmsc-is-missing/38ff2981-700b-41f1-9196-6140a433df47
htt_ps://www.youtube.com/watch?v=tKKU-Mgqz1w
http://drudger.deviantart.com/art/Add-GPEDIT-msc-215792914
http://thecustomizewindows.com/2011/07/group-policy-editor-gpedit-msc-in-windows-7-home-premium-enable/

只是, 沒有源碼, 不敢貿貿然用這樣的軟件, 還是只看不動好了. 而且, 這個真的是 “Group Policy" 造成的嗎 ?!  中英版的 WINDOWS, 讓人最困擾就是這些時候, 你在中文版看到的錯誤報訊, 可能在英文版是另外的意思. 俺另外在MS 的論壇問有沒有人有其他的解決經驗 (話說加入這個壇, Microsoft 是人工審核資格的, 2013年5月26日發要求審核, 反正就花了有一段時間)

http://social.technet.microsoft.com/Forums/scriptcenter/zh-TW/d0ef9eb6-dc37-4fdc-8cbd-18c4792ba245/powershell-win-7-home-edition?forum=powershellzhcht

 

 

..

..

..

好了, 終於到了俺自己的解決方案出場, 這是意外的發現, 可能 Microsoft 也有資料, 但是資訊宇宙茫茫, 俺還沒發現它們就是了.

首先,

registry_set-executionpolicy

當沒有使用系統管理員層級打開 Powershell, 然後執行 set-ExecutionPolicy AllSigned, 結果出現了一句不能修改 Registry 的警告, 警告的資訊 “拒絕存取登錄機碼", 提供了一個方向,


PS C:\Users\user0> set-executionpolicy allsigned
set-executionpolicy : 拒絕存取登錄機碼 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell'。
位於 線路:1 字元:1
+ set-executionpolicy allsigned
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [Set-ExecutionPolicy], UnauthorizedAccessException
+ FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.SetExecutionPolicyCommand

PS C:\Users\user0> https://xiaolaba.wordpress.com

 

因此, 打開 regedit 看看這條 Registry 到底有啥, 並且把它匯出, 留下來備用, 以後要改 Powershell exectuiton policy 就不要在打字了, 只接接匯入 registry 就好.

以下是幾種可用的 registry, 存成文字檔, 把檔名改成俺提供的, 然後就直接點兩下, 就被會問到否接受, 俺這是100% 依照 Microsoft 提供的資料的 [開放源碼], 沒有任何病毒, 所以不用擔心. 效果就是 100% 和在 Powershell 裡面執行 Set-ExecutionPolicy xxx 一樣, 完全不用煩惱普通使用者搞不定.

 

檔名, ps1_Restricted.reg, 內容如下,


Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell]
"Path"="C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe"
"ExecutionPolicy"="Restricted"

 

.

檔名, ps1_AllSigned.reg, 內容如下,


Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell]
"Path"="C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe"
"ExecutionPolicy"="AllSigned"

.

.

檔名, ps1_RemoteSigned.reg, 內容如下,


Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell]
"Path"="C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe"
"ExecutionPolicy"="RemoteSigned"

 

這是示範操作如果匯入機碼 (Registry)

選個你喜歡的 ps1_xxxxx.reg, 點兩下執行匯入的動作,

registry_excution_policy

 

警告語句, 點 “是 Y" 就對了, 你自己做的工具, 不用怕嘛, 源碼都開放的.

registry_import_warning

 

 

恭喜 成功

registry_import_done

 

自己驗證一下, 果然, 每次點5下滑鼠就改好了 Set-ExecutionPolicy 的設定.

registry_import_verification

 

 

..

..

接下來, 又要回到問題的重點, 怎樣使原來已經 “數位簽署" 通過的 Powershell script 再度執行呢, 不然每次改 Registry 也不是最好的, 因為萬一執行完畢忘記從 UnRestriced / Bypass 改回 Allsigned / RemoteSigned, 病毒或惡意的程式就有機會破壞, 這是不能接受的. 這裡有兩個方案,

1) 把 ps1 內容的那段 # SIG # Begin signature block 刪除, 那麼在 RemoteSigned 的情形下就可執行.

2) 把 ps1 重新再次 “自簽署" 一次, 用別的證書名稱及發行人, 那麼 win7 / win8  就不會再刁難了………….突然, 靈光一閃, 俺就找到了 “完美" 的解決方案, 不需要要再次 “數位簽署", 也不需要用到 gpedit.msc, 因為所有的疑點落在在於 “數位簽署"….

所以打開 certmrg.msc, 看看, 刪一下 “自簽的證書", 她會出現在 “沒有信任的憑證" 底下, 這就是 win7 / win8 的門神, 不讓運行那個錯選 [V] 而永久不可執行但有 “數位簽署" 的 script , 把 這個 “沒有信任的憑證" 刪除, 馬上實驗, 果然就搞定了, 能夠再次被問到是否信任執行.

cert_untrucsted

 

所以, 這次要選 [A], 不要再選 [V]

就算你再錯, 俺都有方法解決了, 隨便選……..

run_singed_script_1st_time

 

 

END.

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s