组策略

自动使用 Windows PowerShell 的组策略管理

Darren Mar-Elia

本文的部分基础预发布的软件,并且可能会发生更改。

概览:

  • 使用 GPMC API
  • 使用 Windows PowerShell 中创建组策略报告
  • Windows 7 和 Windows Server 2008 R 2 中的 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。

和当然,您可以始终使用查询信息有关 GPO,API 相对于只需更改。 这包括生成 HTML 和 XML 基于报表中的 GPO 设置以及对远程工作站和服务器以确定是否已成功应用组策略的策略的结果集 (RSoP) 报告。

也的值得一提 Microsoft 发布 Windows Vista SP 1 和 Windows Server 2008 附带更新的 GPMC 时, 没有某些更新该 API 以支持的一些新功能的 GPMC 并组策略通常支持。 其中包括创建从"入门 GPO"的新 GPO 和 GPO 中添加评论,功能。 初学者 GPO 具有相似的模板,它们可以创建然后可以应用于 pre-populating 一些其设置一个新 GPO 的策略设置的一组管理模板。 我想通过查看开始如何自动化创建、 应用权限,和链接一个 GPO,然后显示的过程如何可以利用其中的一些新 GPMC 功能在这种自动化。

自动执行 GPO 生命周期

若要演示如何自动化创建和管理的 GPO,我将使用 Windows PowerShell 和 GPMC API。 在我的示例,我正在创建 GPO 名为"TechNet 市场营销策略"。 创建 GPO 时, 我将使用名为"用户锁定模板"作为起始点的初学者 GPO 并添加注释,指示我创建 GPO。 我可以创建初学者 GPO 使用 GPMC 的 API,但在此示例,我将假定它已经存在。

下一步我要自动执行的是 GPO 的该应用权限。 我将为该 GPO 的权限,以便只有在"市场营销用户"组中的用户将处理该策略,和我将添加名为有权编辑 GPO,"GPO 管理员"组。 最后,我在我的 Active Directory 域中来将到 Marketing OU 的 GPO 链接。

我已经调用 gpoCreate.ps1 的在整个 Windows PowerShell 脚本如 图 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。 这样做我调用 $ gpmc 变量 GetDomain 方法。 两个的 $ null 参数可选和允许您指定要连接到域时,连接到特定域控制器。 这些留空,我实质上选择该默认值是 PDC 仿真器 DC。

在第 4 行,我需要获取对我初学者 GPO (用户锁定模板) 的引用。 GetStarterGPO 方法仅支持调用初学者 GPO,通过它的 GUID,使我都要转到要查找的 GPMC 控制台。 (我可能有脚本它还)。 这是我在传递给 GetStarterGPO 方法的 GUID。

在行 5,一旦我有我初学者 GPO 引用我使用它来创建新 GPO 使用 $ 域变量上可用的 CreateGPOfromStarterGPO 方法。 我将新创建的 GPO 分配给 $ gpo,使我可以继续使用它。 请注意到目前为止该 GPO 有没有名称 (和,有默认名称"新建组策略对象")。 因此在第 6 行我修改 $ gpo 为其指定新的名称在 displayName 属性。 第 7 行,我添加注释的 GPO 通过 $ gpo 上设置说明属性。

现在,我已获得我创建的 GPO 下, 一组任务是修改 GPO 上的权限。 在行 8,我首先获得对该 GPO 使用 GetSecurityInfo 方法我新建 GPO 的权限当前列表。 修改 GPO 上的权限,方法是根据,GPO、 添加和删除项从该列表获取当前的权限的列表,然后重新应用到 GPO 的列表。 为此,行 9 中, 我删除经过身份验证的用户默认权限从新创建的 GPO。

行 10 和 11 中, 我创建两个新我要添加到该 GPO 的权限。 我创建那些使用 $ gpmc CreatePermission 方法,提供受信者 (用户组) 名称和我希望将组的权限。 请注意我使用 $ 常量变量定义权限。 $constants.permGPOApply 属性授予"读取和应用组策略"权限允许处理一个的 GPO,permGPOEdit 属性授予组编辑 GPO 时组的成员。 $ False 参数,CreatePermission 方法调用结尾处只是说权限应不被继承,这是默认 GPO 权限。

一旦创建了两种权限,12 和 13 的行将将它们添加回到 $ 权限列表和行 14 调用 GPO 应用新的列表上,SetSecurityInfo 方法返回到该 GPO。

最后的两行将 GPO 链接到 Marketing OU。 在行 15,我调用 $ 域变量,以"连接"到 OU GetSOM 方法 ("管理范围"SOM 代表)。 在行 16 中,,我刚刚创建,$ som 对象调用 CreateGPOLink 并向其传递两个参数。 第一个参数指示希望该 GPO 链接该 OU 上的顺序 (OU 有多个 GPO 链接到它)。 声明为第一个参数,"1",则表示我希望列表中第一次链接到 GPO。 第二个参数 (在本例中 $ gpo 变量) 是对我要链接的 GPO 参考资料。 现在我已成功创建,permissioned,并链接 GPO 使用自动化功能。 结果如 图 2 所示。

fig01.gif

图 2 查看新创建的 GPO

自动执行组策略报告

组策略可以自动执行的管理另一个方面是报告。 在这一方面有至少两个 GPMC 提供的报告类型。 第一个是能够报告在 GPO 设置。 这允许您生成 HTML 或 XML 基于报表当前启用的设置的 GPO,为显示在 图 3 中。

fig02.gif

图 3 在 GPO 设置报表

第二个的报告功能,可以生成策略的结果集 (RSoP) 或组策略结果报告。 有两种类型的 RSoP 报告日志记录和规划。 对远程桌面或服务器,哪些策略被传递到远程系统和是否已成功运行日志报告。 RSoP 计划报告允许您执行针对一个特定 OU、 的计算机或用户以确定策略将应用的假设分析。 在这两种情况下,日志记录和规划,可以生成 HTML 或 XML 输出使用 GPMC API 和 Windows PowerShell。

正在生成一个基于 HTML 的报告

Windows PowerShell 中生成的 GPO 设置报告,我从开始这我在前面的脚本中将用两个常见的初始化命令:

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")

此处,我正在创建设置报告 GPO 上调用 GenerateReportToFile 方法。 第一个参数使用 $ 常量变量指定的 HTML 报告类型。 第二个参数指向希望保存报表的路径。

正在生成一个基于 XML 的报告

访问使用 Windows PowerShell 设置数据的另一个方法是利用内置 XML 分析 Windows PowerShell 中的功能以及生成 XML 中的设置报告的能力。 因此,而不是上面行 5,我更改的如下:

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

在此示例,我调用 GenerateReport 的在 GPO 上使用其他方法。 此方法采用单个参数,这是报告类型。 但在这种情况下,我将分配到变量名为的 $ 报表在方法调用的输出并我是前面与 Windows PowerShell 类型告诉 PowerShell 执行我正在将存储在 $ 报表的命令的输出的加速器 [XML],该变量名称,并将其转换为 XML 文档而不是只是一组文本。 但是,为了获得实际的 XML 从 GenerateReport,我不得不使用 Result 属性的输出是该语句结尾处看到的内容。 因此 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 查看通过 XML 的 GPO 设置

在此示例,有两个扩展区域,在该 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]

一旦您获得在挂起浏览 GPO 设置 XML 命名空间的可以轻松地获得特定设置并结合 Windows PowerShell 使用此功能,非常快速找到的 GPO 中的设置值。

RSoP 记录报告

就像使用 GPO 设置,可以显示已经应用到给定的计算机的组策略设置的 Windows PowerShell 中生成的 XML 或 HTML 基于报告。 该方法是但略有不同。 我使用两个的初始化命令重新启动,稍有不同的方向执行该脚本:

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 行通过 $ gpmc 调用 GetRSOP 方法创建 $ Rsop 变量。 该方法调用中,我指示我要创建的 RSOP 日志记录和不计划报告。 告诉它何种计算机和用户希望收集 RSOP 数据,对该 $ Rsop 对象上 4 和 5 的行设置属性。 然后,唯一的行 6 旨在连接到行 5 中指定的计算机,并生成此查询在 RSoP 命名空间。 最后,行 7 中, 我输出到 HTML 文件查询的结果。

请注意在 RSoP 对象也有 GenerateReport 方法类似于 GPO 的设置示例。 并且您可以输出 RSOP 报表以 XML 文档和要了解什么该远程客户端上发生从组策略的角度来看 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. 为您提供创建然后应用权限和链接一个的 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 R 2 将 GPMC 提供内置的 Windows PowerShell cmdlet。 是例如我的示例 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 R 2 被计划附带用于管理组策略的 25 个 cmdlet。 一旦它们可用管理通过 Windows PowerShell 的组策略将更加容易。

Darren Mar-Elia 是一 Microsoft 组策略 MVP,流行的组策略网站的创建者 www.gpoguy.com也是 Microsoft Windows Group Policy Guide (Microsoft Press 2005)。 他还是 CTO 和 SDM Software,Inc 的创始人 访问他在 Darren@gpoguy.com.