Windows和PowerShell具有內建的安全功能和預設配置,旨在防止終端使用者在日常活動中意外啟動指令碼。但是,如果您的日常活動經常涉及編寫和執行自己的PowerShell指令碼,那麼這可能是一個麻煩,而不是一個好處。在這裡,我們將向您展示如何在不完全損害安全性的情況下解決這些特性。
PowerShell實際上是一種命令shell和指令碼語言,旨在取代Windows系統上的CMD和批處理指令碼。因此,PowerShell指令碼幾乎可以配置為執行任何可以從命令列手動執行的操作。這相當於使您的系統上幾乎任何可能的更改,直到您的使用者帳戶上的限制。因此,如果您只需雙擊一個PowerShell指令碼並以完全的管理員許可權執行它,像這樣簡單的一行程式碼可能會毀了您的一天:
Get-ChildItem "$env:SystemDrive\" -Recurse -ErrorAction SilentlyContinue | Remove-Item -Force -Recurse -ErrorAction SilentlyContinue不要執行以上命令!
它只需遍歷檔案系統並儘可能刪除任何內容。有趣的是,這可能不會像您想象的那麼快地導致系統無法執行—即使是從提升的會話執行時也是如此。但是,如果有人在執行這個指令碼後,因為突然找不到檔案或執行某些程式而給你打電話,“關閉並再次開啟”可能只會導致他們進入Windows啟動修復,他們會被告知無法解決問題。更糟糕的是,你的朋友可能會被騙去執行一個下載並安裝鍵盤記錄器或遠端訪問服務的指令碼,而不是得到一個只會破壞檔案系統的指令碼。然後,他們可能會問警察一些關於銀行欺詐的問題,而不是問你關於創業修復的問題!
到目前為止,可以這麼說,為什麼需要某些東西來保護終端使用者不受其影響,這一點應該是顯而易見的。但高階使用者、系統管理員和其他極客通常(儘管也有例外)對這些威脅更為謹慎,知道如何發現並輕鬆避免這些威脅,只想繼續完成工作。要做到這一點,他們必須禁用或繞過幾個路障:
在如何使用批處理檔案使PowerShell指令碼更易於執行中,也會提出同樣的問題,我們將指導您編寫批處理檔案以暫時繞過它們。現在,我們將向您展示如何使用更長期的解決方案來設定系統。請記住,一般情況下,您不應在非您獨家使用的系統上進行這些更改,否則,您將使其他使用者面臨更高的風險,可能會遇到這些功能旨在防止的問題。
首先,也可能是最重要的,讓人煩惱的是.PS1檔案的預設關聯。將這些檔案與PowerShell.exe對於防止意外執行不需要的指令碼是有意義的。但是,考慮到PowerShell附帶了一個專門為編輯PowerShell指令碼而設計的整合指令碼環境(ISE),我們為什麼要在預設情況下在記事本中開啟.PS1檔案呢?即使您還沒有準備好完全切換到啟用雙擊執行功能,您也可能需要調整這些設定。
您可以使用“預設程式”控制面板將.PS1檔案關聯更改為所需的任何程式,但直接挖掘登錄檔將使您能夠更精確地控制檔案的開啟方式。這還允許您設定或更改.PS1檔案上下文選單中提供的其他選項。在你做這件事之前別忘了備份登錄檔!
控制如何開啟PowerShell指令碼的登錄檔設定儲存在以下位置:
HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell要在更改這些設定之前瀏覽這些設定,請使用Regedit檢視該鍵及其子鍵。Shell鍵應該只有一個值,“(Default)”,設定為“Open”。這是指向雙擊檔案的預設操作的指標,我們將在子鍵中看到。
展開Shell鍵,您將看到三個子鍵。其中每一個都表示您可以執行的特定於PowerShell指令碼的操作。
您可以展開每個鍵來探索其中的值,但它們基本上等同於以下預設值:
如果您想繼續使用已經可用的預構建命令字串,只需更改Shell鍵中的“(Default)”值,以匹配與雙擊所需操作相匹配的鍵的名稱。這可以很容易地在Regedit中完成,或者您也可以使用我們的教程中關於使用PowerShell探索登錄檔的經驗(加上一個小的PSDrive調整)來開始構建一個可重用的指令碼,該指令碼可以為您配置系統。以下命令必須從提升的PowerShell會話執行,類似於以管理員身份執行CMD。
首先,您需要為HKEY\u CLASSES\u ROOT配置PSDrive,因為這不是預設設定。命令如下:
New-PSDrive HKCR Registry HKEY_CLASSES_ROOT現在您可以在HKEY\ U CLASSES\ U ROOT中導航和編輯登錄檔項和值,就像在常規HKCU和HKLM PSDrives中一樣。
要配置雙擊以直接啟動PowerShell指令碼,請執行以下操作:
Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell '(Default)' 0要配置雙擊以在PowerShell ISE中開啟PowerShell指令碼,請執行以下操作:
Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell '(Default)' 'Edit'要還原預設值(設定雙擊以在記事本中開啟PowerShell指令碼):
Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell '(Default)' 'Open'這只是更改預設雙擊操作的基礎。在下一節中,我們將詳細介紹如何自定義在PowerShell中從資源管理器開啟PowerShell指令碼時如何處理它們。請記住,作用域可以防止PSDrives在會話間持久化。因此,您可能希望在為此目的構建的任何配置指令碼的開頭包含新的PSDrive行,或者將其新增到PowerShell概要檔案中。否則,在嘗試以這種方式進行更改之前,需要手動執行該位。
PowerShell的ExecutionPolicy是防止惡意指令碼執行的另一層保護。這有多種選擇,還有幾種不同的設定方法。從最安全到最不安全,可用的選項包括:
根據Undefined的描述,可以在多個範圍中的一個或多個範圍中設定上述策略。可以使用Get ExecutionPolicy和-List引數來檢視所有作用域及其當前配置。
作用域按優先順序列出,最上面定義的作用域優先於所有其他作用域。如果未定義任何策略,系統將返回其預設設定(在大多數情況下,這是受限的)。
由於本文主要討論的是繞過安全性以提高可用性,所以我們只關心下面三個範圍。MachinePolicy和UserPolicy設定只有在您想要強制執行一個不那麼簡單地繞過的限制性策略時才真正有用。透過將我們的更改保持在流程級別或以下,我們可以隨時輕鬆地使用我們認為適合特定情況的任何策略設定。
為了在安全性和可用性之間保持某種平衡,螢幕截圖中顯示的策略可能是最好的。將LocalMachine策略設定為Restricted通常會阻止除您之外的任何人執行指令碼。當然,知道自己在做什麼的使用者可以不費吹灰之力地繞過這個問題。但它應該可以防止任何不懂技術的使用者意外觸發PowerShell中的災難**件。將CurrentUser(即:you)設定為Unrestricted允許您從命令列手動執行指令碼,但會保留對從Internet下載的指令碼的警告提示。程序級別的RemoteSigned設定需要以快捷方式完成PowerShell.exe或者(我們將在下面做)在登錄檔值中控制PowerShell指令碼的行為。這將使您可以輕鬆地雙擊執行您編寫的任何指令碼的功能,同時對來自外部源的(潛在的惡意)指令碼的無意執行設定了更強大的屏障。我們希望在這裡這樣做,因為無意中雙擊指令碼要比從互動式會話手動呼叫指令碼容易得多。
要按照上面的螢幕截圖設定CurrentUser和LocalMachine策略,請從提升的PowerShell會話執行以下命令:
Set-ExecutionPolicy Restricted Set-ExecutionPolicy Unrestricted -Scope CurrentUser要在從資源管理器執行的指令碼上實施RemoteSigned策略,我們必須更改前面檢視的其中一個登錄檔項中的值。這一點尤其重要,因為根據您的PowerShell或Windows版本,預設配置可能是繞過除AllSigned之外的所有ExecutionPolicy設定。要檢視計算機的當前配置,可以執行此命令(確保先對映HKCR PSDrive):
Get-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell\Command | Select-Object '(Default)'您的預設配置可能是以下兩個字串中的一個,或者相當類似的字串:
(在Windows 7 SP1 x64上看到,帶有PowerShell 2.0)
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-file" "%1"(在Windows 8.1 x64和PowerShell 4.0上看到)
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-Command" "if((Get-ExecutionPolicy ) -ne 'AllSigned') { Set-ExecutionPolicy -Scope Process Bypass }; & '%1'"第一個還不錯,因為它所做的只是在現有的ExecutionPolicy設定下執行指令碼。透過對更容易發生事故的操作實施更嚴格的限制,可以使它變得更好,但這並不是最初打算在雙擊時觸發的,而且預設策略終究是受到限制的。然而,第二種選擇是完全繞開你可能有的任何執行策略——甚至是限制性的。由於繞過將應用於流程範圍,因此它僅影響從資源管理器執行指令碼時啟動的會話。但是,這意味著您可能會啟動一些指令碼,否則您可能會期望(並希望)您的策略禁止這些指令碼。
要為從Explorer啟動的指令碼設定程序級ExecutionPolicy,根據上面的螢幕截圖,您需要修改我們剛才查詢的相同登錄檔值。您可以在Regedit中手動執行此操作,方法是將其更改為:
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-ExecutionPolicy" "RemoteSigned" "-file" "%1"如果願意,您還可以在PowerShell中更改設定。請記住從提升會話執行此操作,並對映HKCR PSDrive。
Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell\Command '(Default)' '"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-ExecutionPolicy" "RemoteSigned" "-file" "%1"'正如完全禁用UAC是一個壞主意一樣,除非您確實需要它們執行需要管理員訪問的操作,否則使用提升的許可權執行指令碼或程式也是一種糟糕的安全實踐。因此,不建議將UAC提示符構建到PowerShell指令碼的預設操作中。但是,我們可以新增一個新的上下文選單選項,以便在需要時在提升的會話中輕鬆執行指令碼。這類似於將“用記事本開啟”新增到所有檔案的上下文選單的方法,但這裡我們只針對PowerShell指令碼。我們還將繼續上一篇文章中使用的一些技術,其中我們使用批處理檔案而不是登錄檔駭客來啟動PowerShell指令碼。
要在Regedit中執行此操作,請返回Shell鍵:
HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell在那裡,建立一個新的子鍵。稱之為“與PowerShell(Admin)一起執行”。在其下面,建立另一個名為“Command”的子鍵。然後,將命令下的“(Default)”值設定為:
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-Command" ""& {Start-Process PowerShell.exe -ArgumentList '-ExecutionPolicy RemoteSigned -File \"%1\"' -Verb RunAs}"在PowerShell中執行同樣的操作實際上這次需要三行程式碼。一個用於每個新鍵,另一個用於設定命令的“(預設)”值。別忘了仰角和HKCR地圖。
New-Item 'HKCR:\Microsoft.PowerShellScript.1\Shell\Run with PowerShell (Admin)' New-Item 'HKCR:\Microsoft.PowerShellScript.1\Shell\Run with PowerShell (Admin)\Command' Set-ItemProperty 'HKCR:\Microsoft.PowerShellScript.1\Shell\Run with PowerShell (Admin)\Command' '(Default)' '"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-Command" ""& {Start-Process PowerShell.exe -ArgumentList ''-ExecutionPolicy RemoteSigned -File \"%1\"'' -Verb RunAs}"'另外,請注意透過PowerShell輸入的字串與進入登錄檔的實際值之間的差異。特別是,為了避免命令解析中的錯誤,我們必須將整個過程用單引號括起來,並在內部單引號上加上兩個引號。
現在您應該有一個新的PowerShell指令碼上下文選單條目,名為“runwithpowershell(Admin)”。
新選項將生成兩個連續的PowerShell例項。第一個只是第二個的啟動程式,它使用帶有“-Verb RunAs”引數的啟動程序來請求新會話的提升。在那裡,您的指令碼應該能夠在透過UAC提示符單擊後以管理員許可權執行。
這裡還有一些小改動,可以讓生活更輕鬆一些。首先,把記事本功能完全去掉怎麼樣?只需將“(Default)”值從Edit(下面)下的命令鍵複製到Open下的相同位置。
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell_ise.exe" "%1"或者,您可以使用這個PowerShell(當然還有Admin&HKCR):
Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell\Open\Command '(Default)' '"C:\Windows\System32\WindowsPowerShell\v1.0\powershell_ise.exe" "%1"'另一個小麻煩是,一旦指令碼完成,控制檯就會消失。當這種情況發生時,我們沒有機會檢視指令碼輸出中的錯誤或其他有用資訊。當然,這可以透過在每個指令碼的末尾暫停來解決。或者,我們可以修改命令鍵的“(Default)”值以包含“-NoExit”引數。以下是修改後的值。
(無管理員許可權)
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-NoExit" "-ExecutionPolicy" "RemoteSigned" "-file" "%1"(具有管理員許可權)
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-Command" ""& {Start-Process PowerShell.exe -ArgumentList '-NoExit -ExecutionPolicy RemoteSigned -File \"%1\"' -Verb RunAs}"當然,我們也會在PowerShell中為您提供這些命令。最後提醒:仰視及香港華潤!
(非管理員)
Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell\Command '(Default)' '"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-NoExit" "-ExecutionPolicy" "RemoteSigned" "-file" "%1"'(管理員)
Set-ItemProperty 'HKCR:\Microsoft.PowerShellScript.1\Shell\Run with PowerShell (Admin)\Command' '(Default)' '"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-Command" ""& {Start-Process PowerShell.exe -ArgumentList ''-NoExit -ExecutionPolicy RemoteSigned -File \"%1\"'' -Verb RunAs}"'為了測試這一點,我們將使用一個指令碼,它可以顯示ExecutionPolicy設定,以及指令碼是否以管理員許可權啟動。指令碼將被呼叫“MyScript.ps1,並存儲在我們的示例系統上的“D:\Script Lab”中。程式碼如下,供參考。
if(([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {Write-Output 'Running as Administrator!'} else {Write-Output 'Running Limited!'} Get-ExecutionPolicy -List使用“使用PowerShell執行”操作:
單擊UAC後,使用“Run with PowerShell(Admin)”操作:
為了演示程序作用域中的ExecutionPolicy,我們可以使用以下PowerShell程式碼使Windows認為檔案來自Internet:
Add-Content -Path 'D:\Script Lab\MyScript.ps1' -Value "[ZoneTransfer]`nZoneId=3" -Stream 'Zone.Identifier'幸運的是,我們啟用了-NoExit。否則,這個錯誤就會被忽略,我們就不會知道了!
這個區域識別符號可透過以下方式刪除:
Clear-Content -Path 'D:\Script Lab\MyScript.ps1' -Stream 'Zone.Identifier'有用的參考資料:
檔案加密和解密可以是一個工作位。但是,使用PowerShell擴充套件,可以將程序精簡為一行命令。為此,我們需要安裝Gpg4win和Powershell模組。使用指令碼,我們可以自動化檔案加密和解密過程。 ...
大多數使用者從未聽說過PowerShell,更不用說觸控它並試用了。這可能是因為這個名字,聽起來像是隻有鐵桿IT極客才會使用的東西。或者是因為PowerShell的好處還不清楚。可能是因為最初的學習曲線。 ...
Windows PowerShell是一個優秀的配置管理和自動化框架。它由命令列shell和基於.NET的指令碼語言組成。管理員使用PowerShell作為管理Windows、Linux和網路客戶端的一種手段。 ...
...。也有一些不同的刪除選項:使用傳統的解除安裝、使用PowerShell命令和第三方安裝程式。 ...
...想要的。 要安裝它們,請開啟Windows終端、命令提示符或PowerShell視窗。例如,您可以右鍵單擊開始按鈕或按Windows+X並選擇“Windows PowerShell”以開啟PowerShell視窗。您不必以管理員身份啟動它。 將該命令從網頁複製貼上到命令列...
...將使用以下命令: ren "Home Movie.ogv" "First Birthday.ogv" 使用powershell重新命名檔案和資料夾 在命令列環境中重新命名檔案和資料夾時,Windows PowerShell甚至比命令提示符更強大、更靈活。雖然我們只討論命名檔案的表面,但您可以做...
微軟於2020年3月4日宣佈PowerShell 7.0。這是PowerShell、Microsoft跨平臺命令列shell和指令碼語言的最新主要更新。下面是什麼新的,以及如何在Windows PC上安裝它。 powershell 7有什麼新功能? 最新版本PowerShell 7是在以前的PowerShell Core 6.1...
...眠,如果它**,確保它將保持遠端桌面連線訪問。 對於PowerShell,開發人員模式可以更改執行策略,以允許您的電腦執行未簽名的本地PowerShell指令碼。你的電腦仍然無法執行未簽名的遠端指令碼。 裝置門戶和裝置發現 啟用開發...