複製鏈接
請複製以下鏈接發送給好友

Windows Power Shell

鎖定
Windows PowerShell 是微軟發佈的一種命令行外殼程序和腳本環境,使命令行用户和腳本編寫者可以利用 .NET Framework的強大功能。
引入了許多非常有用的新概念,從而進一步擴展了在 Windows 命令提示符和 Windows Script Host 環境中獲得的知識和創建的腳本。
Windows PowerShell v3將伴隨着Microsoft Hyper-V 3.0和Windows Server 2012發佈。PowerShell v3是一個Windows任務自動化的框架,它由一個命令行shell和內置在這個.NET框架上的編程語言組成。
PowerShell v3採用新的cmdlet讓管理員能夠更深入到系統進程中,這些進程可以製作成可執行的文件或腳本(script)。一條cmdlet是一條輕量命令,Windows PowerShell運行時間在自動化腳本的環境裏調用它。
Cmdlet包括顯示當前目錄的Get-Location,訪問文件內容的Get-Content和結束運行進程的Stop-Process。
PowerShell v3在Windows Server 8中裝載了Windows Management Framework 3.0。PowerShell運行環境也能嵌入到其它應用。
軟件名稱
WindowsPowerShell
軟件平台
Windows
最近更新時間
2020年02月24日
軟件語言
英文(cmd)
開發商
微軟(Microsoft)
軟件版本
7.0.0-rc.3
軟件大小
9.70 MB
外文名
PowerShell
平    台
Windows/.NET
類    型
命令行工具
途    徑
.NET Framework
運行環境
Windows 命令提示符和Windows Script Host
官方文檔
https://docs.microsoft.com/zh-cn/powershell/
開源地址
https://github.com/PowerShell/PowerShell

Windows Power Shell程序安裝

Windows Power ShellPowershell

有多種方法可以在 Windows 中安裝 PowerShell。 每種安裝方法旨在支持不同的方案和工作流。 選擇最符合需求的方法。 [18] 
  • Winget - 在 Windows 客户端上安裝 PowerShell 的建議方法
  • MSI 包 - Windows Server 和企業部署方案的最佳選擇
  • ZIP 包 -“旁加載”或安裝多個版本的最簡單方法
    • 將此方法用於 Windows Nano Server、Windows IoT 和基於 Arm 的系統
  • .NET 全局工具 - 非常適用於安裝和使用其他全局工具的 .NET 開發人員
  • Microsoft Store 包 - 適用於 PowerShell 臨時用户進行安裝的一種簡單方法,但有一些限制
備註
本文中的安裝命令適用於最新穩定版的 PowerShell。 若要安裝不同版本的 PowerShell,請調整命令以匹配所需的版本。 以下鏈接會將定向到 GitHub 上 PowerShell 存儲庫中每個版本的發佈頁面。
  • 穩定版:https://aka.ms/powershell-release?tag=stable
  • LTS 版本:https://aka.ms/powershell-release?tag=lts
  • 預覽版:https://aka.ms/powershell-release?tag=preview
可在“版本”頁的“資產”部分中找到每個包的下載鏈接。 由於“資產” 部分可能處於摺疊狀態,因此可能需要單擊展開它。
使用 Winget 安裝 PowerShell(推薦)
Windows 包管理器 Winget 是一種命令行工具,用户可以使用它在 Windows 客户端計算機上查找、安裝、升級、刪除和配置應用程序。 此工具是 Windows 程序包管理器服務的客户端接口。 默認情況下,winget命令行工具作為應用安裝程序Windows 11 和現代版本的 Windows 10 捆綁在一起。
備註
若要查看系統要求列表和安裝説明,請參閲 winget 文檔。
Winget 當前未在 Windows 服務器上運行。
通過以下命令,可使用已發佈的 winget 包安裝 PowerShell:
winget search Microsoft.PowerShell
Name Id Version Source --------------------------------------------------------------- PowerShell Microsoft.PowerShell 7.2.6.0 winget PowerShell Preview Microsoft.PowerShell.Preview 7.3.0.6 winget
使用 id 參數安裝 PowerShell 或 PowerShell 預覽版
winget install --id Microsoft.Powershell --source winget winget install --id Microsoft.Powershell.Preview --source winget
安裝 MSI
若要在 Windows 上安裝 PowerShell,請使用以下鏈接從 GitHub 下載安裝包
  • PowerShell-7.2.6-win-x64.msi
  • PowerShell-7.2.6-win-x86.msi
下載後,雙擊安裝程序文件並按照提示進行操作。
安裝程序在 Windows“開始”菜單中創建一個快捷方式
  • 默認情況下,包安裝位置為 $env:ProgramFiles\PowerShell\<version>
  • 可以通過“開始”菜單或 $env:ProgramFiles\PowerShell\<version>\pwsh.exe 啓動 PowerShell
備註
PowerShell 7.2 安裝到新目錄,並與 Windows PowerShell 5.1 並行運行。 PowerShell 7.2 是就地升級,升級後會替換 PowerShell 7.0 及更低版本。
  • PowerShell 7.2 安裝到 $env:ProgramFiles\PowerShell\7
  • $env:ProgramFiles\PowerShell\7 文件夾已添加到 $env:PATH
  • 以前發佈的版本所在的文件夾將被刪除
如果需要與其他版本並行運行 PowerShell 7.2,請使用 ZIP 安裝方法將其他版本安裝到其他文件夾。
PowerShell 7.2 中支持 Microsoft 更新
PowerShell 7.2 支持 Microsoft 更新。 啓用此功能時,之後在傳統 Microsoft 更新 (MU) 管理流中獲得最新的 PowerShell 7 更新,無論是包含適用於企業的 Windows 更新、WSUS、Microsoft Endpoint Configuration Manager,還是包含設置中的交互式 MU 對話框。
PowerShell 7.2 MSI 包包含以下命令行選項:
  • USE_MU - 該屬性有兩個可能值:
    • 1(默認)- 選擇通過 Microsoft 更新、WSUS 或 Configuration Manager 進行更新
    • 0 - 不選擇通過 Microsoft 更新、WSUS 或 Configuration Manager 進行更新
  • ENABLE_MU
    • 1(默認)- 選擇加入使用 Microsoft 更新進行自動更新
    • 0 - 不選擇加入使用 Microsoft 更新。
備註
可能已在之前的安裝或手動配置中設置了啓用更新。 使用
ENABLE_MU=0
並不會刪除現有設置。 此外,此設置可由管理員控制的“組策略”設置管理。
有關詳細信息,請參閲 PowerShell Microsoft 更新常見問題解答
從命令行安裝 MSI 包
可以通過命令行安裝 MSI 包,這樣管理員能夠在沒有用户交互的情況下部署包。 MSI 包中有下列控制安裝選項的屬性:
  • ADD_EXPLORER_CONTEXT_MENU_OPENPOWERSHELL - 此屬性控制用於將 Open PowerShell 項添加到 Windows 資源管理器中的上下文菜單的選項。
  • ADD_FILE_CONTEXT_MENU_RUNPOWERSHELL - 此屬性控制用於將 Run with PowerShell 項添加到 Windows 資源管理器中的上下文菜單的選項。
  • ENABLE_PSREMOTING - 此屬性控制用於在安裝過程中啓用 PowerShell 遠程處理的選項。
  • REGISTER_MANIFEST - 此屬性控制用於註冊 Windows 事件日誌記錄清單的選項。
  • ADD_PATH - 此屬性控制用於將 PowerShell 添加到 Windows PATH 環境變量的選項。
下面的示例展示瞭如何在啓用所有安裝選項的情況下無提示安裝 PowerShell。
msiexec.exe /package PowerShell-7.2.6-win-x64.msi /quiet ADD_EXPLORER_CONTEXT_MENU_OPENPOWERSHELL=1 ADD_FILE_CONTEXT_MENU_RUNPOWERSHELL=1 ENABLE_PSREMOTING=1 REGISTER_MANIFEST=1 USE_MU=1 ENABLE_MU=1 ADD_PATH=1
有關 Msiexec.exe 命令行選項的完整列表,請參閲命令行選項。
安裝 ZIP 包
提供有 PowerShell 二進制 ZIP 存檔,從而支持高級部署方案。 從當前版本頁下載以下 ZIP 存檔之一。
  • PowerShell-7.2.6-win-x64.zip
  • PowerShell-7.2.6-win-x86.zip
  • PowerShell-7.2.6-win-arm64.zip
根據該文件的下載方式,你可能需要使用 Unblock-File cmdlet 解鎖。 將內容解壓到你選擇的位置,然後從該位置運行 pwsh.exe。 與安裝 MSI 包不一樣,安裝 ZIP 存檔不會檢查先決條件。 為了讓使用 WSMan 的遠程處理能夠正常運行,請確保已滿足先決條件
使用此方法在類似於 Microsoft Surface Pro X 的計算機上安裝基於 ARM 的 PowerShell 版本。為獲得最佳結果,請將 PowerShell 安裝到 $env:ProgramFiles\PowerShell\7
文件夾。
作為 .NET 全局工具安裝
如果你已安裝 .NET Core SDK,則可以安裝 PowerShell 作為 .NET 全局工具。
dotnet tool install --global PowerShell
dotnet 工具安裝程序將 $env:USERPROFILE\.dotnet\tools 添加到 $env:PATH 環境變量中。 不過,當前運行的 shell 沒有更新後的 $env:PATH。 若要從新 shell 啓動 PowerShell,可以鍵入“pwsh”。
PowerShell 7.3 是基於 .NET 7.0 構建的下一個穩定版本。
PowerShell 7.3 包括以下功能、更新和中斷性變更。
Windows 10 IoT 企業版部署
Windows 10 IoT 企業版隨附 Windows PowerShell,可用來部署 PowerShell 7。
PowerShell複製
# Replace the placeholder information for the following variables: $deviceip = '<device ip address' $zipfile = 'PowerShell-7.2.6-win-Arm64.zip' $downloadfolder = 'u:\users\administrator\Downloads' # The download location is local to the device. # There should be enough space for the zip file and the unzipped contents. # Create PowerShell session to target device Set-Item -Path WSMan:\localhost\Client\TrustedHosts $deviceip $S = New-PSSession -ComputerName $deviceIp -Credential Administrator # Copy the ZIP package to the device Copy-Item $zipfile -Destination $downloadfolder -ToSession $S #Connect to the device and expand the archive Enter-PSSession $S Set-Location u:\users\administrator\Downloads Expand-Archive .\PowerShell-7.2.6-win-Arm64.zip # Set up remoting to PowerShell 7 Set-Location .\PowerShell-7.2.6-win-Arm64 # Be sure to use the -PowerShellHome parameter otherwise it tries to create a new # endpoint with Windows PowerShell 5.1 .\Install-PowerShellRemoting.ps1 -PowerShellHome .
設置 PowerShell 遠程處理時,你收到一條錯誤消息,並與設備斷開連接。 PowerShell 必須重啓 WinRM。 至此可以連接到設備上的 PowerShell 7 終結點
# Be sure to use the -Configuration parameter. If you omit it, you connect to Windows PowerShell 5.1 Enter-PSSession -ComputerName $deviceIp -Credential Administrator -Configuration PowerShell.7.2.6
Windows 10 IoT 核心版部署
當你添加 IOT_POWERSHELL 功能後,Windows 10 IoT 核心版便會添加 Windows PowerShell,我們可以使用它來部署 PowerShell 7。 對於 IoT 核心版,還可以遵循為 Windows 10 IoT 企業版定義的步驟。
若要在隨附映像中添加最新的 PowerShell,請使用 Import-PSCoreRelease 命令在工作區域中添加包,然後將 OPENSRC_POWERSHELL 功能添加到映像中。
備註
對於 ARM64 體系結構,在你添加 IOT_POWERSHELL 功能後,它不會添加 Windows PowerShell。 因此,基於 zip 的安裝將不起作用。 需要使用
Import-PSCoreRelease
命令將其添加到映像中。
在 Nano Server 上進行部署
為了更好地理解這些説明,假定 Nano Server 是已運行 PowerShell 版本的“無外設”操作系統。 有關詳細信息,請參閲 Nano Server 映像生成器文檔。
可以使用兩種不同的方法來部署 PowerShell 二進制文件
  1. 脱機 - 安裝 Nano Server VHD,並將 zip 文件的內容解壓到安裝映像中的所選位置。
  2. 聯機 - 通過 PowerShell 會話傳輸 zip 文件,並在所需位置中將其解壓。
在這兩種情況下,都需要 Windows x64 ZIP 版本包。 在 PowerShell 的“管理員”實例中運行命令
PowerShell 脱機部署
  1. 使用常用 zip 實用工具將包解壓到已安裝的 Nano Server 映像中的目錄。
  2. 卸載映像並啓動。
  3. 連接到 Windows PowerShell 的內置實例。
  4. 按照説明使用“另一種實例技術”創建遠程處理終結點。
PowerShell 聯機部署
若要將 PowerShell 部署到 Nano Server,請按照以下步驟操作。
# Replace the placeholder information for the following variables: $ipaddr = '<Nano Server IP address>' $credential = Get-Credential # <An Administrator account on the system> $zipfile = 'PowerShell-7.2.6-win-x64.zip' # Connect to the built-in instance of Windows PowerShell $session = New-PSSession -ComputerName $ipaddr -Credential $credential # Copy the file to the Nano Server instance Copy-Item $zipfile c:\ -ToSession $session # Enter the interactive remote session Enter-PSSession $session # Extract the ZIP file Expand-Archive -Path C:\PowerShell-7.2.6-win-x64.zip -DestinationPath 'C:\Program Files\PowerShell 7'
如果需要基於 WSMan 的遠程處理,請按照説明使用“另一種實例技術”創建遠程處理終結點。
PowerShell 遠程處理
PowerShell 同時支持採用 WSMan 和 SSH 的 PowerShell 遠程處理協議 (PSRP)。 有關詳細信息,請參閲:
  • 在 PowerShell 中進行 SSH 遠程處理
  • 在 PowerShell 中進行 WSMan 遠程處理
必須滿足以下先決條件才能在較低版本的 Windows 上通過 WSMan 啓用 PowerShell 遠程處理。
  • 安裝 Windows Management Framework (WMF) 5.1(根據需要)。 有關 WMF 的詳細信息,請參閲 WMF 概述。
  • 在低於 Windows 10 的 Windows 版本上安裝通用 C 運行時。 可以通過直接下載或 Windows 更新來獲取它。 完全修補的系統已安裝此包。
支持的 Windows 版本
下表列出了 PowerShell 版本以及支持它們的 Windows 版本。 這些版本在 PowerShell 版本到達支持終止日期或 Windows 版本到達支持終止日期之前受支持。
  • ✅ 指示仍支持 OS 或 PowerShell 版本
  • ❌ 指示不支持 OS 或 PowerShell 版本
  • 🟡 指示該 OS 版本不再支持 PowerShell 版本
  • 當 OS 版本和 PowerShell 版本都具有 ✅ 時,將支持該組合
Windows
7.0 (LTS)
7.1
7.2 (LTS-current)
7.3(預覽版)
✅ Windows Server 2016、2019 或 2022
🟡
✅Windows Server 2012 R2
🟡
✅ Windows Server Core(2012 R2 或更高版本)
🟡
✅ Windows Server Nano(1809 或更高版本)
🟡
❌Windows Server 2012
🟡
🟡
❌ Windows Server 2008 R2
🟡
🟡
✅ Windows 11
🟡
✅ Windows 10 1607+
🟡
✅ Windows 8.1
🟡
備註
對特定版本的 Windows 的支持由 Microsoft 支持部門生命週期策略決定。 有關詳細信息,請參閲:
  • Windows 客户端生命週期常見問題解答
  • 新式生命週期策略常見問題解答
以下處理器體系結構在 Windows 上支持 PowerShell。
Windows
7.0 (LTS)
7.2 (LTS-current)
7.3(預覽版)
Nano Server 版本 1803 及更高版本
x64、Arm32
X64
X64
Windows Server 2012 R2 及更高版本
x64、x86
x64、x86
x64、x86
Windows Server Core 2012 R2 及更高版本
x64、x86
x64、x86
x64、x86
Windows 10 or 11 客户端
x64、x86
x64、x86、Arm64
x64、x86、Arm64
Windows 8.1 客户端
x64、x86
x64、x86
x64、x86
可通過運行 winver.exe 來檢查所使用的版本。
安裝支持
Microsoft 支持本文檔中的安裝方法。 其他源可能會提供其他第三方安裝方法。 儘管這些工具和方法可能有效,但 Microsoft 無法支持這些方法。

Windows Power ShellWindows Powershell

Powershell 5.1 [17] 
重要!Skype for Business 2021 年 7 月 31 日停用了 Online。 如果尚未升級聯機Skype for Business,將自動安排這些用户進行輔助升級。 如果希望自行將組織升級到 Teams,強烈建議立即開始規劃升級路徑。 請記住,成功升級需要在技術準備和用户準備方面保持一致,因此在開始向 Teams 遷移時請確保使用我們的 升級指南。
如果使用的是 Windows 10 週年更新或 Windows Server 2016,則應已擁有 Windows PowerShell 5.1。 這是因為此應用程序隨這些操作系統預安裝。
要確定你使用的是什麼版本的 Microsoft PowerShell,請在 Windows 7 或 Windows Server 2008 R2 或 Windows Server 2012 計算機上執行以下步驟:
  1. 依次單擊“開始”、“所有程序”、“附件”和“Windows PowerShell”,然後單擊“Windows PowerShell”。
  2. 在 PowerShell 控制枱中,鍵入以下命令,然後按 ENTER:PowerShell複製Get-Host | Select-Object Version
  3. 控制枱窗口中隨後應顯示以下類似信息: Version ------- 4.0 如果返回的版本號為 5.1,表明正在運行 Windows PowerShell 5.1。 如果返回的版本號不是 5.1,則需要安裝 Windows PowerShell 5.1。 可從 Microsoft 下載中心下載 Windows Management Framework 5.1(其中包括 Windows PowerShell 5.1)。
驗證已安裝 Windows PowerShell 5.1 後,必須確保 PowerShell 已配置為可以運行遠程腳本。 為此,以管理員身份啓動 PowerShell。 在 Windows 7、Windows Server 2008 R2、Windows Server 2012 或 Windows Server 2012 R2 上執行以下操作:
  1. 單擊“啓動”,依次單擊“所有程序”、“附件”、“Windows PowerShell”,然後右鍵單擊“Windows PowerShell”,單擊“以管理員身份運行”。
  2. 如果顯示“用户帳户控制”對話框,單擊“”確定要通過管理員憑據運行 PowerShell。
如果運行的是 Windows 8,請完成此過程:
  1. 訪問超級按鈕欄,單擊“搜索”,然後右鍵單擊“Windows PowerShell”。可以通過按住 Windows 徽標鍵並按 C 來在任何 Windows 8 計算機(觸摸屏或非觸摸屏)上快速訪問超級按鈕欄。
  2. 在屏幕底部的工具欄中,單擊“以管理員身份運行”。
  3. 如果顯示“用户帳户控制”對話框,單擊“”確定要通過管理員憑據運行 PowerShell。
在 PowerShell 運行後,必須更改執行策略以允許運行遠程腳本。 在 PowerShell 控制台中,鍵入以下命令,然後按 ENTER:
Set-ExecutionPolicy RemoteSigned -Force
備註
運行上述命令後,可能會收到以下錯誤消息: > Set-ExecutionPolicy:對註冊表項“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Micrsoft.PowerShell”的訪問被拒絕。 如果未在管理員憑據下運行 PowerShell,則通常會出現此錯誤消息。 關閉 PowerShell 會話,並以管理員身份啓動新會話。
要驗證是否已正確配置執行策略,請在 PowerShell 提示符處鍵入以下內容,然後按 Enter:
Get-ExecutionPolicy
如果獲得以下值,則所有內容已正確配置:
RemoteSigned
如果當前未運行 Windows PowerShell 5.1,則還需要從 Microsoft 下載中心下載並安裝 Windows Management Framework 5.1。 這是一個安裝程序包,包含 Windows PowerShell 5.1 和 Windows 遠程管理 (WinRM) 3.0。 例如,如果運行的是 Windows 7 SP1,並且尚未更新到 Windows PowerShell 5.1,則可能需要此安裝程序包。 如果運行的是 Windows Server 2016 或 Windows 10 週年更新,則無需安裝 Windows PowerShell 5.1。 這些操作系統上預裝了 Windows PowerShell 5.1。
在安裝 Windows Management Framework 5.1 之前:
  • 確保已下載安裝程序包的正確版本。 如果運行的是 64 位版本的 Windows 7 SP1,請下載文件 Win7AndW2K8R2-KB3191566-x64.ZIP。 如果運行的是 32 位版本的 Windows 7,請下載文件 Win7-KB3191566-x86.ZIP。
  • 如果計算機正在運行 Windows 7,請確保已安裝 Windows 7 Service Pack 1。
如果不確定正在運行的 Windows 版本,或者不確定是否已安裝 Windows 7 Service Pack 1,請單擊“開始”,右鍵單擊“計算機”,然後單擊“屬性”。“系統”對話框中將報告此信息。
要安裝 Windows Management Framework 5.1,請完成安裝和配置 WMF 5.1 中的程序。
計算機重新啓動後,驗證 Windows PowerShell 是否可以啓動以及應用程序是否可在管理憑據下運行。如果要執行此操作:
  1. 單擊“啓動”,依次單擊“所有程序”、“附件”、“Windows PowerShell”,然後右鍵單擊“Windows PowerShell”,單擊“以管理員身份運行”。
  2. 如果顯示“用户帳户控制”對話框,單擊“”確定要通過管理員憑據運行 PowerShell。
當 PowerShell 控制枱出現時,應該驗證 WinRM 服務是否正在運行並且已正確配置。 要驗證服務是否正在運行,請在 PowerShell 提示符處鍵入以下命令,然後按 Enter:
Get-Service winrm
屏幕上將顯示有關 WinRM 服務的信息:Status Name DisplayName------ ---- -----------Running winrm Windows Remote Management (WS-Manag...
如果服務狀態不是“正在運行”,請通過鍵入以下命令並按 Enter 來啓動 WinRM 服務:
Start-Service winrm
服務啓動後,請運行以下命令以確保 WinRM 使用基本身份驗證
winrm set winrm/config/client/auth '@{Basic="True"}'
屏幕上將顯示以下類似信息:Auth Basic = true Digest = true Kerberos = true Negotiate = true Certificate = true CredSSP = false
如果基本身份驗證設置為 true,則可以開始使用 PowerShell 連接 Skype for Business Online。

Windows Power Shell新功能

(內容來自微軟官網)

Windows Power ShellPreview Release

Powershell 7.4 [19] 
PowerShell 7.4-preview.2 包括以下功能、更新和中斷性變更。 PowerShell 7.4 現基於 .NET 8.0.0-preview.2 構建。
有關完整的更改列表,請參閲 GitHub 存儲庫中的更改日誌。
中斷性變更
  • Nano Server Docker 映像不適用於此版本
  • 將 ProgressAction 參數添加到通用參數
  • 更新特定 PowerShell API,以便當參數為空字符串時引發 ArgumentException 而不是 ArgumentNullException (#19215)(感謝 @xtqqczze!)
安裝程序更新
Windows MSI 包現提供一種在安裝期間禁用 PowerShell 遙測的選項。 有關詳細信息,請參閲從命令行安裝 msi 包。
Tab 自動補全改進
非常感謝 @MartinGC94 在改進 Tab 自動補全方面的所有貢獻。
  • 解決在腳本中使用空數組表達式補全第一個命令時出現的問題 ([#18355)
  • 修復位置參數補全功能 (#17796)
  • 對補全位置參數時設置的默認形參設定優先級 (#18755)
  • 改進動態參數的偽綁定 (#18030)
  • 改進哈希表鍵的類型推理 (#17907)
  • 修復空返回語句的類型推理錯誤 (#18351)
  • 改進 Get-Random 的類型推理 (#18972)
  • 修復所有範圍變量的類型推理 (#18758)
  • 改進管道中推斷類型的枚舉 (#17799)
  • 在比較枚舉時為比較值添加補全功能 (#17654)
  • 為枚舉添加屬性分配補全 (#19178)
  • 修復 PSCustomObject 變量屬性的補全 (#18682)
  • 修復屬性參數中的成員補全功能 (#17902)
  • 修復具有基類型的類的類成員補全 (#19179)
  • 為 Using 關鍵字添加補全功能 (#16514)
Cmdlet 和引擎改進
更新 Web cmdlet - 非常感謝 @CarloToso 在改進 Web cmdlet 方面的貢獻。
  • 如果狀態代碼為 429,Web cmdlet 會從響應頭獲取 Retry-After 間隔 (#18717)
  • Web cmdlet 將默認字符集編碼設置為 UTF8 (#18219)
  • 將 WebSession.MaximumRedirection 保持不變 (#19190)
  • WebCmdlet 解析 XML 聲明來獲取編碼值(如果存在)。 (#18748)
  • 修復在沒有編碼的情況下在 webcmdlet 中使用 xml -Body 時出現的問題 (#19281)
  • 調整 PUT 方法行為,使其在 WebCmdlet 中對默認內容類型執行一次 POST (#19152)
  • 在 WebCmdlet 中考慮來自標頭的 ContentType (#19227)
  • 允許通過向 Web cmdlet 添加 -PreserveHttpMethodOnRedirect 來保留原始 HTTP 方法 (#18894)
  • Webcmdlet 在從 https 重定向 http 時顯示錯誤 (#18595)
  • 向 Web cmdlet 添加 AllowInsecureRedirect 開關 (#18546)
  • 改進當內容長度未知時 Web cmdlet 中的詳細消息 (#19252)
  • 根據 Invoke-WebRequest 中的響應生成鏈接的相對 URI (#19092)
  • 修復 WebCmdlet 中 -CustomMethod POST 的重定向 (#19111)
  • 釋放 Webcmdlet 中的先前響應 (#19117)
  • 改進 Invoke-WebRequest xml 和 json 錯誤格式 (#18837)
  • 下降 ValidateNotNullOrEmpty 添加到 WebCmdlet 的 OutFile 和 InFile 參數 (#19044)
  • HttpKnownHeaderNames 更新標頭列表 (#18947)
  • Invoke-RestMethod -FollowRelLink 修復包括逗號的鏈接 (#18829)
  • 修復在 Web cmdlet 中管理重定向和 KeepAuthorization 時的 bug (#18902)
  • 將 StatusCode 添加到 HttpResponseException (#18842)
  • 在 Web Cmdlet 中支持 HTTP 持久連接 (#19249)(感謝 @stevenebutler!)
其他 cmdlet
  • 將 Path 和 LiteralPath 參數添加到 Test-Json cmdlet (#19042)(感謝 @ArmaanMcleod!))
  • 將 NoHeader 參數添加到 ConvertTo-Csv 和 Export-Csv cmdlet (#19108)(感謝 @ArmaanMcleod!))
  • 向 Stop-Transcript 添加了 Confirm 和 WhatIf 參數 (#18731)(感謝 @JohnLBevan!)
  • 向 Get-Command 添加了 FuzzyMinimumDistance 參數 (#18261)
  • 使 Encoding 參數能夠在 PowerShell 中進行 ANSI 編碼 (#19298)(感謝 @CarloToso!))
  • 將 progress 添加到 Copy-Item (#18735)
  • 在非美國系統上使用隱式區域性時,Update-Help 會報告錯誤。 (#17780)(感謝 @dkaszews!)
  • 對 $PSStyle 的更新 添加了 Dim 和 DimOff 屬性 (#18653)
  • 向 PSStyle 類添加了靜態方法,用於將前台和後台 ConsoleColor 值映射到 ANSI 轉義序列 (#17938)
  • 通過實驗性功能添加了新格式設置屬性
其他引擎更新
  • 在聲明 NoRunspaceAffinity 屬性時使 PowerShell 類與 Runspace 不關聯 (#18138)
  • 添加了 ValidateNotNullOrWhiteSpace 特性 (#17191)(感謝 @wmentha!)
  • 向列表中添加了 sqlcmd 以使用舊參數傳遞 (#18559)
  • 添加了 cd~ 函數 (#18308)(感謝 @GigaScratch!)
實驗性功能
PowerShell 7.4 引入了以下實驗性功能:
  • PSCustomTableHeaderLabelDecoration - 為非屬性成員的表標題標籤添加格式區分。
    • 此功能還會向 $PSStyle.Formatting 添加 CustomTableHeaderLabel 屬性,以便更改標題標籤的格式。
  • PSFeedbackProvider - 將硬編碼的建議框架替換為可擴展的反饋提供程序。
    • 此功能還會向 $PSStyle.Formatting 添加 FeedbackProvider 和 FeedbackText 屬性,以便更改反饋消息的格式。
  • PSModuleAutoLoadSkipOfflineFiles - 模塊發現跳過了由雲提供商標記為不完全在磁盤上的文件。
  • PSCommandWithArgs - 現支持將參數作為單個字符串傳遞給命令
PowerShell 7.4 刪除了以下實驗性功能:
  • 已啓用功能時,將 PSNativeCommandErrorActionPreference - $PSNativeCommandUseErrorActionPreference 設置為 $true (#18695)
  • PSCommandNotFoundSuggestion - 此功能使用可擴展的反饋提供程序,而不是硬編碼的建議 #18726)
有關實驗性功能的詳細信息,請參閲使用實驗性功能。

Windows Power ShellStable Release

Powershell 7.3 [16] 
PowerShell 7.3 是基於 .NET 7.0 構建的下一個穩定版本。
PowerShell 7.3 包括以下功能、更新和中斷性變更。
重大更改和改進
  • 已在此版本中更新或刪除 Windows API 以實現合規性,這表示 PowerShell 7.3 不在 Windows 7 上運行。 雖然不再支持 Windows 7,但以前的版本可以在 Windows 7 上運行。
  • 適用於 Hyper-V 的 PowerShell Direct 僅在 Windows 10 版本 1809 及更高版本上受支持。
  • 由於 .NET 7 中有意的中斷性變更,導致 Test-Connection 中斷。 它由 #17018 跟蹤
  • 將 clean 塊作為 begin、process 和 end 的對等項添加到腳本塊,以便輕鬆清理資源 (#15177)
  • 將 $PSStyle.OutputRendering 的默認值更改為“Host”
  • 使 Out-String 和 Out-File 保持字符串輸入不變 (#17455)
  • 將 System.Security.AccessControl.ObjectSecurity 的類型數據定義移至 Microsoft.PowerShell.Security 模塊 (#16355)(感謝 @iSazonov!)
    • 在此更改之前,用户無需顯式導入 Microsoft.PowerShell.Security 模塊,即可使用為 System.Security.AccessControl.ObjectSecurity 實例定義的代碼屬性。
    • 在此更改之後,用户需要顯式導入 Microsoft.PowerShell.Security 模塊,才能使用這些代碼屬性和代碼方法。
Tab 自動補全改進
  • PowerShell 7.3 包括默認啓用預測性 IntelliSense 的 PSReadline 2.2.6。 有關詳細信息,請參閲 about_PSReadLine。
  • 修復了為 ValidateScriptAttribute 指定的腳本塊中的 Tab 自動補全。 (#14550)(感謝 @MartinGC94!)
  • 在 break/continue 後為循環標籤添加了 Tab 自動補全 (#16438)(感謝 @MartinGC94!)
  • 在多個方案中改進哈希表自動補全 (#16498)(感謝 @MartinGC94!)
    • 參數展開
    • Invoke-CimMethod 的 Arguments 參數
    • Get-WinEvent 的 FilterHashtable 參數
    • CIM cmdlet 的 Property 參數
    • 從成員完成方案中刪除重複項
  • 在網絡共享(UNC 路徑)自動補全中支持正斜槓 (#17111)(感謝 @sba923!)
  • 改進了成員自動補全 (#16504)(感謝 @MartinGC94!)
  • 為參數優先考慮 ValidateSet 自動補全,而不是枚舉 (#15257)(感謝 @MartinGC94!)
  • 為具有類型參數的泛型方法添加了類型推理支持 (#16951)(感謝 @MartinGC94!)
  • 改進了類型推理和自動補全 (#16963)(感謝 @MartinGC94!)
    • 允許在 ForEach-Object -MemberName 的完成結果中顯示方法
    • 阻止了返回 void 的表達式的完成(如 ([void]("")))
    • 允許非默認類構造函數在類完成基於 AST 時顯示
  • 改進了 $_ 的類型推理 (#17716)(感謝 @MartinGC94!)
  • 修復了 ICollection 的類型推理 (#17752)(感謝 @MartinGC94!)
  • 自動補全變量時防止大括號被移除 (#17751)(感謝 @MartinGC94!)
  • 為字典的索引表達式添加了自動補全 (#17619)(感謝 @MartinGC94!)
  • 修復了屬性令牌的類型自動補全 (#17484)(感謝 @MartinGC94!)
  • 改進了動態參數 Tab 自動補全 (#17661)(感謝 @MartinGC94!)
  • 避免在值前自動補全參數時綁定位置參數 (#17693)(感謝 @MartinGC94!)
改進了錯誤處理
  • 為具有重定向的命令表達式正確設置了 $? (#16046)
  • 修復了使用 $PSNativeCommandUseErrorActionPreference 時的強制轉換錯誤 (#15993)
  • 使本機命令錯誤處理可以選擇性遵守 ErrorActionPreference (#15897)
  • 將可執行文件路徑指定為非零退出代碼 ErrorRecord 的 TargetObject (#16108)(感謝 @rkeithhill!)
會話和遠程處理改進
  • 將 -Options 添加到 PSRP over SSH 命令,以允許直接傳遞 OpenSSH 選項 (#12802)(感謝 @BrannenGH!)
  • 將 -ConfigurationFile 參數添加到 pwsh 以允許使用 .pssc 文件中定義的會話配置啓動新進程 (#17447)
  • 添加對在非 Windows 平台上使用 New-PSSessionConfigurationFile 的支持 (#17447)
已更新的 cmdlet
  • 將 -HttpVersion 參數添加到 Web cmdlet 中 (#15853)(感謝 @hayhay27!)
  • 為 Web cmdlet 添加對開放式輸入標記的支持 (#16193)(感謝 @farmerau!)
  • 修復了 ConvertTo-Json -Depth 以允許最多 100 個 (#16197)(感謝 @KevRitchie!)@rkeithhill!)
  • 在使用 $using: 表達式調用 Invoke-Command 時改進變量處理 (#16113)(感謝 @dwtaber!)
  • 將 -StrictMode 添加到 Invoke-Command,以允許在本地調用命令時指定嚴格模式 (#16545)(感謝 @Thomas-Yu!)
  • 將 clean 塊作為 begin、process 和 end 的對等項添加到腳本塊,以便輕鬆清理資源 (#15177)
  • 將 -Amended 開關添加到 Get-CimClass cmdlet (#17477)(感謝 @iSazonov)
  • 已將 ConvertFrom-Json -AsHashtable 更改為使用有序哈希表 (#17405)
  • 在發送到 Out-GridView 之前,刪除了字符串中的 ANSI 轉義序列 (#17664)
  • 向 New-TimeSpan 添加了 Milliseconds 參數 (#17621)(感謝 @NoMoreFood!)
  • 顯示方法定義和重載時顯示可選參數 (#13799)(感謝 @eugenesmlv!)
  • 即使當前工作目錄不復存在,仍允許執行命令 (#17579)
  • 通過 Set-AuthenticodeSignature -TimeStampServer 添加對 HTTPS 的支持 (#16134)(感謝 @Ryan-Hutchison-USAF!)
  • 使用當前區域性在表中呈現十進制數 (#17650)
  • 為 OrderedDictionary 添加有序類型加速器 (#17804)(感謝 @fflaten!)
  • 將 find.exe 添加到 Windows 的舊參數綁定行為 (#17715)
  • 將 -noprofileloadtime 開關添加到 pwsh (#17535)(感謝 @rkeithhill!)
有關完整的更改列表,請參閲 GitHub 存儲庫中的更改日誌。
實驗性功能
在 PowerShell 7.3 中,以下實驗性功能成為主流:
  • PSAnsiRenderingFileInfo - 此功能添加 $PSStyle.FileInfo 成員,並啓用特定文件類型的着色。
  • PSCleanBlock - 將 clean 塊作為 begin、process 和 end 的對等項添加到腳本塊,以便輕鬆清理資源。
  • PSAMSIMethodInvocationLogging - 擴展發送到 AMSI 以供檢查的數據,以包括對 .NET 方法成員的所有調用。
  • PSNativeCommandArgumentPassing - PowerShell 使用 StartProcessInfo 對象的 ArgumentList 屬性,而不是在調用本機可執行文件時重建字符串的舊機制。PowerShell 7.3.1 將 sqlcmd.exe 添加到 Windows 中使用 Legacy 參數傳遞樣式的本機命令列表。
  • PSExec - 添加新的 Switch-Process cmdlet(別名 exec),為非 Windows 系統提供 exec 兼容性。PowerShell 7.3.1 將 exec 別名更改為包裝 Switch-Process 的函數。 利用該函數,將參數傳遞給可能錯誤地綁定到 WithCommand 參數的本機命令。
PowerShell 7.3 引入了以下實驗性功能:
  • PSNativeCommandErrorActionPreference - 添加 $PSNativeCommandUseErrorActionPreference 變量以使本機命令產生的錯誤成為 PowerShell 錯誤。
PowerShell 7.3 刪除了以下實驗性功能:
  • 不再支持 PSNativePSPathResolution 實驗性功能。
  • 不再支持 PSStrictModeAssignment 實驗性功能。
有關實驗性功能的詳細信息,請參閲使用實驗性功能。

Windows Power Shell目標受眾

Windows PowerShell 入門主要面向之前沒有 Windows PowerShell 背景知識的 IT 專業人員、程序員和高級用户。雖然具備腳本和 WMI 方面的背景知識會有所幫助,但是理解本文檔並不假定或要求您具備此方面知識。
關於 Windows PowerShell
通過解決長期存在的問題並添加一些新的功能,Windows PowerShell 旨在改進命令行和腳本環境。PowerShell以.NET Framework為平台,接收和返回.NET對象,此舉為管理和配置微軟系統帶來了新的方法和工具。

Windows Power Shell執行

Windows Power Shell執行Windows PowerShell

1.在Windows 操作系統裏,點擊開始->運行->輸入PowerShell,進入windows PowerShell。
2.在任意文件夾按住[shift]鍵單擊鼠標右鍵,選擇[在此處打開PowerShell窗口(S)]
3.按住[windows]+[R]鍵,輸入powershell [15] 
4.在命令指示符(cmd)中輸入powershell,在cmd中實現powershell的功能

Windows Power Shell執行Powershell

1.在Windows 操作系統裏,點擊開始->運行輸入pwsh,進入PowerShell。
2.按住[windows]+[R]鍵,輸入pwsh。 [15] 
3.在命令提示符(Command Prompt)中輸入powershell,在cmd中實現powershell的功能

Windows Power ShellPowerShell對應的Windows

在Windows 7中內置了PowerShell2.0, Windows 8中內置了PowerShell3.0,Windows 10,11中內置了PowerShell5.1,如果本機沒有添加,可在網上下載安裝包進行安裝,或者下載WebPI,通過WebPI安裝PowerShell。

Windows Power Shell產品特性

您可輕易發現 Windows Powershell 的功能。例如,若要查找用於查看和更改Windows 服務的cmdlet 列表,執行:開始->運行->cmd,在命令行下輸入 PowerShell 進入 windows PowerShell,再輸入如下命令:
get-command *-service
在發現可完成任務的 cmdlet 之後,可以使用 Get-Help cmdlet 瞭解有關該 cmdlet 的詳細信息。例如,若要顯示有關 Get-Service cmdlet 的幫助,請鍵入:
get-help get-service
若要充分理解該 cmdlet 的輸出,則可通過管道將其輸出傳遞給 Get-Member cmdlet。例如,以下命令將通過 Get-Service cmdlet 顯示有關該對象輸出的成員的信息。
get-service | get-member

Windows Power Shell一致性

管理系統可能是一項複雜的任務,而具有統一接口的工具將有助於控制其固有的複雜性。然而,無論是命令行工具還是可編寫腳本的 COM 對象,在一致性方面都乏善可陳。
Windows PowerShell 的一致性是其主要優點中的一項。例如,如果您學會了如何使用 Sort-Object cmdlet,則可利用這一知識對任何 cmdlet 的輸出進行排序。而無需瞭解每個 cmdlet 的不同的排序例程
此外,cmdlet 開發人員也不必為其 cmdlet 設計排序功能。Windows PowerShell 為他們提供了框架,而該框架可提供基本的功能,並強制他們在接口的許多方面保持一致。該框架雖然消除了通常會留給開發人員的某些選項,但作為回報,開發強健、易於使用的 cmdlet 的工作將更加簡單。

Windows Power Shell交互式腳本環境

Windows PowerShell 將交互式環境和腳本環境組合在一起,從而允許您訪問命令行工具和 COM 對象,同時還可利用 .NET Framework 類庫 (FCL) 的強大功能。
此環境對 Windows命令提示符進行了改進,後者提供了帶有多種命令行工具的交互式環境。此外,還對 Windows Script Host (WSH)腳本進行了改進,後者允許您使用多種命令行工具和 COM 自動對象,但未提供交互式環境。
通過將對所有這些功能的訪問組合在一起,Windows PowerShell 擴展了交互用户和腳本編寫者的能力,從而更易於進行系統管理

Windows Power Shell面向對象

儘管您可以通過以文本方式鍵入命令與 Windows PowerShell 進行交互,但 Windows PowerShell 是基於對象的,而不是基於文本的。命令的輸出即為對象。可以將輸出對象發送給另一條命令以作為其輸入。因此,Windows PowerShell 為未曾使用過其他外殼程序的人員提供了熟悉的界面,同時引入了新的、功能強大的命令行範例。通過允許發送對象(而不是文本),它擴展了在命令之間發送數據的概念。

Windows Power Shell易於過渡到腳本

使用 Windows PowerShell,您可以很方便地從以交互方式鍵入命令過渡到創建和運行腳本。您可以在 Windows PowerShell命令提示符下鍵入命令以找到可執行任務的命令。隨後,可將這些命令保存到腳本或歷史記錄中,然後將其複製到文件中以用作腳本。
識別你即將使用的Provider 通過識別PowerShell裏安裝的Provider,你就可以瞭解默認安裝下PowerShell提供了那些能力。 Provider可以使用一種簡單的訪問方式,暴露位於不同儲存位置的數據。就像是瀏覽不同磁盤上的目錄結構一樣簡單。 Provider把不同的信息存放位置,表示成“驅動器”-目錄這種結構,這樣很容易被用户所理解。就像我們要訪問一個位於D盤的WIN32目錄下的SETUP.exe文件,我們要通過瀏覽器,單擊D盤的圖標,然後選擇WIN32目錄並雙擊一樣,如果我們要訪問位於“註冊表”的數據,那麼我們也只需要簡單地通過Set-Location命令,來到到“REGISTRY”這個“驅動器”,然後用GET-CHILDITEM命令獲取其子數據就行了。
注:實際上,PowerShell訪問磁盤驅動器,也是通過Provider的,切換驅動器其實和切換其他數據容器是一樣地操作。 例如: Set-Location d:\ 這是切換驅動器 Set-Location HKLM:\ 這是切換到註冊表的HKLM鍵 另外,Get-PSprovider命令,可以查看當前已經安裝的所有PROVIDER。任何熟悉.NET編程的人,都可以編寫Provider。當新的provider被安裝後,就叫做snap-in。snap-in其實是一個動態連接庫dll文件,可以被安裝到powershell中。然而,當一個snap-in安裝後,卻沒有辦法卸載。 Get-PSProvider: Name Capabilities Drives ---- ------------ ------ Alias ShouldProcess {Alias} Environment ShouldProcess {Env} FileSystem Filter, ShouldProcess {C, D, F, A...} Function ShouldProcess {Function} Registry ShouldProcess {HKLM, HKCU} Variable ShouldProcess {Variable} Certificate ShouldProcess {cert} 這些就是我機器上的默認安裝後的provider。
使用Set-Location和Get-ChildItem瀏覽數據 Set-Location用於改變當前目錄,以及選擇當前的provider,而Get-ChildItem用於獲取當前目錄或者指定目錄下的子對象: 例子: set-location hkcu:\software get-childitem 例子2: GCI -path HKLM:\software
有兩種連接WMI服務的方法:l 使用Get-WmiObject可以很容易地連接到WMI服務,並且獲取WMI對象。 l 使用一個COM對象,“WbemScripting.SWbemLocator”,可以連接WMI的服務。SWbemLocator對象只有一個方法,就是ConnectServer()。該方法接受5個參數:用户名,密碼,語言代碼,驗證方法(Kerberos, NTLM等),標誌(超時值)。
下例中,我們使用New-Object命令,創建了一個“WbemScripting.SWbemLocator”的實例。然後用這個實例的ConnectServer方法連接了到了一個WMI的名字空間(root\cimv2),ConnectServer方法返回了一個WMIService對象,接着又用這個對象的subClassesOf()方法,返回了一系列WMI的CLASS: $strComputer = "." $wmiNS = "\root\cimv2" $strUsr ="" #Blank for current security. Domain\Username $strPWD = "" #Blank for current security. $strLocl = "MS_409" #US English. Can leave blank for current language $strAuth = "" #if specify domain in strUsr this must be blank $iFlag = "0" #only two values allowed: 0 and 128. $objLocator = New-Object -comobject "WbemScripting.SWbemLocator" $objWMIService = $objLocator.ConnectServer($strComputer, ` $wmiNS, $strUsr, $strPWD, $strLocl, $strAuth, $iFLag) $colItems = $objWMIService.subClassesOf() Write-Host "There are: " $colItems.count " classes in $wmiNS" foreach ($objItem In $colItems) { $objItem.path_.class }

Windows Power Shell新腳本語言

由於以下原因,Windows PowerShell 使用它自己的語言,而不是重用現有的語言:
Windows PowerShell 需要用於管理.NET 對象的語言。該語言需要為使用cmdlet 提供一致的環境。該語言需要支持複雜的任務,而不會使簡單的任務變得更復雜。 該語言需要與在.NET編程中使用的高級語言(如C#)一致。

Windows Power Shell1、PS1文件

一個PowerShell腳本其實就是一個簡單的文本文件,這個文件包含了一系列PowerShell命令,每個命令顯示為獨立的一行,對於被視為PowerShell腳本的文本文件,它的文件名需要使用.PS1擴展。

Windows Power Shell2、執行權限

為防止惡意腳本的執行,PowerShell有一個執行策略,默認情況下,這個執行策略被設為受限的(Restricted),意味着PowerShell腳本無法執行,你可以使用下面的cmdlet命令確定當前的執行策略:
Get-ExecutionPolicy 你可以選擇使用的執行策略有:
Restricted -腳本不能運行。 RemoteSigned - 本地創建的腳本可以運行,但從網上下載的腳本不能運行(除非它們擁有由受信任的發佈者簽署的數字簽名)。 AllSigned – 僅當腳本由受信任的發佈者簽名才能運行。 Unrestricted –腳本執行不受限制,不管來自哪裏,也不管它們是否有簽名。
你可以使用下面的cmdlet命令設置PowerShell的執行策略:
Set-ExecutionPolicy

Windows Power Shell3、運行腳本

如果你想從命令行運行一個可執行文件,多年來一個永恆不變的方法是,在命令行轉到該執行文件所在的位置,然後鍵入該執行文件的名稱,但這個古老的方法卻不能適用於PowerShell可執行腳本了。
如果你想執行一個PowerShell腳本,通常必須鍵入完整的路徑和文件名,例如,假設你要運行一個名為a.ps1的腳本,你可以鍵入:
C:\Scripts\aps1 最大的例外是,如果PowerShell腳本文件剛好位於你的系統目錄中,那麼你可以直接在命令提示符後鍵入腳本文件名即可運行,如:
.\a.ps1 注意前面需要加上.\,這和Linux下執行Shell腳本的方法如出一轍。

Windows Power Shell4、管道

管道的作用是將一個命令的輸出作為另一個命令的輸入,兩個命令(或cmdlet)之間只需要用管道符號(|)連接即可。
為了幫助你瞭解管道是如何工作的,我們以一個例子進行説明,假設你想創建運行在服務器上的進程列表,並按進程的ID號進行排序,可以使用Get-Process cmdlet命令獲得進程列表,但默認情況下列表不會排序,如果將這個cmdlet命令的輸出用管道輸送給Sort-Object ID命令,進程列表將會按進程ID號進行排序,如:
Get-Process | Sort-Object ID

Windows Power Shell5、變量

雖然可以使用管道將一個命令的輸出輸送給另一個命令,但管道本身也是有限制的,當你用管道從一個命令向另一個命令傳遞輸出結果時,輸出結果立即被使用,但有時候,你可能需要保存輸出結果一段時間,以便以後可以使用(或重用),這個時候管道就應該下場,輪到變量上場了。
人們很容易將變量想象成一個倉庫,但在PowerShell中,變量可以保存命令的完整輸出,例如,假設你想保存服務器處於運行中的進程列表,你可以將它賦給一個變量,如:
$a = Get-Process 在這裏,變量被命名為$a,如果你想使用這個變量,只需要簡單地調用它的名稱即可,例如,鍵入$a便可在屏幕上打印變量的內容。
你可以將多個用管道連接的命令的最終輸出賦給一個變量,只需要用一對小括號將命令括起來即可,例如,假設你想按進程ID對運行中的進程進行排序,然後將結果輸出給一個變量,你可以使用下面這個命令:
$a = (Get-Process | Sort-Object ID)

Windows Power Shell6、@符號

通過使用@符號,你可以將列表內容轉換成一個數組,例如,下面的代碼創建了一個名為$Procs的變量,它包含多行文本內容(一個數組):$procs = @{name="explorer","svchost"}
使用變量時你也可以使用@符號,為了確保它作為數組而不是單個值處理,例如,下面的代碼將在我前面定義的變量上運行Get-Process cmdlet命令:
Get-Process @procsWindows將顯示Windows資源管理器和Svchost使用的所有進程,注意變量前使用的@符號,而不是常見的$符號。

Windows Power Shell7、Split

Split操作符根據你指定的字符拆分一個文本字符串,例如,假設你想將一個句子拆分成一個單詞組成的一個數組,你可以使用下面的命令做到:
"This is a test" -split " " 拆分後的結果如下:
This is a test

Windows Power Shell8、Join

就像Split可以將一個文本字符串拆分成多塊一樣,Join的操作則是逆向的,將多個獨立的塊連接成一個整體,例如,下面這行代碼將會創建一個文本字符串,由我的名字和姓氏組成:
"Brien","Posey" -join " " 命令末尾雙引號之間的空格告訴Windows在兩個文本字符串之間插入一個空格。

Windows Power Shell9、斷點

運行一個新創建的PowerShell腳本時,如果腳本有Bug,會遇到意想不到的後果,保護自己的一個方法是在腳本的關鍵位置插入斷點,這樣你就可以確保腳本正常運行先,然後再處理可能存在的問題。
插入斷點最簡單的方法是根據行號插入,例如,假設你要在第10行插入一個斷點,可以使用下面的命令:
New-PSBreakpoint -Script C:\Scripts\a.ps1 -Line 10 你也可以將斷點綁定到變量上,如果你希望你的腳本任何時候都可以修改a$的內容,可以使用下面的命令:
New-PSBreakpoint -Script C:\scripts\a.ps1 -variables a 注意,我在變量名後並沒有包括美元符號。
可以和PSBreakpoint一起使用的動詞包括New,Get,Enable,Disable和Remove。

Windows Power Shell10、Step

調試一個腳本時,有時可能需要逐行運行腳本,這時你可以使用Step-Into cmdlet命令,它會使腳本一行一行地執行,不管有沒有設置斷點,如果你想從這種步進式運行模式退出來,使用Step-Out cmdlet命令即可,但需要注意的是,使用Step-Out cmdlet命令後,斷點仍然有效。
順便説一句,如果你的腳本使用了函數,你可能對Step-Out cmdlet更感興趣,Step-Out的工作方式和Step-Into一樣,不過,如果調用了一個函數,Windows不會逐步執行,整個函數將會一次性執行。

Windows Power Shell優缺點

Windows Power Shell優點

PowerShell v3將在PowerShell上打造管理的大部分,也提供GUI管理選項以及命令行自動化。v3引入了一些相當重要的新功能。

Windows Power Shell更好的遠程處理

PowerShell遠程已經逐漸成為在網絡上進行管理通信的主要渠道。越來越多的GUI管理控制枱將依賴遠程,因此加強PowerShell遠程對微軟很重要。現在能夠斷開遠程會話,稍後能從同個或不同的計算機重新連接到相同的會話。客户端計算機崩潰的話,v3的社區技術預覽版不能斷開會話。相反,會話會永久關閉。所以這與遠程桌面完全不同,遠程桌面會話能在客户端崩潰時配置並打開會話。

Windows Power Shell工作流

本質上,PowerShell新的工作流構建能寫入與功能類似的東西,使用PowerShell翻譯命令和腳本代碼到Windows工作流技術WWF進程中。WWF然後能管理整個任務,包括修復網絡故障與重啓計算機等。它是編排長期運行的、複雜的、多步驟任務的更有效更可靠的一種方式。如果這個功能與下一個版本的System Center Orchestrator集成。

Windows Power Shell可更新的幫助

PowerShell與幫助文件中的錯誤做鬥爭。微軟需要發佈一個操作系統補丁。基於TechNet站點的在線幫助的存在減輕了這個問題,但杯水車薪。在v3中,幫助文件能按需更新,從任何微軟服務器都可下載新的XML文件。所以微軟就能根據找到的問題進行錯誤修復,不需要操作系統包或補丁。

Windows Power Shell預定任務

owerShell v2引入了job,遵循的是job隨着時間擴展的理念。在v3中,新型job即scheduled job能被創建並按計劃運行,或者相應某個事件。這與Windows的Task Scheduler的區別只是其中一小點,不過最終用户能從PowerShell中獲得這個功能。

Windows Power Shell更好的發現

關於命令行shell的一個困難部分在於如何使用。PowerShell的幫助系統很有用,需要提供用户想知道的命令的名字,並提供命令所在的插件名字,並記得加載附件到內存中。而PowerShell v3在搜索命令時,包含所有安裝模塊的所有命令,shell會運行沒有裝載的命令。這隻能在那些存儲在列於PSModulePath環境變量中的文件路徑中的模塊有用。如果要包含額外路徑,可以在任何時候修改變量。

Windows Power Shell額外功能:CIM

PowerShell與Windows管理規範WMI運作很好,WMI是微軟的一項技術,或多或少建立在標準的通用信息模塊CIM上。在PowerShell v3中,WMI cmdlet發揮餘熱,加入到新的CIM cmdlet集中。功能看起來似乎有重疊:CIM cmdlet使用WS-MAN,這個協議位於PowerShell的Remoting功能,微軟管理功能的新標準的後面。WMI使用被微軟正式棄用的DCOM,意味着不會再開發新功能,但可一直使用。CIM是未來的方向,不僅有對已知WMI的額外開發,而且在未來還可跨平台管理

Windows Power Shell缺點

PowerShell v3
新的Hyper-V 3.0 cmdlets不能管理老版本的Hyper-V。這意味着管理員根據Hyper-V的不同必須採用不同的腳本去管理,直至完成所有宿主機的升級。
Hyper-V 3.0和老版本不兼容。使用老版本Hyper-V的管理員需要從CodePlex下載PowerShell Library for Hyper-V。

Windows Power Shell創建事件日誌

管理員可以使用PowerShell創建一個新的事件日誌,還可以查看事件日誌的狀態。
管理員可以使用PowerShell輕鬆地添加一個新的事件日誌,例如,可以使用下面的代碼創建一個名為TestSource的新的應用程序事件日誌。
New-EventLog -LogName Application -Source TestSource
如果將信息寫入該Windows事件日誌中只需要調用EventLog的WriteEntry方法。具體代碼如下:
Write-EventLog -LogName Application -EventId 1234 -Source TestSource -Message "Test write"
另外,你還可以通過使用Windows PowerShell快速查看關鍵Windows事件日誌的配置狀態和事件的數量。
Get-EventLog cmdlet裏提供了-List參數,可顯示出每個事件日誌文件最大值和OverflowAction,以及日誌的數量。
下面看一則實例,輸入cmdlet,按返回鍵得出以下內容:
PS C:\> Get-EventLog -List
Max(K) Retain OverflowAction Entries Log
------ ------ -------------- ------- ---
512 7 OverwriteOlder 149 ACEEventLog
20,480 0 OverwriteAsNeeded 38,796 Application
20,480 0 OvjerwriteAsNeeded 0 HardwareEvents
512 7 OverwriteOlder 0 Internet Explorer
20,480 0 OverwriteAsNeeded 0 Key Management Service
15,360 0 OverwriteAsNeeded 12,655 Operations Manager
20,480 0 OverwriteAsNeeded 36,084 Security
20,480 0 OverwriteAsNeeded 23,408 Systemb
15,360 0 OverwriteAsNeeded 18,305 Windows PowerShell
[1] 

Windows Power ShellPowerShell 5.0

Windows PowerShell 5.0中包含了大量的新特性和新功能,提升了整體的用户體驗。

Windows Power Shell遠程文件編輯功能

管理員暫時可以通過PowerShell建立與另一個Windows服務器的遠程會話。新的遠程文件編輯功能在此基礎之上進行構建,從而能夠建立一個遠程會話,然後在遠程計算機上編輯文件。

Windows Power Shell期望狀態配置

PowerShell期望狀態配置(DSC)是2013年下半年發佈的Windows 8.1Windows Server 2012 R2最終版本中默認自帶的一個功能。它是一個基於標準Web服務的配置管理系統,允許你按照自己的方式對機器進行配置。
對於不熟悉期望狀態配置的用户來説,改善後的功能允許管理員對比Windows服務器的期望狀態,如果服務器出現問題並偏離了理想的配置,利於管理員及時採取修正措施。期望狀態配置功能已經存在一段時間了,但微軟添加了一個新的參數。新參數允許對期望狀態配置功能設置節流閥限制。該理念在於期望狀態配置功能通常與大量服務器同時運行。這樣做會消耗大量的系統資源。節流閥限制允許管理員限制期望狀態配置的併發數量,從而限制系統資源消耗。
也許PowerShell 5.0最受歡迎的一個變化是其接口——不是命令集。批評人士認為Windows PowerShell的複製粘貼功能可以產生一些不可預知的結果。微軟已經完全修改了複製和粘貼的工作方式。 [2] 
PowerShell期望狀態配置內置於Windows Server,所以它沒有購買許可和系統管理、配置部署軟件管理實例的額外開支。b
PowerShell期望狀態配置幾乎不需要代理,需求只是安裝好PowerShell,並且可以通過80或者443端口查詢Web服務器來抓取配置信息,這裏不需要額外的配置系統管理開銷。
PowerShell期望狀態配置看起來只是配置文件定義的功能。它忽略其他設置,使配置負載更加輕巧和加速其他部署,這樣它就可以定義多個配置和堆疊工d作負載(一台Web服務器也充當文件服務器,並且可以獲取沒有文件服務器設置覆蓋的Web服務器的設置),這類部署是許多系統管理套件無法很容易地應付,甚至完全不能處理。 [3] 

Windows Power ShellPush模式和Pull模式的配置

PowerShell DSC的基本原則是使用定義所需配置的兩種模式,這樣管理員既可以自定義地有間隔地使機器從中央存儲庫獲取正確配置信息,也可以將這類信息推送回去。
Push模式是一個主動的配置模式運行方式,當你發出“Start-DscConfiguration –Computername –Path”的PowerShell命令並且鍵入的命令帶有“-Path”的屬性時,就會立即觸發存在任何位置的基於文件存儲的系統配置推送出去。這幾乎是一種即時執行“現在就做”的方式來管理你放在中央存儲位置的所有配置文件目標和需求,這些文件可以讓你計劃的目標機器去訪問。這個需要你設置經常去觸發推動,並且默認配置不會自己檢測。
Pull模式有一點點被動;它需要一台服務器同時為配置文件和其它為計算機各方面配置充當中介角色的構件提供清算服務。舉個例子,在你編v寫一個自定義服務提供程序——可以提供使用PowerShell DSC的一段代碼——它可以轉換本地自定義業務應用程序的配置文件中的指令。Pull服務器只是一台運行IIS的服務器,而IIS可以發佈OData。OData是一種典型、明確定義以及標準支持的界面,通過這個界面PowerShell的Web 服務器可以獲取到真正的配置數據。因此,Pull模式是實施PowerShell DSC最常用的方式,也可以用來部署當配置遠離期望狀態並且超時的情況。PowerShell DSC定期運行,下發正確的配置,執行靜默的進程來更改配置為期望狀態。
以上的這些配置定義都集成在管理對象文件或者MOF 文件,基本上都是一些文本文件,像一系列的classes,或者是一些PowerShell 配置引擎可以讀懂的與Windows操作系統有關的一些元素,抑或是一些可以定義期望配置的classes參數。這裏提供一些.MvOF配置行文件的參考:
instance of PowerPlan as $PP
{
ResourceID = "[PowerPlan] Default::[BaseServer]JustTheBasics::[VirtualServer]VMWare";
SourceInfo = "C:\\windows\\system32\\WindowsPowerShell\\v1.0\\Modules\\SELocalConfiguration\\StackExchangeConfiguration\\StackExchangeConfiguration.psm1::20::5::PowerPlan";
Name = "High performance";
ModuleName = "PowerPlan";
ModuleVersion = "1.0";
};
MOF文件通常是手動建立一次,然後根據需求進行復制和粘貼。對於檢測這個配置涉及的安裝、移除或者確保某些Windows角色和功能是否已經存在,你可以使用內置命令Get-DscResource來檢測。這個命令會根據你所以給出的角色或者功能名稱,抓取出它們的正確使用語法和其他可用選項。例如,如運行上面的命令,就會顯示PowerShell期望狀態配置可以操作的“區域”配置類型,你可以在每個區域裏面執行這一類的任務和任務指令。
Name Properties
---- ----------
File {DestinationPath, Attributes, Checksum, Con...
Archive {Devstination, Path, Checksum,z Credential...}
Environment {Name, DependsOn, Ensure, Path...}
Group {GroupName, Credential, DependsOn, Descript...
Log {Message, DependsOn}
Package {Name, Path, ProductId, Arguments...}
Registry {Key, ValueName, DependsOn, Ensure...}
Script {GetScript, SetScript, TestScript, Credenti...
Service {Name, BuiltInAccovunt, Credential, DependsO...
User {UserName, DependsOn, Description, Disabled...
WindowsFeature {Name, Credential, DependsOn, Ensure...}
WindowsProcess {Arguments, Path, Credential, DependsOn...}
正如你所看到的,這裏有關於操作系統各方面的屬性,從角色和功能到腳本、註冊設置、認證,你都可以使用DSC來做控制。
這些都是PowerShell期望狀態配置的基本要素。獲取更多信息,查詢PowerShell.org,特別是有標記的DSC資源 [4] 

Windows Power Shell在遠程服務器上運行

Windows Power Shell在用户管理和維護Windows方面是一個強大的命令行環境。雖然Windows Power Shell是一個本地管理工具,但是它也用於管理遠程服務器。事實上,管理員可以針對大量的服務器創建Windows Power Shell腳本來執行管理任務。Invoke-Command和New-PSSession都是在遠程服務器中Windows Power Shell的執行命令。

Windows Power ShellInvoke-Command

如果你只需要針對單台或者多台遠程v服務器執行一個Windows Power Shell命令(或者一系列的管道命令),那麼最便利的方法就是Windows Power Shell使用Invoke-Command命令。Microsoft的文檔列出了絕大多數的參數和語法,導致人人皆知Invoke-Command命令的複雜性。即使如此,使用Invoke-Command在遠程系統上執行Windows Power Shell命令仍然出奇地容易。
對於基本的Windows Power Shell遠程命令執行,你只需要提供遠程計算機的名稱和想要執行的代碼塊。假設你想要在名稱為Production1的遠程服務器上執行Get-VM命令,你可以使用下面的Windows Power Shell命令:
Invoke-Command –ComputerName Production1 {Get-VM}
雖然Windows Power Shell看起來很簡單,但是你也要對使用這個方法瞭解以下幾點。
首先,Invoke-Command命令不限制你在一個遠程系統上執行命令,你可以在多個計算機上指定命令,你需要做的就是使用命令區分開這些計算機的名稱。例如,在Production1,Production2和Production3計算機上執行命令如下:
Invoke-Command –ComputerName Production1, Production2, Production3 {Get-VM}
第二點,你必須要知道雖然這個方式的設計目的只是簡單地在單個遠程系統上運行的單一Windows Power Shell命令,但是你也可以運行多個Windows Power Shell命令。如果查看之前的Windows Power Shell幾行代碼,你會注意到允許在遠程計算機上運行的Get-VM命令是包含在花括號裏面的。任何在花括號裏面的Windows Power Shell命令都會在指定的遠程計算機行運行。同樣的,只要所有的Windows Power Shell命令都包含在花括號裏面,你可以使用管道符號把Windows Power Shell命令把它們鏈接在一起。
第三點你必須知道上面的Windows Power Shell語法只有在所有計算機中使用了Kerberos認證才會運行,同時包括有命令輸入和已經加入了域。否則,你必須使用HTTPS傳輸,並且必須指定遠程系統是受信任的主機。

Windows Power ShellNew-PSSession

New-PSSession通常用於在遠程系統上執行Windows Power Shell命令。Invoke-Command命令設計於用於在遠程系統上執行單一Windows Power Shell命令(或者一連串的Windows Power Shell命令),而New-PSSession實際上是用於在遠程服務器上重定向PowerShell。實質上,你輸入的任何Windows Power Shell命令都會自動發送到遠程機器上運行。
例如Invoke-Command命令,這裏有許多不同的New-PSSession命令變量,你可以從Microsoft官網文檔中尋找這些變量。
這個命令如此簡易,它只要求提供遠程計算機的名稱。例如,如果你想和名為Production1的計算機建立一個會話,你可以使用以下Windows Power Shell命令:
New-PSSession –ComputerName Production1
這個Windows Power Shell命令會與指定的計算機建立會話,但是它不會自動重定向任何你在遠程計算機輸入的執行PowerShell命令;原因是Microsoft並不限制你只使用一個遠程會話。你可能需要和多個不同的服務器建立回話。因此,輸入上述命令建立一個Windows Power Shell會話,PowerShell會提供確認的會話,也會羅列出一個會話ID號,但僅此而已。
如果你想要使用遠程會話,那麼你將不得不使用另一個名為 Enter-PSSession的Windows Power Shell,只是簡單地附件上你想連接到會話ID號即可。例如,如果有一個連接到Production1,且會話ID為列名1的New-PSSession會話,你就可以輸入一下命令來連接這個會話:
Enter-PSSession 1
當你在使用這個Windows Power Shell命令時,PowerShell會提示你為這個遠程系統更改一個相關的名稱,這樣你就可以很輕鬆地跟蹤你正在發送命令的系統了。
並且,你需要確保使用了Kerberos認證,所有的系統都已經加入了域。否則,想要建立遠程會話,你需要多加幾個額外的步驟。
正如你所見到的,PowerShell讓遠程服務器上的命令執行更加容易,尤其是當你所有的服務器和工作站屬於同一個域時。 [5] 

Windows Power Shell註銷RDP

Windows Power Shell已經不是一個新的問題了:終端Windows Power Shell用户通過遠程桌面協議登錄到一台Windows服務器後忘記退出,然後繼續消耗服務器上的資源。這時,你可以使用Windows Power Shell腳本來強制終端用户註銷並釋放這些資源。
Windows Power Shell為了強迫用户註銷遠程桌面協議(RDP)會話,管理員必須首先了解該服務器上所有遠程桌面服務(RDS)服務器會話,並查看它們的狀態。檢測所有服務均斷開連接後,下一步才是強制下線。
下載Windows Power Shell模塊PSTerminalServices,並確保在你的Windows Power Shell環境中可以使用。所有的安裝説明都可在PSTerminalServices站點獲得。
第一步,我要用這個Windows Power Shell模塊來檢查是否能得到實驗室服務器HYPERV上的所有會話活動(圖1.1)。
圖1.1 圖1.1
圖1.1. Get-TSSession -ComputerName HYPERV
此時,只有幾個Windows Power Shell會話處於斷開狀態。所以,可以看到所有的Windows Power Shell會話,但是隻是想看到那些斷開連接的Windows Power Shell。要做到這一點,將添加State參數(圖1.2)。
圖1.2 圖1.2
圖1.2. Get-TSSession -ComputerName HYPERV -State Disconnected
這個Windows Power Shell方法很有用,但是仍然有一個問題。會話0不是一個RDP會話,無法用Get-TSSession將其從結果列表中刪除。這時,使用Where-Object來刪除該會話(圖1.3)。
圖1.3 圖1.3
圖1.3. Get-TSSession -ComputerName HYPERV -State Disconnected | where { $_.SessiocnID -ne 0 }
可以看到所有想停止的Windows Power Shell會話。接下來,只需要停止這些Windows Power Shell會話。要做到這一點,要知道PSTerminalServices模塊提供了Stop-TSSession cmdlet,可以幫你停止Windows Power Shell會話(圖1.4)。
圖1.4 圖1.4
圖1.4. Get-TSSession -ComputerName HYPERV -State Disconnected | where {$_.SessionID -ne 0} | Stop-TSSession
Stop-TSSession cmdlet結束Windows Power Shell會話後可能會導致最終用户丟失工作內容,因此會提示管理員。這裏可以點擊“A”繼續下一步,但有時管理員不喜歡彈出Windows Power Shell提示信息。如果將這些放在一個更大的Windows Power Shell腳本中,提示將中斷Windows Power Shell腳本。最好的辦法是省略提示。
Stop-TSSession cmdlet有一個通用的Windows Power Shell參數,叫做–Force,Windows Power Shell允許管理員執行操作時沒有任何確認信息打擾。
Get-TSSession -ComputerName HYPERV -State Disconnected | where {$_.SessionID -ne 0} | Stop-TSSession -Force
如果Windows Power Shell沒有輸出,説明Windows Power Shell會話已成功註銷。 [6] 

Windows Power Shell管理多個服務器

對於使用Windows Power Shell及以上版本的大型微軟應用軟件環境下的系統管理員,很有可能日常都會面臨管理Windows Power Shell角色管理的問題。Windows Power Shell服務器允許管理員通過點擊功能窗口按鈕來增加、刪除或修改系統角色和功能,但是點擊功能窗口大部份操作對於管理員來説不是自動完成的。這就是Windows Power Shell發揮作用的地方。
Windows Power Shell服務管理器是一個單獨創建的用於管理服務器標識和系統信息的圖形化用户界面(GUI)區域。Windows Power Shell通過管理接口允許管理員針對某個服務,Windows Power Shell通過點擊功能鍵執行各種工作。雖然這種方法適合用於小規模的應用環境,但Windows Power Shell不適合大規模集羣下的應用環境。通過Windows Power Shell命令行的方式就以簡化這些操作。
Windows Power Shell有一個叫“ServFerManager”的模塊,它包含了許多可以幫助管理系統角色和功能的命令(圖2.1)。
圖2.1 圖2.1
圖2.1. Windows Power Shell服務管理模塊
將以2個別名和5個實際的Windows Powfer Shell命令和函數為例。為了更簡潔,在文章中我們將直接使用這些命令/函數名字。開始之前,使用“Get-Windows Feature”命令確認系統中所有可用的系統角色和功能。
當不加參數地使用“Gevt-Windows Feature”命令,Windows Power Shell會輸出系統中所有的系統角色和功能—不論Windows Power Shell是否在系統中安裝。圖2.2展示了在測試系統中的一些可用的功能。
圖2.2 圖2.2
圖2.2. 以“Get-Windows Feature”命令的一些選項為例
Windows Power Shell對於系統中已經安裝系統功能,可以使用“Where-Object”命令查看。
如果想安裝一個新的Windows Power Shell系統功能,應怎樣做呢?可以使用“Install-Windows Feature”命令。例如想在我的本地服務器上安裝SNMP服務,我可以使用“Install-Windows Feature”命令並且加上名字參數。如圖2.5表示Windows Power Shell功能服務已安裝完成。
圖2.4 圖2.4
圖2.4. SNMP服務功能已安裝完成
可以使用“Remove-Windows Feature”命令來刪除某些Windows Power Shell系統功能。刪除Windows Power Shell系統功能就像安裝Windows Power Shell某個功能一樣容易,即加上命令的Name參數就行。
圖2.5 圖2.5
圖2.5. 使用“Remove-Windows Feature”命令刪除Windows Power Shell系統下的某個功能
在圖形化界面操作時需注意必須重啓Windows Power Shell服務器才能完成刪除某個系統功能。如果使用Windows Power Shell命令腳本的方式,可以不通過手動操作完成。“Install-Windows Feature”和“Remove-W?indows Feature”命令都有“remove”參數。如果有必要,Windows Power Shell可以執行完命令後自動重啓服務器。
如果只有一台單獨的Windows Power Shell服務器,本地化操作沒有問題,但是可以通過使用Windows Power Shell服務管理器以相似的方式對多台Windows Power Shell服務器進行操作管理。使用Windows Power Shell遠程管理功能,管理員可以使用“Computername”參數指定對遠程任一個服務器進行操作,如圖2.6:
圖2.6 圖2.6
圖2.6. 使用ComputerName參數用於指定執行任務的遠程服務器
如果想同時在100台Windows Power Shell服務器上安裝一個Windows Power Shell系統功能應該怎樣操作呢?如果把服務器信息寫入一個文本文件中後,這就不是問題。如果在服務端有一個包含了Windows Power Shell服務器名字CSV文件,可以使用Windows Power Shell import命令來讀取csv文件內容並且可以併發執行任何對Windows Power Shell系統功能的操作命令。
Import-Csv C:\Servers.csv | foreach { Install-WindowsFeature -Name 'SNMP-Service' -ComputerName $_.ServerName }
以上的命令可以從CSV文件中讀取每個Windows Power Shell服務器名並且同時在每台服務器安裝上SNMP服務。 [7] 

Windows Power Shell控制IT權限

在Windows Power Shell受攻擊面方面,IT安全專家經常談論的話題是Windows Power Shell服務器和應用程序。儘管Windows Power Shell的大部分安全工作都是為了強化操作系統和應用程序以減少可能的受攻擊面,但是有可能IT員工自己本身會成為受攻擊面。
很多Windows Power Shell網絡攻擊利用了惡意軟件來獲取受害者系統的訪問權限。像很多其他的軟件一樣,Windows Power Shell惡意軟件也會受限於當前的安全環境。比如説,一個擁用基本Windows Power Shell用户權限的用户不小心運行了一個惡意軟件會比一個管理員運行這個惡意軟件帶來的損壞小得多。
IT專家長期接受移除管理員Windows Power Shell權限來提高安全性的方法,但是剝奪所有IT員工的管理員Windows Power Shell權限並不是一個實用的方法。IT員工一定要有相應必需的Windows Power Shell權限來執行他們的工作。
這就是需要用到Just Enough Administration的地方了。Just Enough Administration( JEA) 是一個Windows Power Shell工具包來幫助企業組織限制管理員權限,以提供自身Windows Power Shell整體安全性。
JEA是一種基於角色的訪問控制形式。主要的方法是精確地授予IT員工他們工作必需的Windows Power Shell權限,不多也不少。即使如此,JEA也和傳統的基於Windows Power Shell身份的訪問控制不一樣,傳統的訪問控制是基於一份詳盡的權限集合。而相比之下,JEA是基於限制某個用户能運行的Windows Power Shell然後限制用户以管理員的身份連接目標服務器。
這就引出了一個Windows Power Shell問題,即一個標準用户如何在沒有Windows Power Shell權限的情況下去執行Windows Power Shell任務呢?理解它工作原理的關鍵在於,要意識到用户從來不會直接登陸服務器控制枱。用户會登錄進一個標準的工作站,然後使用JEA PowerShell工具包與被管理的Windows Power Shell服務器建立遠程會話。用户登陸的時候會使用自己被限制的Windows Power Shell賬號密碼,但操作的時候會利用Run As賬户來執行任何需要Windows Power Shell更高權限的操作。
從表面上看,如果使用Run As賬户這種方式並不會比直接給用户賬號授予Windows Power Shell權限更好。但是這兩種賬號之間有非常重要的區別:一個被賦予Windows Power Shell權限的用户賬號基本上算是一個域管理員。使用JEA 的Run As賬户是被管理服務器本地的。這個賬户不會有域管理權限,這也意味着這個用户不能通過網絡進行Windows Power Shell管理員授權的傳遞。
Just Enough Administration PowerShell工具包不僅僅依賴對用户賬號的創新使用來提高安全性,它同時也限制了用户允許執行的Windows Power Shell。這可以保證用户可以運行他工作需要的cmdlets,但是不會有額外的cmdlets。
Just Enough Administration包含了創建一個到被Windows Power Shell管理服務器的遠程會話。Windows Power Shell遠程會話可以通過會話配置文件或者腳本來進行限制。Just Enough Administration工具包運行允許這些限制以簡單的文本文件來配置,這可以控制Windows Power Shell用户被授權運行哪些PowerShell cmdlets。Just Enough Administration工具包同時也可以被設置執行審計的功能。那樣的話,如果一個Windows Power Shell用户嘗試非授權的行為,這個行為會被阻止並且記錄下來以待查看。
Just Enough Administration工具包可以很大程度上地提供企業內部的安全性,Windows Power Shell用户只能執行某些設置好的管理員任務。使用這個工具集的最大缺點是它是面向Windows Power Shell的。Windows Power Shell可以作為一款管理工具來使用,但是使用它需要用户進行一定時間的學習。 [8] 

Windows Power Shell期望狀態配置-DSC

Windows Power Shell期望狀態配置(DSC)是2013年下半年發佈的Windows 8.1和Windows Server 2012 R2最終版本中默認自帶的一個功能。Windows Power Shell是一個基於標準Web服務的配置管理系統,Windows Power Shell允許你按照自己的方式對機器進行配置,介紹什麼是Windows Power Shell DSC,並將展示它是如何工作的,以及Windows Power Shell可以完成怎樣的任務,達到怎樣的目標。
許多管理員第一次聽説Windows Power Shell工具時就想了解關於Windows Power Shell的一些背景和問題:在試驗或真實系統管理解決方案如System Center或者其他第三方工具上使用Windows Power Shell期望狀態配置的意義是什麼?其有很多優勢,但是其中有三點是最為突出的。
Windows Power Shell期望狀態配置內置於Windows Server,所以Windows Power Shell沒有購買許可和系統管理、配置部署軟件管理實例的額外開支。
Windows Power Shell期望狀態配置幾乎不需要代理,需求只是安裝好Windows Power Shell,並且可以通過80或者443端口查詢Web服務器來抓取配置信息,這裏不需要額外的配置系統管理開銷。
Windows Power Shell期望狀態配置看起來只是配置文件定義的功能。Windows Power Shell忽略其他設置,使配置負載更加輕巧和加速其他部署,這樣Windows Power Shell就可以定義多個配置和堆疊工作負載(一台Web服務器也充當文件服務器,並且Windows Power Shell可以獲取沒有文件服務器設置覆蓋的Web服務器的設置),這類部署是許多系統管理套件無法很容易地應付,甚至完全不能處理。
Push模式和Pull模式
Windows Power Shell DSC的基本原則是使用定義所需配置的兩種模式,這樣管理員既可以自定義地有間隔地使機器從中央存儲庫獲取正確配置信息,也可以將這類Windows Power Shell信息推送回去。
Windows Power Shell的Push模式是一個主動的配置模式運行方式,當你發出的Windows Power Shell命令並且鍵入的命令帶有“-Path”的屬性時,Windows Power Shell就會立即觸發存在任何位置的基於文件存儲的系統配置推送出去。這幾乎是一種即時執行“現在就做”的方式來管理你放在中央存儲位置的所有配置文件目標和需求,這些文件可以讓你計劃的目標機器去訪問。這個需要你設置經常去觸發Windows Power Shell推動,並且默認配置不會自己檢測。
Windows Power Shell的Pull模式有一點點被動;Windows Power Shell需要一台服務器同時為配置文件和其它為計算機各方面配置充當中介角色的構件提供清算服務。舉個例子,在你編寫一個自定義服務提供程序——可以提供使用Windows Power Shell DSC的一段代碼——Windows Power Shell可以轉換本地自定義業務應用程序的配置文件中的指令。Windows Power Shell的Pull服務器只是一台運行IIS的服務器,而IIS可以發佈OData。OData是一種典型、明確定義以及標準支持的界面,通過這個界面Windows Power Shell的Web 服務器可以獲取到真正的配置數據。因此,Pull模式是實施Windows Power Shell DSC最常用的方式,也可以用來部署當配置遠離期望狀態並且超時的情況。Windows Power Shell DSC定期運行,下發正確的配置,執行靜默的進程來更改配置為期望狀態。
以上的Windows Power Shell配置定義都集成在管理對象文件或者MOF 文件,基本上都是一些文本文件,像一系列的classes,或者是一些Windows Power Shell 配置引擎可以讀懂的與Windows操作系統有關的一些元素,抑或是一些可以定義期望配置的classes參數。
Windows Power Shell的MOF文件通常是手動建立一次,然後根據需求進行復制和粘貼。Windows Power Shell對於檢測這個配置涉及的安裝、移除或者確保某些Windows角色和功能是否已經存在,你可以使用內置命令Get-DscResource來檢測。這個Windows Power Shell命令會根據你所以給出的角色或者功能名稱,抓取出它們的正確使用語法和其他可用選項。
這些都是Windows Power Shell期望狀態配置的基本要素。 [9] 

Windows Power Shell控制NTFS權限

儘管Windows Power Shell包含一系列本地用來配置存儲的cmdlet,但配置NTFS權限的能力明顯有限。幸運的是,微軟提供了一種利用Windows Power Shell來檢索和配置NTFS權限的方法,但是你需要提前下載並安裝一個Windows Power Shell專用模塊。
所需的模塊是文件系統安全Windows Power Shell模塊。將文件複製到Windows Power Shell模塊文件夾中的NTFSSecurity文件夾下。默認情況下,Windows Power Shell模塊文件夾路徑
將Windows Power Shell模塊複製到相應的文件夾後,可以通過使用下面的Windows Power Shell命令來驗證模塊的可用性
假設NTFS模塊出現在列表裏,
記住,除非你已經利用Set-ExecutionPolicy cmdlet更改了服務器的執行策略,否則上面這條Windows Power Shell命令將生成一個錯誤消息,告訴你係統上的Windows Power Shell腳本是禁止運行的。
輸入執行策略後,你就擁有NTFS權限了。
然而,每次需要使用權限的時候都必須輸入NTFSSecurity模塊。
假設我在服務器上創建了文件夾C:\Data 。接着,假如想查看這個Windows Power Shell文件夾的訪問控制列表條目,
上面命令列出每個訪問文件夾的賬户/安全組訪問權限、應用權限、權限類型以及IsInherited和InheritedFrom標誌(見圖3.1)。
圖3.1 圖3.1
圖3.1. 通過Windows Power Shell查看NTFS權限
授予Windows Power Shell文件夾訪問權限與查看現有權限一樣簡單。你需要使用Add-NTFSAccess cmdlet。另外還需要指定路徑、賬户和訪問權限。這裏使用例子説明。假設“Everyone”都能安全訪問到C:\Data文件夾。
現在,我已經添加了Windows Power Shell權限,讓每個人都能訪問C:\Data,並且利用Get-NTFSAccess cmdlet驗證權限(圖3.2)。
圖3.2 圖3.2
圖3.2. Windows Power Shell任何人可訪問
即使能夠將Windows Power Shell權限授權給所有人,通常來説必須確認Windows Power Shell賬户位置(圖3.2)。例如,一些已有的權限位置為BUILTIN或NT AUTHORITY。在實際操作中,通常會指定一個Windows Power Shell連帶用户組名或用户名的域名。例如,如果你想授權訪問Contoso域中的Finance組,那麼賬户名為Contoso\Finance。
Windows Power Shell刪除NTFS權限有點棘手。接着上面的例子,你必須確認Windows Power Shell路徑、賬户名稱以及打算刪除的Windows Power Shell權限。
該Windows Power Shell命令有點棘手的原因在於,你無法刪除Windows Power Shell繼承權限。而且,刪除的Windows Power Shell權限必須與分配給該帳户的Windows Power Shell權限準確匹配。如果匹配失誤,則命令無效。
因為有時難以完全精準匹配權限,所以使用幾個命令一起刪除權限會更加方便。假如你想刪除C:\Data文件夾Everyone的所有權限,不必手工匹配權限,你可以使用Windows Power Shell讀取該權限然後進行刪除該。
如果你想從整個Windows Power Shell文件夾樹中刪除權限,可以遞歸使用該命令(圖3.3)。
圖3.3 圖3.3
圖3.Windows Power Shell 刪除Everyone權限 [10] 

Windows Power ShellPowerShell的作用

PowerShell中包含了大量的新特性和新功能,PowerShell提升了整體的用户體驗。雖然PowerShell中一些功能只能供硬核PowerShell開發人員使用,但PowerShell其他新功能和特性具有廣泛的適用性
PowerShell另一個改善的功能是期望狀態配置。對於不熟悉PowerShell期望狀態配置的用户來説,PowerShell改善後的功能允許管理員對比Windows服務器的期望狀態,如果PowerShell服務器出現問題並偏離了理想的配置,利於管理員及時採取修正措施。

Windows Power ShellPowerShell節流閥限制

PowerShell新版中的期望狀態配置功能語法與以前版本相同,但有一點差異。微軟已經引入了一個名為–ThrottleLimit的命令行開關。PowerShell命令行開關後跟隨期望狀態配置操作所需的最大數量

Windows Power ShellPowerShell細微變化

PowerShell中複製粘貼存在的一個大問題是,如果你選擇多行代碼複製,PowerShell會單獨複製每行,PowerShell不會複製整個代碼塊。例如,如果你複製一條長達四行的命令,然後粘貼到PowerShell界面,PowerShell會在每行之間插入換行符,這會導致錯誤信息
PowerShell接口的另一個惱人的問題是,如果你縮放窗口,一部分命令有時會被隱藏到窗口的邊界之外。在PowerShell中,縮小窗口時其中的文本不會發生隱藏,並且適應新窗口的大小。 [11] 

Windows Power Shell免費的PowerShell資源與工具

Windows Power ShellPowerGUI

PowerGUI,由Quest Software公司研發(戴爾的一部分),基本上是一個GUI,開發PowerShell腳本時,圍繞PowerShell提供更多的可見性以及附加功能。PowerGUI無疑為我們提供了一些重要的特性,可以幫助我們創建和編輯PowerShell腳本。
PowerGUI中一個有用的部分是代碼片段。代碼片段是可重複利用的代碼塊,編寫代碼時很容易將它們插入腳本。試想一下如下的場景,你會發現自己在腳本上重複輸入類似的代碼。例如,聲明函數是開發代碼片段的一個主要目標。
下一個有用的部分PowerGUI稱之為變量探針。變量探針允許在腳本中擴展和審視你所使用的局部變量。想知道哪個屬性或方法需要使用特定對象?動態變量探針允許你查看這些屬性,連同腳本中同一界面相應的值。變量探針可以真正地節省時間。
接下來我們看看升級包擴展。這些升級包本質上説是給你一個表示各自應用程序的圖形,可以只用鼠標逐字地編寫腳本。例如,使用虛擬化升級包,你可以在一個樹類型接口瀏覽虛擬機和主機,並生成不同的腳本報告以及管理你的環境。除了vSphere之外,你還可以找到集中在Active Directory、SQL、Sharepoint的擴展。
最後,還有選項卡完成和語法高亮顯示。相比其他,這雖然不是一個龐大的功能,但很受開發人員歡迎。除了命令中的顯示卡完成,通過自動顯示選項卡完成呈現給我們需要尋找的參數,一切都變得簡單。在高亮顯示方面,PowerGUI強調類似的語法,使腳本更容易閲讀並且能更容易地識別不同區域。

Windows Power Shell管理腳本編輯器

大多數PowerShell腳本編寫僅僅基於文本並在PowerShell控制枱執行。即便如此,有時我希望可以在一些腳本中包裝一個GUI,與他人共享腳本,幫助那些對“命令行”不太精通的人。
在PowerShell上創建GUI不是為了意志薄弱的人——通常它產生數百行代碼,需要在屏幕上負責控制的地方指定值x和y軸的值。之後,你還要完成在控制中添加事件處理程序和操作的艱鉅任務。值得慶幸的是,有一個應用程序可以為我們做這一切,在一個很好的拖放界面。該應用程序被稱為管理腳本編輯器(ASE)。
ASE的歷史是獨一無二的。它曾經是一個付費的、完全支持腳本編輯的應用程序,然而,當其他編輯器上市,ASE決定關閉商店並免費發佈最終版本。ASE和PowerGUI一樣,也是一個腳本編輯器和開發環境,在PowerShell腳本中創建GUI包裝和形式時,我傾向於僅僅使用它。ASE有一個獨特的拖放界面,允許你輕鬆地設計包含不同控件的形式,比如文本框、下拉組合框日曆日期選擇器等。除此之外,它還創建了點擊更改事件的功能按鈕和輸入。

Windows Power ShellPowerCLI社區

對於所有PowerCLI網站來説,虛擬化網站上的PowerCLI社區網站資源最豐富。在這裏你可以找到所有PowerCLI文檔的鏈接,可以下載並在論壇上提問。從我的經驗可以告訴你,在這個論壇上提問,從來沒有置之不理的情況。當天得到問題回覆是很常見的。除了破壞或修復,以及提問信息,論壇還包含一個文檔部分,包括100種以上不同的腳本,虛擬化員工以及合作伙伴和客户都曾參與編寫,這些腳本可供大家下載。在PowerCLI社區,你應該可以找到任何需要的東西。

Windows Power ShellProject Onyx

在PowerCLI上執行一個特定任務,需要想出一些合適的語法很困難嗎?你知道如何完成vSphere客户機的任務嗎?如果是這樣,Onyx項目可以幫助你。Onyx項目在虛擬化中很受歡迎,基本上充當vSphere客户機和vCenter服務器之間的代理服務器。運行和安裝Onyx很簡單,可以在vSphere客户機上執行任務。Onyx會將所有已經完成的操作轉化為vCO Javascript或虛擬化 PowerCLI/PowerShell語法。在這裏你可以簡單複製代碼、修改和使用。Onyx項目很棒,當你試圖弄清楚如何在PowerCLI完成特定的vSphere任務但卻無能為力時,它可以幫你一把。

Windows Power ShellGoogle

無論是谷歌還是其他你鍾情的搜索引擎,它都可以提供幫助。儘管谷歌不是實際的PowerCLI資源,索引器和網關可以幫助你找到數以百萬計的腳本,這些腳本在互聯網論壇、博客,、項目和網站隨處可見。PowerShell和PowerCLI的好處是簡單易讀,進而使他們容易理解,但更重要的是具有可編輯性。 [12] 

Windows Power Shell自動化服務器

Windows Power Shell是微軟Windows操作系統中一款強大的操作工具。Windows Power Shell的版本隨Windows的發佈而更新。
Windows Power Shell帶來了很多有助於管理員的新功能,最顯著的是增強了自動化功能。讓我們一起來看看Windows Power Shell是如何通過自動化讓Windows服務器管理員的生活變得簡單的。 [13] 

Windows Power Shell建立

Windows Power Shell裝載Windows Server 2012 R2安裝鏡像的USB 3.0U盤,以及由Windows系統映像管理器創建的XML文件。

Windows Power Shell設置

Windows Power Shell服務器需要靜態IP地址,但設置起來比較麻煩。使用Windows Power Shell第三方工具可以簡化這一過程。雖然有點冗長,但遠比Netsh命令更具可讀性。
Windows Power Shell在網卡上設置一個靜態的DNS服務器地址只需要使用第三方工具。Windows Power Shell只需要知道分配給哪個網卡以及DNS服務器的IP地址 [14] 
參考資料
展開全部 收起