我正在尝试使用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)
}
2条答案
按热度按时间ws51t4hk1#
我从昨天开始就一直在看这个,不明白为什么
Select-String
不起作用,今天我发现了......报告存储为多行字符串,而不是字符串数组。您可以对它执行-match
以获得值,但是Select-String
并不喜欢它看起来的多行格式。如果你对它使用-split '[\r\n]+'
,你可以让Select-String
找到你的字符串。如果你想使用RegEx来搜索设置值,你可以使用多行正则表达式搜索,如下所示:
我不知道如何匹配GPMC的名称,很抱歉,但这应该让你更接近你的目标。
**编辑:**为了尝试将每个设置都拆分成自己的文本块,而不仅仅是处理一个策略,我不得不对RegEx做了一些修改。这个策略的输出有点混乱,但我认为可以很简单地清理。这将把GPO拆分成单独的设置:
这样你就得到了一个类似这样的集合:
从那里你只需要过滤任何设置你正在寻找。
z9zf31ra2#
我在XPath中尝试过这种方法,因为在XML节点中导航时您将拥有更多的控制权:
测试后,我们发现Get-GPOReport cmdlet的XML输出中的设置名称并不总是与HTML输出中的设置名称匹配。例如:“作为服务登录”在XML输出中显示为“SeServiceLogonRight”。