当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 使用 PowerShell 导出 GPO 以获得精美的 GPO 报告

作者:精品下载站 日期:2024-12-14 13:04:10 浏览:14 分类:玩电脑

使用 PowerShell 导出 GPO 以获得精美的 GPO 报告


您是否想知道您的环境中的组策略发生了什么?也许您有数百个组策略对象 (GPO)。跟踪应用于您的 Active Directory (AD) 域的所有更改非常困难!幸运的是,PowerShell 可以导出 GPO 并创建一些精美的报告!

Get-GpoReport cmdlet 生成有关 GPO 的报告,使您可以将简单的基于文本的报告创建为成熟的 HTML 报告。使用 PowerShell 自动化此报告生成过程,您可以节省时间并获得有关 AD 环境中发生的情况的重要见解。

在本教程中,您将学习如何在 PowerShell 中导入 GPO 模块、使用 PowerShell 导出 GPO、将 GPO 链接到 OU 作为示例,最终共同创建一些很棒的报告!

GUI 方式并不能解决问题

传统上,我们一直使用组策略管理控制台 (GPMC)。该应用程序默认通过远程服务器管理工具 (RSAT) 包安装在所有域控制器上。

GPMC 允许您检查每个策略设置以及这些策略如何应用于客户端。将 GPMC 视为用于创建、修改和删除 GPO 的独立 GPO 管理站。

GPMC 仍然是编辑 GPO 的主要工具。但需要更好的工具来实现报告、故障排除和自动化目的。

然后来自组策略 PowerShell 模块(RSAT 包的一部分)的 Powershell Get-GpoReport cmdlet 使用 PowerShell 导出 GPO。此 cmdlet 现在能够检索与 GPMC 通过 PowerShell 检索的信息相同的信息,允许您一次查询多个 GPO 并构建一些不错的报告。

先决条件

在这篇博文中,您将演练一些场景。如果您想按照示例进行操作,请确保您已具备以下条件:

  • 组策略 PowerShell 模块。如果您使用的是 Windows 10,则可以通过下载并安装 RSAT 来找到它;如果您使用的是 Windows Server,则可以运行 PowerShell 命令 Install-WindowsFeature -Name GPMC。本教程假设您已经在 PowerShell 中导入了 GPO 模块。
  • 您登录的计算机是您要从中查询 GPO 的同一 AD 域的成员。
  • 您使用具有读取 GPO 权限的域用户帐户登录到加入 AD 的计算机。如果您使用本地帐户登录,您可能会看到下面的错误消息。

[玩转系统] 使用 PowerShell 导出 GPO 以获得精美的 GPO 报告

  • 您有可用的 Internet Explorer (IE)。不幸的是,Get-GPOReport 生成的 HTML 报告包含 ActiveX 控件,如果您想利用显示/折叠报告中的某些部分,则需要 IE。

[玩转系统] 使用 PowerShell 导出 GPO 以获得精美的 GPO 报告

[玩转系统] 使用 PowerShell 导出 GPO 以获得精美的 GPO 报告

生成 HTML 报告:单个 GPO

首先,假设您有一个 GPO,您想要查看设置(并从中生成 HTML 报告)。为此,您需要 GPO 的名称或 GPO 的 GUID。幸运的是,Get-GpoReport 可以在其中一个上找到 GPO,并使用 PowerShell 导出它们。

要生成简单的 HTML 报告,您需要至少使用三个参数:

  • 用于查找 GPO 的 GuidName
  • ReportType 指定要生成的报告类型(HTML 或 XML)
  • Path 用于指定 HTML 报告的保存位置

也许您的环境中有一个名为AppLocker Publisher Block Rules (EXE)的GPO。如果您知道本例中 GPO 的名称,则只需向 Name 参数提供该名称以及 HTML(而非 XML)的 HTML ReportType报告以及您想要保存此 HTML 文件的路径。

以下示例查询域中的 AppLocker 发布者阻止规则 (EXE) GPO,然后构建 HTML 报告,保存到 C:\Temp\AppL-Report.html 文件地点。

Get-GPOReport -Name 'AppLocker Publisher Block Rules (EXE)' -ReportType 'HTML' -Path 'C:\Temp\AppL-Report.html'

您也可以使用 Guid 参数来查找 GPO,但使用以下示例时这是一个额外的步骤。

$guid = (Get-GPO -Name 'AppLocker Publisher Block Rules (EXE)').Id
Get-GPOReport -Guid $guid -ReportType 'HTML' -Path 'C:\Temp\AppL-Report.html'

创建后,您可以在您喜欢的浏览器中打开报告并进行查看。

生成 HTML 报告:所有 GPO

也许您想为 GPO 构建域范围的报告。在这种情况下,您需要使用 All 参数查询域中的所有 GPO。

下面您可以看到相同的命令,让 PowerShell 导出 GPO 并运行它,只不过这次不是使用 NameGuid 参数来指定单个 GPO,而是使用All 参数来查找全部。

Get-GPOReport -All -ReportType Html -Path "C:\Temp\All-GPOs.html"

Get-GPOReport cmdlet 在 AD 环境中运行时,会查询通过 Server 参数提供的域控制器 (DC) 以读取 GPO。如果未提供Server,则默认为担任 PDC 模拟器角色的 DC。

使用 PowerShell 导出 GPO:XML

在 PowerShell 中导入 GPO 模块后,您可以使用 Get-GPOReport 执行更多操作,而不仅仅是使用 PowerShell 导出 GPO 并生成 HTML 报告。您也可以创建 XML 报告。例如,如果您想为特定 GPO 创建 XML 报告,则只需将 ReportType 参数的值从 HTML 更改为 XML。

以下示例查询名为 Google Chrome 的现有 GPO,生成 XML 报告,并通过与 XML 文件关联的默认应用程序中的 Invoke-Item 打开该报告(可能是您的默认浏览器)。

# Export the XML report for the GPO to an XML file
Get-GPOReport -Name 'Google Chrome' -ReportType Xml -Path "C:\temp\GoogleChromeGpReport.xml"
# Open the XML file
Invoke-Item -Path "C:\Temp\GoogleChromeGpReport.xml"

完成后,您将看到下面生成的 XML 文件。

您首先会注意到的是,所有内容都包含在 GPO XML 节点中。在其中您可能会找到诸如标识符(GPO GUID)、名称(GPO名称)、包含注释安全描述符之类的内容SDDL 以及更多信息。

[玩转系统] 使用 PowerShell 导出 GPO 以获得精美的 GPO 报告

深入研究 GPO XML 报告

除了格式之外,是什么让这个 XML 报告与 HTML 如此不同?在 XML 报告中,您将看到 HTML 报告中显示的属性,但它们更加结构化并且易于解析(不是为了人眼,而是为了像 PowerShell 这样的自动化工具)。

[玩转系统] 使用 PowerShell 导出 GPO 以获得精美的 GPO 报告

  • VersionDirectory -此 XML 节点显示存储在 Active Directory 数据库中的 GPO 版本。
  • VersionSysvol - 此 XML 节点显示 SYSVOL 中存储的 GPO 版本。
  • 已启用 - 此 XML 节点指示 GPO 的计算机用户部分是否已启用。如果禁用,客户端计算机上的组策略处理引擎将不会应用 GPO 相应部分中的设置。

当您在 GPO 中进行更改时,策略的版本(计算机或用户)会增加。这使得组策略处理引擎能够知道策略何时发生更改,从而知道何时应用新设置。这种行为允许您在 GPO 更改后运行 gpupdate.exe,而无需使用无处不在的 /force。

您将看到这些 GPO 属性反映在 GPMC 中,如下所示。

[玩转系统] 使用 PowerShell 导出 GPO 以获得精美的 GPO 报告

在 GPMC 中,您可能会看到 GPO 版本(对于 AD 和 SYSVOL)及其状态(已禁用、对计算机禁用、对用户禁用或启用)。

所有这些值对于 GPO 的一致性以及客户端计算机上 GPO 的处理速度都很重要。

旁注:VersionDirectory 和 VersionSysvol 值之间的差异表明 GPMC 中显示的内容与 SYSVOL 中存储的设置不匹配。识别此类不匹配可以让您在排除 GPO 故障时免去很多麻烦。

即使没有任何设置,VersionDirectory 和 VersionSysvol 等于 0 但 Enabled 值设置为 true 的策略也将由客户端处理。禁用 GPO 的相应部分将向处理引擎发出信号,表明不需要应用 GPO 的该部分。这不会对相当快的网络上的快速计算机的性能产生太大影响,但在许多此类 GPOS 的情况下,它可以节省宝贵的时间,特别是对于较慢网络上的旧计算机。

客户端计算机上的处理引擎不会应用 VersionDirectory 和 VersionSysvol(希望相同且)高于 0 但“Enabled”设置为 false 的策略。这可能是故意的,但值得研究一下,因为您可能想知道为什么某些设置不适用。

掌握了一些 GPO 内部知识后,您可以利用 Get-GPOReport 通过引用属性直接检查这些设置,而无需单击 GPMC。

也许您只想查看 GPO 中的特定设置,或者甚至最终使用 PowerShell 来获取链接到 OU 的 GPO,并且根本不需要生成报告。在这种情况下,请删除 Path 参数。请注意,在下面的示例中,没有 Path 参数,并且使用了 [xml] 转换。

[xml]$GpoXml = Get-GPOReport -Name 'YourGPOName' -ReportType Xml

通过将 Get-GPOReport 的 XML 输出转换为 XML 对象,您现在可以通过简单的点表示法轻松引用各种属性。

# Check the version information for the Computer part of the GPO
$GpoXml.GPO.Computer
# Check the version information for the User part of the GPO
$GpoXml.GPO.User

[玩转系统] 使用 PowerShell 导出 GPO 以获得精美的 GPO 报告

您是否需要查找域中所有 GPO 的特定属性?没问题。放入 foreach 循环,使用 All 参数迭代每个 GPO 输出。

# Retrieve all GPOs (not all GPO Reports!)
$AllGpos = Get-GPO -All
# Create a custom object holding all the information for each GPO component Version and Enabled state
$GpoVersionInfo = foreach ($g in $AllGpos) {
    [xml]$Gpo = Get-GPOReport -ReportType Xml -Guid $g.Id
    [PSCustomObject]@{
        "Name" = $Gpo.GPO.Name
        "Comp-Ad" = $Gpo.GPO.Computer.VersionDirectory
        "Comp-Sys" = $Gpo.GPO.Computer.VersionSysvol
        "Comp Ena" = $Gpo.GPO.Computer.Enabled
        "User-Ad" = $Gpo.GPO.User.VersionDirectory
        "User-Sys" = $Gpo.GPO.User.VersionSysvol
        "User Ena" = $Gpo.GPO.User.Enabled
    }
}
# See the result
$GpoVersionInfo | Sort-Object Name | Format-Table -AutoSize -Wrap

[玩转系统] 使用 PowerShell 导出 GPO 以获得精美的 GPO 报告

更深入:解析 XML GPO 报告

使用 Get-GPOReport 返回的 XML 输出,您可以深入了解 GPO 的许多不同方面。使用上面的示例,查看上面的 $GPOXml.GPO.Computer$GPOXML.GPO.User 属性,您将看到一个 ExtensionData 属性如下图所示。

[玩转系统] 使用 PowerShell 导出 GPO 以获得精美的 GPO 报告

如果您使用 Path 参数查看之前保存的 XML 报告(如下所示),您可以看到 ExtensionData 包含 GPO 中定义的设置。 ExtensionData XML 节点引用 GPO 中定义的各种设置。

[玩转系统] 使用 PowerShell 导出 GPO 以获得精美的 GPO 报告

通过使用 PowerShell 引用这些 XML 节点,您可以开始基于 XML 数据构建您自己的报告,如下所示。此示例查询 Google Chrome GPO 并循环访问每个用户设置,仅返回 NameStateSupported 属性。

# Get the GPO Guid (just like above)
$Id = (Get-GPO -DisplayName "Google Chrome").Id
# Store the output in a (XML) variable
[xml]$GpoXml = Get-GPOReport -Guid $Id -ReportType Xml

#Create a custom object containing only the policy "fields" we're interested in
$PolicyDetails = foreach ($p in $GpoXml.GPO.User.ExtensionData.Extension.Policy) {
    [PSCustomObject]@{
        "Name" = $p.Name
        "State" = $p.State
        "Supported" = $p.Supported
    }
}

#Let's see the results
$PolicyDetails

[玩转系统] 使用 PowerShell 导出 GPO 以获得精美的 GPO 报告

使用 PowerShell 获取链接到 OU 的 GPO

在结束之前,这里有另一个快速示例,介绍如何使用 Get-GPOReport 查看每个 GPO 链接到的 OU,以及每个链接的状态(启用或禁用) )。

首先,始终找到您需要引用的属性。最简单的方法之一是查看使用 Path 参数生成的 XML 文件。您可以在下面看到 XML 结构有多个 LinksTo 节点。这些节点包含指示有关各种 GPO 链接的信息的子节点。

[玩转系统] 使用 PowerShell 导出 GPO 以获得精美的 GPO 报告

您可能会注意到,同一 GPO 可能有多个链接(您可以将同一 GPO 链接到不同的站点、域或 OU)。您需要记住这一点并循环访问每个不同的链接。

一旦您知道要查询的 XML 节点,您就可以构建一个脚本来解析该 XML,如下所示。下面的示例查找域中的所有 GPO,从中生成 XML 输出,然后读取返回 GPO 名称的 LinksTo XM 节点 ($Gpo.GPO.Name )、OU 路径名称 ($i.SOMPath) 以及是否已启用 ($i.Enabled)。

# Retrieve all GPOs (not all GPO Reports!)
$AllGpos = Get-GPO -All
# Create a custom object holding all the GPOs and their links (separate for each distinct OU)
$GpoLinks = foreach ($g in $AllGpos){
        [xml]$Gpo = Get-GPOReport -ReportType Xml -Guid $g.Id
        foreach ($i in $Gpo.GPO.LinksTo) {
                [PSCustomObject]@{
                "Name" = $Gpo.GPO.Name
                "Link" = $i.SOMPath
                "Link Enabled" = $i.Enabled
                }
            }
        }
# See all the GPOs and the links for each
$GpoLinks | Sort-Object Name

完成后,您应该看到下面的输出。在本例中,Google Chrome 在报告中出现了 3 次,因为它链接到三个不同的 OU。您可能还注意到服务器 OU 的链接未启用。

[玩转系统] 使用 PowerShell 导出 GPO 以获得精美的 GPO 报告

进一步阅读

一旦您熟悉了 Get-GPOReport,您可能会发现其他与组策略相关的 cmdlet 来帮助您管理组策略。

  • Get-GPOReport 的 Microsoft 官方文档可在此处获取
  • 用于处理组策略的其他相关 cmdlet 包括 Get-GPO、Get-GPPermission 等。此处提供了与组策略相关的 cmdlet 的完整列表。
  • 丰富的 Active Directory 脚本

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯