共用方式為


[群組原則]

自動化 Windows PowerShell 的群組原則管理

Darren Mar-Elia

這篇文章的部分根據的發行前版本軟體,並有變更恕中。

簡介:

  • 使用 GPMC API
  • 使用 Windows PowerShell 中建立群組原則報告
  • Windows 7 與 Windows Server 2008 R2 Cmdlet

內容

哪些功能 GPMC 提供?
自動化 GPO 的生命週期
自動化群組原則報告
產生的 HTML 為基礎的報告
產生的 XML 為基礎的報表
RSoP 記錄報告
Easier 方法

群組原則] 是一項功能強大,但複雜的技術。 它用來,幾乎每個環境中的部分範圍內。 而許多依賴以保護及鎖定 Windows 環境中,大量的使用者,群組原則是金鑰基礎結構部分。

換句話說,我一定很驚訝,以查看如何一些自動化用於群組原則管理許多 IT 組織中。 當群組原則管理主控台 (GPMC) 提供,Microsoft 做一組 API,並可用於自動化的範例指令碼工作的可以使用的主控台已執行。 沒有可以完成的大部分使用這些的 API,以及自動化其他方面的群組原則管理等疑難排解和診斷工作的機會。 而,隨著 Windows PowerShell,某些工作已經成為更容易。

Thorbjörn Sjövold 會討論一些 GPMC API,他的文件中取得使用 Windows PowerShell 」 簡化 Windows PowerShell 的群組原則管理." 在這的篇文章我想要與您用來進一步自動化管理群組原則環境的某些其他自動化技術的基礎上建置。

哪些功能 GPMC 提供?

GPMC 被著重於對整個群組原則物件 (GPO) 的作業及其相關聯的使用權限、 連結,等等。 它不提供自動化 」 或 「 管理的 GPO 中實際設定。 不過,它可用來執行對整個 GPO 的管理程式群組原則 」 環境中的變更程序的自動化。 例如,您可以使用 GPMC API 來修改 GPO 的連結。 如果您有您要部署新的 GPO 時,您可以使用指令碼建立的 GPO,並在填入其設定後再可以指令碼連結的處理。 您也可以指令碼變更 GPO 的使用權限以防您要修改的安全性群組為目標的 GPO,或使用者可以編輯該 GPO。

而且的不用說您永遠可以使用 API GPO 的查詢資訊相對於只進行變更。 這包括產生 HTML 和 XML 為基礎的 GPO 設定的報告,以及對遠端工作站和伺服器以判斷是否已成功套用群組原則的原則結果組 (RSoP) 的報告。

也是值得一提 Microsoft 放開更新隨附於 Windows Vista SP1 以及 Windows Server 2008 的 GPMC 發生某些更新至 API,以支援的某些新功能,GPMC 並群組原則通常支援。 這些包括建立新的 GPO,從 「 入門 GPO 」 並新增註解到 GPO 的能力。 入門的 GPO 是像範本-它們可讓您建立一組系統管理範本然後可以套用至新 GPO pre-populating 部分其設定的原則設定。 我想先查看方式您可以自動化程序的建立、 permissioning,並連結一個 GPO,然後顯示可以如何使用部分這些新的 GPMC 功能,此自動化的。

自動化 GPO 的生命週期

若要示範如何您可以自動化建立和管理 GPO,我要使用 Windows PowerShell 和 GPMC) API。 在我的範例中,我正在建立的 GPO 稱為 TechNet 行銷原則。 我在建立 GPO 時我要使用入門 GPO 稱為 「 使用者鎖定 」 範本 」 為起點,並加入回應,指出我建立的 GPO。 我可以建立入門 GPO 使用 GPMC 的 API,但在這個範例中,我將假設它已經存在]。

下一個步驟我要自動化會是 permissioning GPO。 我將 GPO 的使用權限,只有在行銷使用者 」 群組內的使用者會處理原則,我將會加入稱為使用權限編輯 GPO 」 GPO ' s Admins 」 群組。 最後,我要行銷 OU GPO 連結在我的 Active Directory 網域中。

整個 Windows PowerShell 指令碼,我已呼叫 gpoCreate.ps1,如 [圖 1 ] 所示。 我加入只供參考的行號。

[圖 1 在 Windows PowerShell gpoCreate.ps1 scriptt

1. $gpmc = New-Object -ComObject GPMgmt.GPM
2. $constants = $gpmc.GetConstants()
3. $domain = $gpmc.GetDomain("cpandl.com",$null,$null)
4. $starter = $domain.GetStarterGPO("{CDFD6B94-BF4E-4D07-8D99-3D416EC7C9A0}")
5. $gpo = $domain.CreateGPOFromStarterGPO($starter)
6. $gpo.DisplayName = "Technet Marketing Policy"
7. $gpo.Description = "Created by Darren for Technet Demo"
8. $permissions = $gpo.GetSecurityInfo()
9. $permissions.RemoveTrustee("Authenticated Users")
10. $applyPermission = $gpmc.CreatePermission("Marketing Users",$constants.permGPOApply,$false)
11. $editPermission = $gpmc.CreatePermission("GPO Admins",$constants.permGPOEdit,$false)
12. $permissions.Add($applyPermission)
13. $permissions.Add($editPermission)
14. $gpo.SetSecurityInfo($permissions)
15. $som = $domain.GetSOM("OU=Marketing,DC=cpandl,DC=com")
16. $som.CreateGPOLink(1,$gpo)

第 1 行,就需要開始使用 GPMC 的 API。 您將在您撰寫任何 GPMC 指令碼中使用。 這一行會建立基底 GPMC 物件的執行個體,並將其部落格指派給 $ gpmc 變數。 2 是另一個常用的命令。 GPMC 會提供一套者的好用的常數的工作,範圍在用來表示特定的狀態。 您會看到如何我它在更新版本中使用該的指令碼但是現在,我將只指派常數給 $ 常數變數。

在第 3 行,我需要取得 Active Directory 網域,我將上作業的參考。 在我的範例,可以是呼叫 cpandl.com 的網域。 若要這樣做中,我會呼叫 GetDomain 方法在 $ gpmc 的變數上。 是選用的兩個 $ null 參數,可讓您指定當您連線到網域時,連線至特定網域控制站。 這些保留 null,我基本上選擇預設是 PDC 模擬器的 DC。

在列 4,我需要取得到我的入門 GPO (使用者鎖定 」 範本) 參考。 GetStarterGPO 方法只會支援呼叫其的 GUID 的入門 GPO,需要到要尋找的 GPMC 主控台。 (我無法有編寫它也)。 這是我在傳遞至 GetStarterGPO 方法的 GUID。

在列 5,我一旦我的入門 GPO 參考我使用它來建立新的 GPO 使用 CreateGPOfromStarterGPO 方法 $ 網域變數上可用。 所以我可以繼續使用它,我可指派給 $ gpo 新建立的 GPO。 請注意這時候 GPO 有沒有名稱 (也,具有 「 新群組原則物件 」 的預設名稱)。 因此在列 6 中,,我會修改 $ gpo,它以新的名稱上,displayName 屬性。 行 7 是可讓我新增註解的 GPO 藉由在 $ gpo 設定描述屬性。

現在我了我建立的 GPO 下, 一組工作是修改 GPO 上的使用權限。 在第 8 行,我開始關閉藉由在我新建立的 GPO,GPO 上使用 GetSecurityInfo 方法取得目前的使用權限清單。 用來修改在 GPO 上的權限,方法是取得目前的使用權限的清單 GPO、 新增和刪除的項目從該清單視,然後重新套用至 GPO 的清單。 為了,行 9,我移除已驗證的使用者的預設權限將新建立的 GPO。

在 10 和 11 行,我會建立兩個新我要新增至 GPO 的使用權限。 我建立使用 $ gpmc CreatePermission) 方法所提供的信任項 (使用者群組名稱] 和 [我希望有群組的使用權限。 請注意我使用 $ 常數變數來定義使用權限。 $constants.permGPOApply 屬性會授與 「 讀取和套用群組原則] 使用權限,允許 permGPOEdit 屬性授與的能力以編輯 GPO 群組時,處理資料的 GPO 群組的成員。 CreatePermission 方法呼叫的結尾,$ False 參數只會表示使用權限應該無法被繼承的這是預設 GPO 的使用權限。

一旦建立了兩個使用權限,了 12 和 13 的線將它們加回 $ 的使用權限清單和行號 14 呼叫 SetSecurityInfo 方法来套用新的清單在 GPO 上回 GPO。

最後兩行將 GPO 連結到行銷的 OU。 在列 15,我可以將 「 連線 」 到 OU $ 網域變數上呼叫 GetSOM 方法 (的管理領域的 SOM 表示)。 在 [行 16 中,,我呼叫 CreateGPOLink,我建立 $ som 物件上,並兩個參數時,傳它。 第一個參數指出我要連結 GPO 在 OU 上的順序 (組織單位 (OU 可以有多個連結的 GPO)。 第一個參數的說明,"1",表示我要在清單中第一次連結 GPO。 第二個參數 (在本例 $ gpo 變數) 會是我所要連結的 GPO,參考。 現在我已經成功地建立,permissioned,並將連結 GPO,使用自動化。 結果如 [圖 2 ] 所示。

fig01.gif

[圖 2] 檢視新建立的 GPO

自動化群組原則報告

另一個群組原則管理,您可以自動化的是報告。 在這方面中,,有至少兩個的 GPMC 將傳遞報告的類型。 第一個會是能夠在 GPO 內的設定報告。 這可讓您在 GPO 中所示的 [圖 3 ] 為中產生其中一個的 HTML 或 XML 為基礎的報告目前啟用的設定。

fig02.gif

[圖 3 在 GPO 的設定報告

第二個報告的功能會讓您產生原則結果組 (RSoP) 的或群組原則結果的報告。 有兩種 RSoP 報告 — 記錄與規劃。 對遠端桌面或伺服器,指出哪些原則會傳遞到遠端系統,以及是否它們都已成功執行記錄的報表。 RSoP 規劃報表可讓您執行 what-if 分析,對特定 OU、 電腦或使用者,判斷原則會套用。 在這兩種情況下,記錄和規劃 — 您可以產生 HTML 或 XML 輸出使用 GPMC 的 API 和 Windows PowerShell。

產生的 HTML 為基礎的報告

如果要產生 GPO 設定報告,在 Windows PowerShell,我啟動關閉兩個熟悉的初始化指令,我在前一個指令碼中使用:

1. $gpmc = New-Object -ComObject GPMgmt.GPM
2. $constants = $gpmc.GetConstants()

接下來,我需要取得參考至 GPO 我要報告,就像這樣:

3. $domain = $gpmc.GetDomain("cpandl.com",$null,$null)
4. $gpo = domain.GetGPO("{31B2F340-016D-11D2-945F-00C04FB984F9}")

在列 3 這裡,我正在重新連接網域並再行 4,我使用 GetGPO 方法網域上取得參考給我要報告的 GPO。 在這種情況下我需要傳遞 GUID 的 GPO 剛好是在 「 預設網域原則 」。

接下來,我還需要產生設定的報告:

5. $gpo.GenerateReportToFile($constants.ReportHTML,"c:\GPReports\DDPSettings.html")

這裡,我正在呼叫 GenerateReportToFile 方法,以建立設定報告在 GPO 上。 第一個參數會使用 $ 常數變數,以指定的 HTML 報告類型。 第二個參數會指向我要儲存報表的位置路徑。

產生的 XML 為基礎的報表

另一個的方式,存取使用 Windows PowerShell 設定資料,為利用內建的 XML 剖析 Windows PowerShell 的功能和在 XML 中產生設定報告的能力。 所以,而非第 5 行上方,我變更為下列:

[xml]$report = ($gpo.GenerateReport($constants.ReportXML)).Result

在這個範例中中,,我使用不同方法從呼叫 GenerateReport 的 [GPO。 這個方法接受一個單一的參數,報表的型別。 但此時,我指派到變數呼叫的 $ 報表方法呼叫的輸出,我是之前的變數名稱,與 Windows PowerShell 型別的快速鍵 [XML],它會告訴 PowerShell 要我正在儲存 $ 報表,在命令的輸出,並會的 XML 文件,而非只是將一堆文字將它轉換。 不過,以取得實際的 XML,從 GenerateReport,我必須使用的是您看到在該陳述式結尾的輸出上的 Result 屬性。 因此,結果屬性會含有,我使用來產生 XML 文件的實際 XML。

一旦我 XML $ 報告變數中的,我就可以執行許多有趣的事情,與它。 舉例來說,請參考下列命令:

$report.GPO

這就會傳回所提供的 GPO,我報告的概觀資訊之文件內的 GPO 」 項目。 或此指令:

$report.GPO.LinksTo

這會傳回這個 GPO 已連結的所有位置清單。

但是更有趣的是我可以使用 XML 的結構化的本質偵測 GPO 中,從命令列中實際的設定。 例如,因為這是預設網域原則 GPO,我知道它可能包含某些密碼原則的相關的安全性設定。 藉由在 XML 檔中表示,請瀏覽 GPO 命名空間,我可以快速地取得這些的設定,如下所示:

$report.GPO.Computer

這會傳回在電腦端的相關 GPO 的資訊。 如果我在這個電腦] 屬性上檢視內容,我注意到下 ExtensionData 屬性如 [圖 4 ] 所示的原則區域的集合。

fig03.gif

[圖 4 檢視 GPO 的設定,透過 XML

這個範例中,有兩個副檔名區域,在這個 GPO 的電腦側邊: 登錄 」 和 「 安全性。 因此,我發出下列命令:

$report.GPO.Computer.ExtensionData[0].Extension

這讓我的實作 [安全性原則] 區段下的原則區域清單。 我看到呼叫帳戶和安全性選項的兩個屬性。 現在我必須輸入下列命令:

$report.GPO.Computer.ExtensionData[0].Extension.Account

這樣我的每一個帳戶原則設定的這個的 GPO 清單所示 [圖 5 .

fig04.gif

[圖 5 檢視 GPO 內的帳戶原則設定

請注意的一些設定 [圖 5 ] 中不會實際上顯示值。 每個設定傳回做為集合,以在 [帳戶] 屬性的成員。 因此以查看,例如,最小密碼長度設定,我要在集合內的索引,像這樣:

$report.GPO.Computer.ExtensionData[0].Extension.Account[4]

一旦您取得的巡覽 XML 命名空間的 GPO 設定擱置,您就可以輕鬆地取得特定的設定,並搭配 Windows PowerShell 使用這項功能,相當快速尋找設定 GPO 內的值。

RSoP 記錄報告

就像使用 GPO 設定,您可以產生的 XML 或 HTML 為基礎報告 Windows PowerShell,顯示已套用到指定電腦群組原則設定中。 不過,方法是略有不同的。 我再次開始兩個初始化指令,略有不同的方向執行指令碼:

1. $gpmc = New-Object -ComObject GPMgmt.GPM
2. $constants = $gpmc.GetConstants()
3. $rsop = $gpmc.GetRSOP($constants.RSOPModeLogging,$null,0)
4. $rsop.LoggingComputer = "xp2"
5. $rsop.LoggingUser = "cpandl\dpmtest"
6. $rsop.CreateQueryResults()
7. $rsop.GenerateReportToFile($constants.ReportHTML,"c:\gpreports\XP2Rsop.html")

1 和 2 設定處理序的行之後, 第 3 行會建立在 rsop 的變數,藉由在 $ gpmc 呼叫 GetRSOP 方法。 在該方法呼叫中,我會指出我要建立的 RSOP 記錄和規劃報表。 4 和 5 的行告訴我哪些電腦和使用者想要收集 RSOP 資料的 rsop 物件上設定屬性。 然後,行 6 的唯一目的是連接到第 5 行中指定電腦,並將產生 RSoP 這個查詢的命名空間。 最後,在列 7,我輸出的 HTML 檔案,查詢的結果。

請注意 RSoP 物件也有類似 GPO 的設定範例 GenerateReport 方法。 而且您可以輸出至 XML 文件 RSOP 報表,並以找出什麼的從群組原則的觀點來看,遠端用戶端上發生 Windows PowerShell 中瀏覽它。 舉例來說,假設我想要快速地找出是否群組原則處理已成功的 GPO 處理電腦端。 我可以使用在先前的指令碼,但這取代列 7:

[xml]$rsopReport = 
  ($rsop.GenerateReport($constants.ReportXML)).Result

這會將 [我的 RSoP 報告放入的 XML 文件。

接下來,我可以瀏覽至 XML 名稱的空間以找出電腦的用戶端延伸 (CSE) 狀態,如下所示:

$rsopReport.Rsop.ComputerResults.ExtensionStatus

我這麼做時,得到清單,顯示我的電腦已處理的每個 CSE 狀態 !

Easier 方法

我到目前為止已所示,沒有很多 powerin 利用自動化群組原則的存留週期、 報告,及診斷工作,GPMC API。 但是,執行要花相當幾個步驟,以取得所要的結果。 不過,會 somerelief 和更多在未來的傳入。

我建立一組 25 個可用的 GPMC Windows PowerShell Cmdlet,包裝成易於使用的 Cmdlet 的大部分常見的 GPMC 函數的。 您可以下載這些 GPMC Cmdlet,在 www.sdmsoftware.com/Freeware. 若要讓您簡化處理程序的範例,我們建立然後 permissioning 和的一個的 GPO 連結的第一個範例使用我的 GPMC Cmdlet,下列指令碼會完成相同工作我稍早,呈現指令碼,但具有較少的命令:

$gpo = New-SDMgpo "Technet Marketing Policy" 
  -FromStarterGPO "User Lockdown Template" –native
$gpo.Description = 
  "Darren's Technet Demo GPO" Remove-SDMgpoSecurity 
$gpo.DisplayName -Trustee "Authenticated Users"  –PermApply
Add-SDMgpoSecurity $gpo.DisplayName 
  -Trustee "Marketing Users" –PermApply
Add-SDMgpoSecurity $gpo.DisplayName 
  -Trustee "GPO Admins" –PermEdit
Add-SDMgplink "Technet Marketing Policy" 
  -Scope "OU=Marketing,DC=cpandl,DC=com" -Location 1

更好,Windows 7 和 Windows Server 2008 R2 會提供內建的 Windows PowerShell Cmdlet GPMC。 例如,若要建立從入門 GPO 與註解的我的範例 GPO,我可以如下發出一個的 Windows PowerShell 命令:

new-gpo "Darren's Technet Policy" -starterGPOName 
 "User Lockdown Template" -Comment "Darren's Demo"

Microsoft,會也加入支援讀取和寫入群組原則 」 設定的子集。 特別是,會有讀取和寫入原生的系統管理範本原則,或者較新的群組原則喜好設定登錄的副檔名的登錄設定的支援。 例如,要寫入群組原則的喜好設定的新登錄值,我就會發出下列命令:

Set-GPPrefRegistryValue "Darren's Technet Policy" 
  -key 'HKEY_LOCAL_MACHINE\Software\SDM Software' 
  -ValueName "Path" -Value "2" -Type String 
  -Context Computer -Action Update

這裡,Set-GPPrefRegistryValue Cmdlet 會接受參數,以建立登錄原則設定,在我"Darren 的 technet 原則"數目 HKEY_LOCAL_MACHINE\Software\SDM Software\Path 登錄值的 GPO = REG_SZ 2。 內容參數告訴原則是否應該放置在電腦或使用者邊的 GPO,並動作參數會指定如何套用登錄值,並且對應到 GPP UI (其他的選項包括取代、 建立及刪除) 中的選項。

為的撰寫這篇文章的時間,Windows 7 和 Windows Server 2008 R2 是以管理群組原則的 25 個 Cmdlet 的計畫。 之後,這些可管理群組原則],透過 Windows PowerShell 就可以更容易。

Darren Mar-Elia 是 Microsoft 群組原則 MVP,受歡迎的群組原則的站台的建立者 www.gpoguy.comMicrosoft Windows Group Policy Guide (Microsoft Press 2005) 的執筆。 他同時也是 CTO 和 SDM Software,Inc.的 他在 Darren@gpoguy.com.