powershell Get-GPOReport并搜索匹配的名称值

92dk7w1h  于 2022-12-13  发布在  Shell
关注(0)|答案(2)|浏览(120)

我正在尝试使用PowerShell命令“Get-GPOReport”获取XML字符串格式的GPO信息,以便可以在其中搜索具有未知和不同元素标记名称的子元素值(我认为XML对象格式不适合我,所以我没有使用“[xml]”执行转换),但是我还不能解析XML输出,以便在所需的“Name”元素行之后找到与所搜索的文本匹配的一两行。
之后,我一直试图使用“Select-String”或“Select-XML”与XPath(格式不清楚,我不知道是否可以对各种策略记录位置使用一种格式)来匹配文本和获取值,但我没有任何运气。
此外,如果有人知道如何搜索GPMC GUI名称(即“强制密码历史记录”),而不需要首先找到要搜索的后端等效名称(即“PasswordHistorySize”),这也会更有帮助。
下面的初始代码是起作用的部分:

$String = "PasswordHistorySize"     # This is an example string, as I will search for various strings eventually from a file, but I'm not sure if I could search for equivalent Group Policy GUI text "Enforce password history", if anyone knows how to do that.
$CurrentGPOReport = Get-GPOReport -Guid $GPO.Id -ReportType Xml -Domain $Domain -Server $NearestDC

If ($CurrentGPOReport -match $String) 
{
    Write-Host "Policy Found: ""$($String)""" -Foregroundcolor Green
    #
    #
    # The following code is what I've tried to use to get value data, without any luck:
    #
    $ValueLine1 = $($CurrentGPOReport | Select-String -Pattern $String -Context 0,2)
    $Value = $($Pattern = ">(.*?)</" ; [regex]::match($ValueLine1, $Pattern).Groups[1].Value)
}
ws51t4hk

ws51t4hk1#

我从昨天开始就一直在看这个,不明白为什么Select-String不起作用,今天我发现了......报告存储为多行字符串,而不是字符串数组。您可以对它执行-match以获得值,但是Select-String并不喜欢它看起来的多行格式。如果你对它使用-split '[\r\n]+',你可以让Select-String找到你的字符串。
如果你想使用RegEx来搜索设置值,你可以使用多行正则表达式搜索,如下所示:

$String = "PasswordHistorySize"     # This is an example string, as I will search for various strings eventually from a file, but I'm not sure if I could search for equivalent Group Policy GUI text "Enforce password history", if anyone knows how to do that.
$CurrentGPOReport = Get-GPOReport -Guid $GPO.Id -ReportType Xml -Domain $Domain -Server $NearestDC

$RegEx = '(?s)' + [RegEx]::Escape($String) + '.+?Setting.*?>(.*?)<'

If($CurrentGPOReport -match $RegEx)
{
    Write-Host "Policy Found: ""$String""" -Foregroundcolor Green

    $Value = $Matches[1]
}

我不知道如何匹配GPMC的名称,很抱歉,但这应该让你更接近你的目标。

**编辑:**为了尝试将每个设置都拆分成自己的文本块,而不仅仅是处理一个策略,我不得不对RegEx做了一些修改。这个策略的输出有点混乱,但我认为可以很简单地清理。这将把GPO拆分成单独的设置:

$Policies = $CurrentGPOReport -split '(\<(q\d+:.+?>).+?\<(?:\/\2))' | Where { $_ -match ':Name' }

这样你就得到了一个类似这样的集合:

<q1:Account>
          <q1:Name>PasswordHistorySize</q1:Name>
          <q1:SettingNumber>21</q1:SettingNumber>
          <q1:Type>Password</q1:Type>
        </q1:Account>

从那里你只需要过滤任何设置你正在寻找。

z9zf31ra

z9zf31ra2#

我在XPath中尝试过这种方法,因为在XML节点中导航时您将拥有更多的控制权:

[string]$SearchQuery = "user"
[xml]$Xml = Get-GPOReport -Name "Default Domain Policy" -ReportType xml
[array]$Nodes = Select-Xml -Xml $Xml -Namespace @{gpo="http://www.microsoft.com/GroupPolicy/Settings"} -XPath "//*"
$Nodes | Where-Object -FilterScript {$_.Node.'#text' -match $SearchQuery} | ForEach-Object -Process {
    $_.Name #Name of the found node
    $_.Node.'#text' #text in between the tags
    $_.Node.ParentNode.ChildNodes.LocalName #other nodes on the same level
}

测试后,我们发现Get-GPOReport cmdlet的XML输出中的设置名称并不总是与HTML输出中的设置名称匹配。例如:“作为服务登录”在XML输出中显示为“SeServiceLogonRight”。

相关问题