2017-10-19 170 views
3

背景:我想進入PowerShell腳本來自動執行一些工作任務。我不是管理員,並且無法運行提升的powershell進程。我傾向於使用批處理腳本通過命令行實用程序以編程方式執行某些任務,但隨着我的能力不斷增強,它已經達到了明確的地步,那就是PowerShell會是一個更適合該任務的工具。我玩弄了一下直接的窗口,寫了一個基本的腳本來看看我能不能做些什麼。什麼是PowerShell拒絕加載任何本地ps1腳本的目的,當這是微不足道的繞過?

一旦我掌握了一些測試命令,我將它們保存到一個文件中。

Write-Host "Let's do this" 
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 
[System.Windows.Forms.MessageBox]::Show("Script Successful") 
calc.exe 

我很驚訝地發現,雖然我可以在即時窗口中執行任何我想要的,加載的.ps1(我猜是PowerShell中相當於一個.BAT的),它必須被簽署,我需要成爲一名管理員來改變這種行爲。

但是,我的第一個想法是「好吧,好吧,我只是將我的命令從.bat發送到即時窗口」。所以,我看着PowerShell的-help,並寫在命令提示符下:

type test.ps1 | powershell - 

它的工作原理,並從.bat工作過。 我在這裏錯過了什麼嗎?如果您只需要一個名爲type harmfulscript.ps1 | powershell -的.bat文件,並且您很好,那麼禁止從立即窗口調用.ps1文件有什麼意義?

+0

這是一個很好的問題,我很好奇,答案有什麼安全邊際默認將GPO停止在我的環境中運行腳本(.ps1文件),我們使用的解決方法是使用一些參數創建指向powershell.exe的快捷方式,但它最終會運行腳本。我們桌面工程師覺得非常有用。 – cet51

+0

@CoryEtmund至少我沒有瘋狂。我只是這樣做了,我一直在盯着屏幕思考「這真的*是必要的嗎?」一方面和「這是否真的*工作?」在另一! –

+3

PowerShell的執行策略不是安全功能,而是管理員安全功能(類似於槍支上的安全)。你必須明確地說,「是的,我想運行腳本。」如果有人出於安全原因啓用了限制性執行策略,那麼IMO就會讓合法用戶煩惱(有點像阻止用戶通過策略運行'cmd.exe',這令人惱火和毫無意義)。 –

回答

2

ExecutionPolicy(見Get-help Get-ExecutionPolicyGet-Help Set-ExecutionPolicy)被分解爲「範圍」。

是的,這對於用戶繞過是微不足道的;從字面上看,爲PowerShell創建一個桌面快捷方式,調用PowerShell.Exe -ExecutionPolicy Bypass

要回答你的問題;通過具有通用目的,明顯限制範圍,防止隨機進程執行* .ps1腳本(除非它們在您的情況下是數字簽名的)。這使得系統的「攻擊面」更小。

更新(澄清):

的「ExecutionPolicy」功能爲「安全控制」主要的一點是預防(因爲它很容易繞過),這是認證 - 驗證腳本來自哪裏(例如:數字簽名?)。

首先,這會阻止不知情的用戶從未知/不可信來源運行腳本。

這種'安全控制'無處不在;

  • Java運行時環境(JRE中)將只(默認)負載信任 (如:數字簽名)的小程序。

  • Web瀏覽器在遇到自簽名或過期的 SSL證書時會發出錯誤。

微軟PowerShell團隊已與爲什麼背後更爲細節他們所選擇的安全性原則blog post

考慮到這一點,請記住'ExecutionPolicy'具有'範圍'(層)。 如果沒有爲任何範圍定義「ExecutionPolicy」,PowerShell將默認爲Restricted

否則,最上面定義的'範圍'勝出。有關更多詳細信息,請參見get-help about_Execution_Policies,例如哪個'範圍'優先。

PS C:\> Get-ExecutionPolicy -List | Format-Table -AutoSize 

     Scope ExecutionPolicy 
     ----- --------------- 
MachinePolicy  Undefined 
    UserPolicy  Undefined 
     Process  Undefined 
    CurrentUser  Undefined 
LocalMachine RemoteSigned 


PS C:\> 
+0

我不是不同意你在這裏,我只是想更多地瞭解這一點。這種行爲如何阻止執行ps1腳本的隨機進程?任何進程都可以在命令行右鍵執行本機命令?所以如果你想確實調用腳本,你可以調用命令行代碼'type test.ps1 | powershell -'?或者你是否意味着它會阻止偶然執行powershell腳本的隨機進程? –

+0

此外,運行'PowerShell.Exe -ExecutionPolicy Bypass'不會改變我的行爲:我仍然無法運行未簽名的腳本。 –

+0

@Some_Guy創建啓動PowerShell「會話」的桌面快捷方式(打開一個窗口)。然後編輯桌面快捷方式屬性(特別是「目標」字段)並在末尾附加「-ExecutionPolicy Bypass」。你應該像這樣結束一個'目標'; '%SystemRoot%\ system32 \ WindowsPowerShell \ v1.0 \ powershell.exe -ExecutionPolicy Bypass' – Signal15

0

實際上有現在兩個簡單的方法可以做到這一點作爲一個標準的用戶:

從PowerShell中,任何用戶都可以使用命令set-ExecutionPolicy -Scope UserPolicy ...

或者,它也現在在「更新和安全」下設置 - >「對​​於開發者」,在Windows 10此頁面的底部相當於:

的Set-ExecutionPolicy -Scope UserPolicy下RemoteSigned

除非你使用定期從網絡共享腳本,這是一個開發人員工作站比「無限制」

+0

'PS G:\> set-executionpolicy -scope userpolicy remotesigned'給我 Set-ExecutionPolicy:無法設置執行策略。必須通過組策略設置MachinePolicy或UserPolicy範圍內的執行策略。' –

+0

@Some_Guy按住左側的「Shift」並右鍵單擊PowerShell快捷方式,然後單擊「以管理員身份運行」 - 必須具有*提升的* PowerShell會話爲了按照原始問題的規定更改'ExecutionPoicy' – Signal15

+0

@ Signal15,我不是管理員。 *「我很驚訝地發現,雖然我可以在即時窗口中執行任何我想要的操作,但要加載.ps1(我猜是與.bat相當的powershell),但必須簽名,而且我需要是一個管理員來改變這種行爲。「* –