如何使用PowerShell簡(jiǎn)化組策略的管理?
windows系統(tǒng)中的組策略相信經(jīng)常使用電腦的用戶應(yīng)該已經(jīng)不陌生了吧,但是如何簡(jiǎn)化對(duì)組策略的管理?使用什么技術(shù)呢?下文給出了詳細(xì)的描述。
Microsoft組策略技術(shù)不是在一夜間就流行起來的,這一技術(shù)在某種程度上比較難以理解,而且需要采用ActiveDirectory,在當(dāng)時(shí),ActiveDirectory服務(wù)才剛剛出現(xiàn),與當(dāng)時(shí)被奉為標(biāo)準(zhǔn)的Account/Resource域毫無相似之處,人們對(duì)此都很陌生。而時(shí)至今日,組策略幾乎成為每個(gè)組織管理Windows®基礎(chǔ)結(jié)構(gòu)的主要手段。我有種感覺,WindowsPowerShell™作為Microsoft***的管理技術(shù),將完全肩負(fù)起同樣的使命,成為主要的管理手段。實(shí)際上,WindowsPowerShell很可能會(huì)使身為組策略管理員的您工作起來更加輕松。
在本文中,我將為您介紹在WindowsPowerShell中,如何直接使用為VBScript(以及通?;贑OM的腳本語言)之類的WindowsScriptingHost語言編寫的Microsoft®組策略管理控制臺(tái)(GPMC)API在自己特有的環(huán)境中簡(jiǎn)化組策略的管理。
為組策略任務(wù)編寫腳本
幾年前Microsoft發(fā)布了GPMC,組策略管理員突然發(fā)現(xiàn)有許多簡(jiǎn)便易用的功能可供自己使用。具體地說,以組策略為中心的MMC管理單元體現(xiàn)了組策略管理向前邁進(jìn)了一大步,特別是相對(duì)于使用ActiveDirectory®的用戶和計(jì)算機(jī)而言尤其如此。不僅如此,管理員還可以借助一個(gè)全新的API,使用基于COM的語言(如VBScript)來執(zhí)行組策略管理任務(wù),例如備份和還原組策略對(duì)象(GPO)、在域之間遷移GPO、配置有關(guān)GPO和鏈接的安全設(shè)置以及編寫報(bào)告。
但遺憾的是,GPMC并沒有提供對(duì)組策略對(duì)象內(nèi)實(shí)際已配置設(shè)置進(jìn)行編輯的功能。換句話說,您可以對(duì)GPO容器執(zhí)行操作,例如,讀取GPO版本、讀取修改日期、創(chuàng)建全新的GPO、從不同的域中備份和還原/導(dǎo)入GPO,等等,但卻不能以編程的方式添加或更改GPO的內(nèi)容,例如添加新的重定向文件夾或新的軟件安裝。通常,您只能使用組策略對(duì)象編輯器手動(dòng)創(chuàng)建GPO并配置所有設(shè)置,然后備份該GPO,再將其導(dǎo)入測(cè)試環(huán)境中。只有當(dāng)各項(xiàng)功能經(jīng)過驗(yàn)證可以正常工作時(shí),您才能將其導(dǎo)入實(shí)際的應(yīng)用環(huán)境中。盡管缺少這一功能,但使用腳本而不是與GPMCAPI進(jìn)行人工交互也為日常的策略組管理節(jié)省了大量的時(shí)間、精力,同時(shí)也避免了不少錯(cuò)誤。
下一級(jí)別
WindowsPowerShell與VBScript之類的腳本語言有何不同?對(duì)于初學(xué)者而言,WindowsPowerShell是一種外殼程序,至少就目前來說,您可以將其視為一種命令行解釋器。盡管VBScript可以從命令行運(yùn)行,但VBScript文件卻不能逐行運(yùn)行。相比之下,WindowsPowerShell腳本則可以作為一系列單獨(dú)命令動(dòng)態(tài)地創(chuàng)建。此外,WindowsPowerShell還具有一些功能類似于VBScript中的子例程的函數(shù),它們可在WindowsPowerShell命令提示符下實(shí)時(shí)地進(jìn)行創(chuàng)建。
更值得一提的是,WindowsPowerShell基于Microsoft.NETFramework,而VBScript則依賴于早期的COM技術(shù)。這意味著,目前有大量的.NET代碼可直接在WindowsPowerShell內(nèi)使用。
總而言之,利用WindowsPowerShell,您可以獲得完全的腳本支持和交互模式,多種功能集于一身。本文提供的示例均為命令行輸入內(nèi)容,因此您可以一邊看示例一邊嘗試著輸入,不過,如果您將它們放入WindowsPowerShell腳本文件運(yùn)行,它們也同樣能正常工作。
使用WindowsPowerShell重新創(chuàng)建早期腳本
在開始采用一項(xiàng)新技術(shù)時(shí),您要做的***一件事就是拋棄以前的全部工作成果。您可以使用三種方法從GPMCAPI訪問COM對(duì)象,或者主要是重新利用任何早期VBScript。下面是可選的三種方法:
1.使用C#或托管C++等編程語言編寫一個(gè)WindowsPowerShellcmdlet。
2.使用WindowsPowerShell訪問MSScript.ocx中的ScriptControl,以封裝早期腳本。
3.將COM調(diào)用封裝在可重用的WindowsPowerShell函數(shù)中或直接調(diào)用COM對(duì)象。
我將重點(diǎn)介紹第三種方法,但首先讓我們簡(jiǎn)單了解一下所有方法。
創(chuàng)建WindowsPowerShellCmdlet
Microsoft在WindowsPowerShell中放入了大量的cmdlet,這些cmdlet允許您復(fù)制文件、將輸出內(nèi)容格式化、檢索日期和時(shí)間等,但您也可以自己創(chuàng)建cmdlet。有關(guān)整個(gè)過程的完整詳細(xì)記錄,請(qǐng)?jiān)L問msdn2.microsoft.com/ms714598.aspx。概括地講,主要步驟如下所示:
1.使用.NET編程語言(如C#)創(chuàng)建一個(gè)類庫(kù)DLL。
2.創(chuàng)建一個(gè)新類并從基類cmdlet繼承。
3.設(shè)置各種屬性,以確定名稱、用法、輸入?yún)?shù)等,并添加您的代碼。
由于WindowsPowerShell基于.NETFramework,任何作為參數(shù)返回或傳遞的類型(如字符串、對(duì)象等)在代碼中與在WindowsPowerShell中都是完全相同的,不需要進(jìn)行任何特殊類型的轉(zhuǎn)換。
這一解決方案真正強(qiáng)大之處在于您將擁有一種完全受自己支配的編程語言。
使用MSScript.ocx中的ScriptControl對(duì)象封裝早期腳本
顯然,您需要VBScript引擎來運(yùn)行VBScript文件。令人不太注意的是,該引擎是COM對(duì)象,而且由于您可以從WindowsPowerShell使用COM對(duì)象,因此可以調(diào)用VBScript引擎。過程如下所示:
- $scriptControl=New-Object-ComObjectScriptControl
- $scriptControl.Language=‘VBScript’
- $scriptControl.AddCode(
- ‘FunctionShowMessage(messageToDisplay)
- MsgBoxmessageToDisplay
- EndFunction’)
- $scriptControl.ExecuteStatement(‘ShowMessage
- “HelloWorld”’)
如果您在WindowsPowerShell命令行界面(CLI)中輸入此代碼,則會(huì)由某參數(shù)調(diào)用并執(zhí)行VBScript函數(shù),從而顯示一個(gè)帶有文本“HelloWorld”的消息框。
這時(shí)有些人可能會(huì)想:“太棒了!我已經(jīng)掌握了從WindowsPowerShell使用COM的技巧,不用再繼續(xù)讀這篇文章,馬上開始使用我的早期GPMC腳本填充ScriptControl對(duì)象吧。”很遺憾,事情沒有那么簡(jiǎn)單。隨著腳本的增大,這種方法很快就會(huì)變得非常復(fù)雜而繁瑣。
封裝COM對(duì)象
由此可見,第三種方法是***的:將COM調(diào)用封裝在可重用的WindowsPowerShell函數(shù)中,這樣您就能夠在GPMCAPI中使用COM對(duì)象。下列代碼將說明如何直接在WindowsPowerShell中創(chuàng)建.NET對(duì)象。在此示例中,可以使用FileInfo對(duì)象獲得文件的大?。?/p>
- $netObject=New-ObjectSystem.IO.FileInfo(
- “C:\boot.ini”)#CreateaninstanceofFileInfo
- #representingc:\boot.ini
請(qǐng)注意,“#”在WindowsPowerShell中用于表示行內(nèi)注釋。使用此新實(shí)例化的FileInfo對(duì)象,只要鍵入以下代碼即可輕松獲得boot.ini的大?。?/p>
- $netObject.Length#Displaythesizeinbytesofthe
- #fileinthecommandlineinterface
等等,我們不是說要談?wù)揅OM對(duì)象和VBScript轉(zhuǎn)換嗎?沒錯(cuò),但請(qǐng)看以下命令:
- $comFileSystemObject=New-ObjectCComObjectScripting.FileSystemObject
您會(huì)發(fā)現(xiàn),此處的語法與我之前從.NETFramework創(chuàng)建本地對(duì)象時(shí)所用的基本相同,差別只有兩點(diǎn):***,我添加了CComObject開關(guān),將WindowsPowerShell指向了COM環(huán)境,而不是.NET環(huán)境。第二,我使用的是COMProgID,而并非.NET構(gòu)造函數(shù),在本例中為Scripting.FileSystemObject。這里的ProgID是您經(jīng)常使用的名字。在VBScript中,等同的代碼應(yīng)為:
- SetcomFileSystemObject=CreateObject(
- “Scripting.FileSystemObject”)
若要使用VBScript獲得該文件的大小,請(qǐng)將上面的代碼行連同以下代碼一起添加到一個(gè)文件中:
- SetcomFileObject=comFileSystemObject.GetFile(
- “C:\Boot.ini”)
- WScript.EchocomFileObject.Size
然后,使用Cscript.exe等運(yùn)行它。在WindowsPowerShell中,您可以按如下所示獲得文件大小(如果您愿意,可以從WindowsPowerShell命令行直接輸入):
- $comFileObject=$comFileSystemObject.GetFile(
- “C:\boot.ini”)
- $comFileObject.Size
當(dāng)然,我本可以使用管理驅(qū)動(dòng)器內(nèi)對(duì)象的WindowsPowerShellcmdlet對(duì)讀取文件大小的VBScript進(jìn)行轉(zhuǎn)換,但我想向您展示從WindowsPowerShell訪問COM是多么容易。請(qǐng)注意,雖然我指示W(wǎng)indowsPowerShell創(chuàng)建的是一個(gè)COM對(duì)象,但實(shí)際創(chuàng)建的對(duì)象(此處為$comFileSystemObject)是一個(gè)封裝了該COM對(duì)象并公開了其接口的.NET對(duì)象。不過,就本文而言,這樣做沒有任何影響。
運(yùn)行狀態(tài)的WindowsPowerShell
現(xiàn)在,您已經(jīng)知道如何從WindowsPowerShell訪問COM,接下來,我們要專門介紹組策略。此處的示例將展示一些簡(jiǎn)短的代碼段,讓您對(duì)如何從WindowsPowerShell使用GPMCAPI有一個(gè)大致的概念;您可以從本文相關(guān)的代碼下載處,在線為technetmagazine.com/code07.aspx,下載到一整套WindowsPowerShell函數(shù)集來管理組策略。圖1所列為下載內(nèi)容中包含的各種函數(shù)。
在閱讀本節(jié)內(nèi)容時(shí),您可以隨意啟動(dòng)WindowsPowerShell命令行并鍵入命令。但是請(qǐng)記住,有些命令要依賴于前面的命令。也就是說,最初創(chuàng)建的一些對(duì)象在以后也會(huì)用到,因此,請(qǐng)?jiān)谕粋€(gè)WindowsPowerShell會(huì)話中執(zhí)行操作。如果您關(guān)閉該會(huì)話,則必須從頭開始,重新鍵入所有命令。
好,現(xiàn)在就讓我們先用WindowsPowerShell創(chuàng)建一個(gè)新的GPO。Microsoft的組策略團(tuán)隊(duì)隨GMPC提供了許多能夠運(yùn)行正常的VBScript示例,您可以利用它們加快工作速度。這些示例位于%ProgramFiles%\GPMC\Scripts目錄中,您還可以在該目錄下找到一個(gè)包含GPMCAPI文檔的gpmc.chm文件。接下來讓我們看看CreateGPO.wsf腳本,仔細(xì)研究一下它為何能夠正常運(yùn)行。
在腳本的開頭,您會(huì)發(fā)現(xiàn)這么一行:
- DimGPM
- SetGPM=CreateObject(“GPMgmt.GPM”)
這基本上是所有組策略管理會(huì)話或腳本的起點(diǎn),因?yàn)槭撬鼘?shí)例化了GPMgmt.GPM類,從而使大多數(shù)GPMC功能都能夠被訪問。接下來,我們轉(zhuǎn)而從WindowsPowerShell執(zhí)行這一操作:
- $gpm=New-Object-ComObjectGPMgmt.GPM
現(xiàn)在,您已獲得了組策略管理的起點(diǎn),接下來要了解使用它能夠做些什么。通常您需要閱讀相關(guān)文檔來獲得此類信息,但WindowsPowerShell提供了一個(gè)非??岬墓δ?。如果鍵入以下一行,您可以得到如圖2中所示的輸出:
圖2Get-Member輸出(單擊該圖像獲得較小視圖)
$gpm|gm
我覺得這個(gè)功能真的很棒。請(qǐng)注意觀察,看Get-Member(orgm)cmdlet是如何允許您直接從命令行查看該對(duì)象所支持的屬性和方法的。這當(dāng)然不能等同于閱讀文檔,但如果您不記得參數(shù)的確切個(gè)數(shù)或確切名稱等,該功能可以讓您輕松使用熟悉的對(duì)象。請(qǐng)牢記一點(diǎn),在您查看GPMC文檔節(jié)點(diǎn)列表時(shí),會(huì)發(fā)現(xiàn)它很象GPM對(duì)象,而且所有其他類均帶有前綴字母I;這是由于COM的內(nèi)部工作方式而造成的,我們不需要過分關(guān)注這一點(diǎn);這是專為C++程序員編寫本地COM代碼準(zhǔn)備的,用于表示界面和實(shí)現(xiàn)它的類之間的差異。另外還要注意,使用GPMCAPI時(shí),只有一個(gè)對(duì)象需要您采用此方法來創(chuàng)建,那就是GPMgmt.GPM;其他所有對(duì)象均使用該GPM對(duì)象開始的方法來創(chuàng)建。
現(xiàn)在,我們要繼續(xù)創(chuàng)建新的GPO。
圖3說明了創(chuàng)建一個(gè)GPO是如此的簡(jiǎn)單。請(qǐng)注意,在這里我省去了一些代碼,包括對(duì)錯(cuò)誤的處理(例如,如果您無權(quán)創(chuàng)建GPO會(huì)出現(xiàn)什么情況),并且我已對(duì)域名進(jìn)行硬編碼,這些都是您應(yīng)該了解的。
現(xiàn)在,您已經(jīng)學(xué)會(huì)如何創(chuàng)建GPO,讓我們打開一個(gè)現(xiàn)有的GPO。您仍具有對(duì)域$gpmDomain的引用,因此請(qǐng)鍵入以下內(nèi)容:
- $gpmExistingGpo=$gpmDomain.GetGPO(
- “{31B2F340-016D-11D2-945F-00C04FB984F9}”)
- #OpenanexistingGPObasedonitsGUID,
- #inthiscasetheDefaultDomainPolicy.
- $gpmExistingGpo.DisplayName
- #ShowthedisplaynameoftheGPO,it
- #shouldsayDefaultDomainPolicy
- $gpmExistingGpo.GenerateReportToFile($gpmConstants.ReportHTML,“.\DefaultDomainPolicyReport.html”
上述代碼以HTML的形式完整報(bào)告了DefaultDomainPolicy中的各項(xiàng)設(shè)置,但是很明顯,您可以使用任何一種方法和屬性(如ModificationTime,它說明該GPO***被修改的時(shí)間)來得知該GPO中所有設(shè)置的更改時(shí)間。
這是非常實(shí)用的。例如,您很可能遇到過這類情況:電話瘋狂地響個(gè)不停,用戶紛紛來電抱怨說他們的計(jì)算機(jī)運(yùn)轉(zhuǎn)異常。您懷疑這是更改、添加或刪除了GPO設(shè)置造成的,但沒有線索,不知該從哪個(gè)GPO著手。此時(shí),WindowsPowerShell可以救急!只要在WindowsPowerShell命令行中輸入圖4所示的腳本,就可以獲得過去24小時(shí)內(nèi)更改的所有GPO。
請(qǐng)注意Cge運(yùn)算符,它表示大于或等于。如果您習(xí)慣使用其他腳本或編程語言中的<和>運(yùn)算符,可能會(huì)有些不習(xí)慣。但由于這些運(yùn)算符主要用于重定向,例如,將輸出重定向到文件,因此在WindowsPowerShell中不可將其用作比較運(yùn)算符。
結(jié)束語
圖5所列為將一個(gè)GPO的設(shè)置復(fù)制到另一GPO中的完整腳本。現(xiàn)在,您應(yīng)該能清楚了解如何將這一新技術(shù)用于組策略,如何才能重新使用任何COM對(duì)象或利用COM對(duì)象的VBScript代碼。
正如組策略一樣,WindowsPowerShell必將成為任何Windows管理環(huán)境的組成部分。但面對(duì)數(shù)百萬行需要進(jìn)行遷移或維護(hù)的VBScript代碼,希望此教程會(huì)對(duì)您有所幫助。
您可以使用許多資源來改進(jìn)組策略管理和其他先前使用VBScript的領(lǐng)域,這些資源包括下載內(nèi)容中的WindowsPowerShell函數(shù),另外TechNet網(wǎng)站上還提供了VBScript到WindowsPowerShell的轉(zhuǎn)換準(zhǔn)則,這一極為實(shí)用的準(zhǔn)則在您了解VBScript中的等同內(nèi)容的情況下,可以提示您如何在WindowsPowerShell中執(zhí)行常見任務(wù)。您可以從microsoft.com/technet/scriptcenter/topics/winpsh/convert獲得該轉(zhuǎn)換準(zhǔn)則。
此外,GPMCAPI也提供完整的文檔內(nèi)容,您可以從組策略網(wǎng)站(microsoft.com/grouppolicy)下載相應(yīng)的信息。
***但并非最不重要的一點(diǎn),如果您尚未安裝WindowsPowerShell,那還在等什么呢?現(xiàn)在就從下載吧。祝您愉快!
希望本文介紹的使用PowerShell簡(jiǎn)化組策略管理的方法能夠?qū)ψx者有所幫助,更多有關(guān)組策略的知識(shí)還有待于讀者去探索和學(xué)習(xí)。
【編輯推薦】