powershell 如何使用PSCustomObject在XML中创建对子项的引用

whhtz7ly  于 2023-01-26  发布在  Shell
关注(0)|答案(1)|浏览(177)

我有一个由WinServer 2019生成的XML文件(GPO导出)。我希望创建对子项目的引用,该子项目包含AD组的名称:

<q1:UserRightsAssignment>
          <q1:Name>SeNetworkLogonRight</q1:Name>
          <q1:Member>
            <SID xmlns="http://www.microsoft.com/GroupPolicy/Types">S-1-5-9</SID>
            <Name xmlns="http://www.microsoft.com/GroupPolicy/Types">NT AUTHORITY\ENTERPRISE DOMAIN CONTROLLERS</Name>
          </q1:Member>

命令,我试着:

[xml]$GpoXml = Get-GPOReport -name $param1 -ReportType Xml

$Object3 = foreach ($p in $GpoXml.GPO.Computer.ExtensionData.Extension.UserRightsAssignment) {
    if ($p.Name -ne $null) {
        [PSCustomObject]@{
            "Name" = $p.Name
            "Value" = $p.Member.Name
        }
    }
}

对于$p. $Name,我得到了"SeNetworkLogonRight"作为Name,但是对于Value,我得到了"System.Object []"答案。为什么会这样?我应该如何创建一个引用来获取Member/Name项的值?
非常感谢!
更新:
完整块:

> <q1:UserRightsAssignment>
>           <q1:Name>SeNetworkLogonRight</q1:Name>
>           <q1:Member>
>             <SID xmlns="http://www.microsoft.com/GroupPolicy/Types">S-1-5-9</SID>
>             <Name xmlns="http://www.microsoft.com/GroupPolicy/Types">NT
> AUTHORITY\ENTERPRISE DOMAIN CONTROLLERS</Name>
>           </q1:Member>
>           <q1:Member>
>             <SID xmlns="http://www.microsoft.com/GroupPolicy/Types">S-1-5-11</SID>
>             <Name xmlns="http://www.microsoft.com/GroupPolicy/Types">NT
> AUTHORITY\Authenticated Users</Name>
>           </q1:Member>
>           <q1:Member>
>             <SID xmlns="http://www.microsoft.com/GroupPolicy/Types">S-1-5-32-544</SID>
>             <Name xmlns="http://www.microsoft.com/GroupPolicy/Types">BUILTIN\Administrators</Name>
>           </q1:Member>
>           <q1:Member>
>             <Name xmlns="http://www.microsoft.com/GroupPolicy/Types">Admin</Name>
>           </q1:Member>
>         </q1:UserRightsAssignment>
li9yvcax

li9yvcax1#

您有 * 多个 * <Member>子元素,这会导致PowerShell将它们作为 * 数组 *([object[]System.Object[])类型)返回。
访问此数组的.Name属性(由于PowerShell的member-access enumeration),然后返回<Name>孙元素的数组(跨所有<Member>元素)。
还要注意,在这种情况下,必须访问.Name.InnerText属性才能只获取元素的 * text *(因为元素也有 * attributes *)。
您需要:

  • 或者:为每个成员 * 创建[pscsustomobject]示例 *。
$Object3 = foreach ($p in $GpoXml.GPO.Computer.ExtensionData.Extension.UserRightsAssignment) {
    if ($p.Name) {
      foreach ($m in $p.Member) {
        [PSCustomObject]@{
            Name = $p.Name
            Value = $m.Name.InnerText
        }
      }
    }
}
  • 或者:例如,如果您希望每个特权使用 * 单个 * [pscustomobject],并且希望成员名称的 * 数组 * 用 * string * 表示,以便可以将对象导出到CSV文件,则需要对数组进行 * 自定义字符串化 *;在此示例中,/用作分隔符:
$Object3 = foreach ($p in $GpoXml.GPO.Computer.ExtensionData.Extension.UserRightsAssignment) {
    if ($p.Name) {
        [PSCustomObject]@{
            Name = $p.Name
            Value = $p.Member.Name.InnerText -join '/'
        }
    }
}

相关问题