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運行時間也能嵌入到其它應用。

正文


目標受眾

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

執行PowerShell


在Windows 操作系統里,點擊開始->運行->輸入PowerShell,進入windows PowerShell。在Windows 7中內置了PowerShell2.0, Windows 8中內置了PowerShell3.0。如果本機沒有添加,可在網上下載安裝包進行安裝,或者下載WebPI,通過WebPI安裝PowerShell。

產品特性


您可輕易發現 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
一致性
管理系統可能是一項複雜的任務,而具有統一介面的工具將有助於控制其固有的複雜性。然而,無論是命令行工具還是可編寫腳本的 COM 對象,在一致性方面都乏善可陳。
Windows PowerShell 的一致性是其主要優點中的一項。例如,如果您學會了如何使用 Sort-Object cmdlet,則可利用這一知識對任何 cmdlet 的輸出進行排序。而無需了解每個 cmdlet 的不同的排序常式。
此外,cmdlet 開發人員也不必為其 cmdlet 設計排序功能。Windows PowerShell 為他們提供了框架,而該框架可提供基本的功能,並強制他們在介面的許多方面保持一致。該框架雖然消除了通常會留給開發人員的某些選項,但作為回報,開發強健、易於使用的 cmdlet 的工作將更加簡單。
互動式腳本環境
Windows PowerShell 將互動式環境和腳本環境組合在一起,從而允許您訪問命令行工具和 COM 對象,同時還可利用 .NET Framework 類庫 (FCL) 的強大功能。
此環境對 Windows命令提示符進行了改進,後者提供了帶有多種命令行工具的互動式環境。此外,還對 Windows Script Host (WSH)腳本進行了改進,後者允許您使用多種命令行工具和 COM 自動對象,但未提供互動式環境。
通過將對所有這些功能的訪問組合在一起,Windows PowerShell 擴展了交互用戶和腳本編寫者的能力,從而更易於進行系統管理。
面向對象
儘管您可以通過以文本方式鍵入命令與 Windows PowerShell 進行交互,但 Windows PowerShell 是基於對象的,而不是基於文本的。命令的輸出即為對象。可以將輸出對象發送給另一條命令以作為其輸入。因此,Windows PowerShell 為未曾使用過其他外殼程序的人員提供了熟悉的界面,同時引入了新的、功能強大的命令行範例。通過允許發送對象(而不是文本),它擴展了在命令之間發送數據的概念。
易於過渡到腳本
使用 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 PowerShell 使用它自己的語言,而不是重用現有的語言:
Windows PowerShell 需要用於管理.NET 對象的語言。該語言需要為使用cmdlet 提供一致的環境。該語言需要支持複雜的任務,而不會使簡單的任務變得更複雜。該語言需要與在.NET編程中使用的高級語言(如C#)一致。
1、PS1文件
一個PowerShell腳本其實就是一個簡單的文本文件,這個文件包含了一系列PowerShell命令,每個命令顯示為獨立的一行,對於被視為PowerShell腳本的文本文件,它的文件名需要使用.PS1擴展。
2、執行許可權
為防止惡意腳本的執行,PowerShell有一個執行策略,默認情況下,這個執行策略被設為受限的(Restricted),意味著PowerShell腳本無法執行,你可以使用下面的cmdlet命令確定當前的執行策略:
Get-ExecutionPolicy 你可以選擇使用的執行策略有:
Restricted -腳本不能運行。 RemoteSigned - 本地創建的腳本可以運行,但從網上下載的腳本不能運行(除非它們擁有由受信任的發布者簽署的數字簽名)。 AllSigned – 僅當腳本由受信任的發布者簽名才能運行。 Unrestricted –腳本執行不受限制,不管來自哪裡,也不管它們是否有簽名。
你可以使用下面的cmdlet命令設置PowerShell的執行策略:
Set-ExecutionPolicy
3、運行腳本
如果你想從命令行運行一個可執行文件,多年來一個永恆不變的方法是,在命令行轉到該執行文件所在的位置,然後鍵入該執行文件的名稱,但這個古老的方法現在卻不能適用於PowerShell可執行腳本了。
如果你想執行一個PowerShell腳本,通常必須鍵入完整的路徑和文件名,例如,假設你要運行一個名為a.ps1的腳本,你可以鍵入:
C:\Scripts\aps1 最大的例外是,如果PowerShell腳本文件剛好位於你的系統目錄中,那麼你可以直接在命令提示符后鍵入腳本文件名即可運行,如:
.\a.ps1 注意前面需要加上.\,這和Linux下執行Shell腳本的方法如出一轍。
4、管道
管道的作用是將一個命令的輸出作為另一個命令的輸入,兩個命令(或cmdlet)之間只需要用管道符號(|)連接即可。
為了幫助你了解管道是如何工作的,我們以一個例子進行說明,假設你想創建運行在伺服器上的進程列表,並按進程的ID號進行排序,可以使用Get-Process cmdlet命令獲得進程列表,但默認情況下列表不會排序,如果將這個cmdlet命令的輸出用管道輸送給Sort-Object ID命令,進程列表將會按進程ID號進行排序,如:
Get-Process | Sort-Object ID
5、變數
雖然可以使用管道將一個命令的輸出輸送給另一個命令,但管道本身也是有限制的,當你用管道從一個命令向另一個命令傳遞輸出結果時,輸出結果立即被使用,但有時候,你可能需要保存輸出結果一段時間,以便以後可以使用(或重用),這個時候管道就應該下場,輪到變數上場了。
人們很容易將變數想象成一個倉庫,但在PowerShell中,變數可以保存命令的完整輸出,例如,假設你想保存伺服器處於運行中的進程列表,你可以將它賦給一個變數,如:
$a = Get-Process 在這裡,變數被命名為$a,如果你想使用這個變數,只需要簡單地調用它的名稱即可,例如,鍵入$a便可在屏幕上列印變數的內容。
你可以將多個用管道連接的命令的最終輸出賦給一個變數,只需要用一對小括弧將命令括起來即可,例如,假設你想按進程ID對運行中的進程進行排序,然後將結果輸出給一個變數,你可以使用下面這個命令:
$a = (Get-Process | Sort-Object ID)
6、@符號
通過使用@符號,你可以將列表內容轉換成一個數組,例如,下面的代碼創建了一個名為$Procs的變數,它包含多行文本內容(一個數組):$procs = @{name="explorer","svchost"}
使用變數時你也可以使用@符號,為了確保它作為數組而不是單個值處理,例如,下面的代碼將在我前面定義的變數上運行Get-Process cmdlet命令:
Get-Process @procsWindows將顯示Windows資源管理器和Svchost使用的所有進程,注意變數前使用的@符號,而不是常見的$符號。
7、Split
Split操作符根據你指定的字元拆分一個文本字元串,例如,假設你想將一個句子拆分成一個單片語成的一個數組,你可以使用下面的命令做到:
"This is a test" -split " " 拆分后的結果如下:
This is a test
8、Join
就像Split可以將一個文本字元串拆分成多塊一樣,Join的操作則是逆向的,將多個獨立的塊連接成一個整體,例如,下面這行代碼將會創建一個文本字元串,由我的名字和姓氏組成:
"Brien","Posey" -join " " 命令末尾雙引號之間的空格告訴Windows在兩個文本字元串之間插入一個空格。
9、斷點
運行一個新創建的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。
10、Step
調試一個腳本時,有時可能需要逐行運行腳本,這時你可以使用Step-Into cmdlet命令,它會使腳本一行一行地執行,不管有沒有設置斷點,如果你想從這種步進式運行模式退出來,使用Step-Out cmdlet命令即可,但需要注意的是,使用Step-Out cmdlet命令后,斷點仍然有效。
順便說一句,如果你的腳本使用了函數,你可能對Step-Out cmdlet更感興趣,Step-Out的工作方式和Step-Into一樣,不過,如果調用了一個函數,Windows不會逐步執行,整個函數將會一次性執行。

優缺點


優點

PowerShell v3
PowerShell v3將在PowerShell上打造管理的大部分,也提供GUI管理選項以及命令行自動化。v3引入了一些相當重要的新功能。
更好的遠程處理
PowerShell遠程已經逐漸成為在網路上進行管理通信的主要渠道。越來越多的GUI管理控制台將依賴遠程,因此加強PowerShell遠程對微軟很重要。現在能夠斷開遠程會話,稍後能從同個或不同的計算機重新連接到相同的會話。客戶端計算機崩潰的話,v3的社區技術預覽版不能斷開會話。相反,會話會永久關閉。所以這與遠程桌面完全不同,遠程桌面會話能在客戶端崩潰時配置並打開會話。
本質上,PowerShell新的工作流構建能寫入與功能類似的東西,使用PowerShell翻譯命令和腳本代碼到Windows工作流技術WWF進程中。WWF然後能管理整個任務,包括修復網路故障與重啟計算機等。它是編排長期運行的、複雜的、多步驟任務的更有效更可靠的一種方式。如果這個功能與下一個版本的System Center Orchestrator集成。
可更新的幫助
PowerShell與幫助文件中的錯誤做鬥爭。微軟需要發布一個操作系統補丁。基於TechNet站點的在線幫助的存在減輕了這個問題,但杯水車薪。在v3中,幫助文件能按需更新,從任何微軟伺服器都可下載新的XML文件。所以微軟就能根據找到的問題進行錯誤修復,不需要操作系統包或補丁。
預定任務(Scheduled Job)
owerShell v2引入了job,遵循的是job隨著時間擴展的理念。在v3中,新型job即scheduled job能被創建並按計劃運行,或者相應某個事件。這與Windows的Task Scheduler的區別只是其中一小點,不過最終用戶能從PowerShell中獲得這個功能。
更好的發現
關於命令行shell的一個困難部分在於如何使用。PowerShell的幫助系統很有用,需要提供用戶想知道的命令的名字,並提供命令所在的插件名字,並記得載入附件到內存中。而PowerShell v3在搜索命令時,包含所有安裝模塊的所有命令,shell會運行沒有裝載的命令。這隻能在那些存儲在列於PSModulePath環境變數中的文件路徑中的模塊有用。如果要包含額外路徑,可以在任何時候修改變數。
額外功能:CIM
PowerShell與Windows管理規範WMI運作很好,WMI是微軟的一項技術,或多或少建立在標準的通用信息模塊CIM上。在PowerShell v3中,WMI cmdlet發揮餘熱,加入到新的CIM cmdlet集中。功能看起來似乎有重疊:CIM cmdlet使用WS-MAN,這個協議位於PowerShell的Remoting功能,微軟管理功能的新標準的後面。WMI使用被微軟正式棄用的DCOM,意味著不會再開發新功能,但可一直使用。CIM是未來的方向,不僅有對已知WMI的額外開發,而且在未來還可跨平台管理。

缺點


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

創建事件日誌


管理員可以使用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

Windows PowerShell 5.0


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

遠程文件編輯功能

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

期望狀態配置

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

Push模式和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資源

在遠程伺服器上運行Power Shell命令


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

Invoke-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傳輸,並且必須指定遠程系統是受信任的主機。

New-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認證,並且所有的系統都已經加入了域。否則,想要建立遠程會話,你需要多加幾個額外的步驟。
正如你所見到的,PowerShezll讓遠程伺服器上的命令執行更加容易,尤其是當你所有的伺服器和工作站屬於同一個域時。

使用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)。
Windows Power Shell
Windows Power Shell
圖1. Get-TSSession -ComputerName HYPERV
目前,只有幾個Windows Power Shell會話處於斷開狀態。所以,可以看到所有的Windows Power Shell會話,但是只是想看到那些斷開連接的Windows Power Shell。要做到這一點,將添加State參數(圖2)。
Windows Power Shell
Windows Power Shell
圖2. Get-TSSession -ComputerName HYPERV -State Disconnected
這個Windows Power Shell方法很有用,但是仍然有一個問題。會話0不是一個RDP會話,無法用Get-TSSession將其從結果列表中刪除。這時,使用Where-Object來刪除該會話(圖3)。
Windows Power Shell
Windows Power Shell
圖3. Get-TSSession -ComputerName HYPERV -State Disconnected | where { $_.SessiocnID -ne 0 }
現在,可以看到所有想停止的Windows Power Shell會話。接下來,只需要殺死這些Windows Power Shell會話。要做到這一點,要知道PSTerminalServices模塊提供了Stop-TSSession cmdlet,可以幫你殺死Windows Power Shell會話(圖4)。
Windows Power Shell
Windows Power Shell
圖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會話已成功註銷。

使用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”的模塊,它包含了許多可以幫助管理系統角色和功能的命令(圖1)。
Windows Power Shell
Windows Power Shell
圖1. Windows Power Shell服務管理模塊
將以2個別名和5個實際的Windows Powfer Shell命令和函數為例。為了更簡潔,在文章中我們將直接使用這些命令/函數名字。開始之前,使用“Get-Windows Feature”命令確認系統中所有可用的系統角色和功能。
當不加參數地使用“Gevt-Windows Feature”命令,Windows Power Shell會輸出系統中所有的系統角色和功能—不論現在Windows Power Shell是否在系統中安裝。圖2展示了在測試系統中的一些可用的功能。
Windows Power Shell
Windows Power Shell
圖2. 以“Get-Windows Feature”命令的一些選項為例
Windows Power Shell對於現在系統中已經安裝系統功能,可以使用“Where-Object”命令查看(圖3)。
圖3. Where-Object命令輸出測試系統已安裝的功能
如果想安裝一個新的Windows Power Shell系統功能,應怎樣做呢?可以使用“Install-Windows Feature”命令。例如想在我的本地伺服器上安裝SNMP服務,我可以使用“Install-Windows Feature”命令並且加上名字參數。如圖5表示Windows Power Shell功能服務已安裝完成。
圖4. SNMP服務功能已安裝完成
可以使用“Remove-Windows Feature”命令來刪除某些Windows Power Shell系統功能。刪除Windows Power Shell系統功能就像安裝Windows Power Shell某個功能一樣容易,即加上命令的Name參數就行。
Windows Power Shell
Windows Power Shell
圖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”參數指定對遠程任一個伺服器進行操作,如圖6:
Windows Power Shell
Windows Power Shell
圖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服務。

使用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可以作為一款管理工具來使用,但是使用它需要用戶進行一定時間的學習。

Windows Power Shell期望狀態配置


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伺服器的設置),這類部署是許多系統管理套件無法很容易地應付,甚至完全不能處理。

Windows Power Shell的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期望狀態配置的基本要素。

Windows Power Shell控制NTFS許可權


Windows Power Shell
Windows Power Shell
儘管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標誌(見圖1)。
圖1. 通過Windows Power Shell查看NTFS許可權
Windows Power Shell
Windows Power Shell
授予Windows Power Shell文件夾訪問許可權與查看現有許可權一樣簡單。你需要使用Add-NTFSAccess cmdlet。另外還需要指定路徑、賬戶和訪問許可權。這裡使用例子說明。假設“Everyone”都能安全訪問到C:\Data文件夾。
現在,我已經添加了Windows Power Shell許可權,讓每個人都能訪問C:\Data,並且利用Get-NTFSAccess cmdlet驗證許可權(圖2)。
圖2. Windows Power Shell任何人可訪問
Windows Power Shell
Windows Power Shell
即使能夠將Windows Power Shell許可權授權給所有人,通常來說必須確認Windows Power Shell賬戶位置(圖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.Windows Power Shell 刪除Everyone許可權

PowerShell的作用


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

PowerShell節流閥限制

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

PowerShell細微變化

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

PowerShell最新功能


過去的幾個版本的Windows Server里,微軟加大了在PowerShell工具上的研發投入,使得其能夠靈活可用。其中值得稱道的一點是在Windows Server 2008 R2和Windows Server 2012里,可用通過PowerShell創建能用於裸機恢復的備份。在本文中,我們將討論如何操作。
雖然現在通過PowerShell進行裸機恢復的備份並不是必須的,但是微軟聲稱PowerShell是微軟推薦的Windows伺服器管理介面,傳統的基於圖形的管理方式終將成為過去。因此,系統管理員們需要掌握PowerShell以免被時代所淘汰。
對於不同的應用所使用的恢復操作也不盡相同。本文主要的對象是Windows伺服器備份應用。當然也會有其它的一些備份廠商們支持命令行的備份操作方式,但不同的廠商所提供的命令也是不同的。
因此,需要在Windows Server上做一些準備工作好讓Windows伺服器備份命令安裝到PowerShell里:
在Windows Server 2012版本中,將會自動載入所必需的的PowerShell模塊,然而如果使用的是Windows Server 2008 R2,那麼則需要運行All Modules命令載入所需的模塊組件。

免費的PowerShell資源與工具


PowerGUI

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

管理腳本編輯器

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

PowerCLI社區

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

Project Onyx

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

Google

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

Windows Power Shell自動化伺服器


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

Windows Power Shell的建立

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

Windows Power Shell設置TCP/IP

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