【问题标题】:Extract specific information from many xml files从许多 xml 文件中提取特定信息
【发布时间】:2014-01-03 11:13:38
【问题描述】:

我有一个脚本,它正在导出我们的用户软件并将注册表项运行到 xml 文件,以便我们跟踪可疑文件。我有数百个 xml 文件,其中包括:

<MDetection>
   <SoftwareReg>
      <Soft1>HKCU\SOFTWARE\Adobe</Soft1>
      <Soft2>HKCU\SOFTWARE\Ask.com</Soft2>
      <Soft3>HKCU\SOFTWARE\Citrix</Soft3>
      <Soft4>HKCU\SOFTWARE\Google</Soft4>
      ...
   </SoftwareReg>
   <RunReg>
      <Run1>SOFTWARE\Microsoft\Windows\Currentversion\Run\Sidebar-->C:\Program Files\Windows Sidebar\sidebar.exe /autoRun</Run1> 
      <Run2>SOFTWARE\Microsoft\Windows\Currentversion\Run\WindowsWelcomeCenter-->rundll32.exe oobefldr.dll,ShowWelcomeCenter</Run2> 
      ...
   </RunReg>
   <Hostname>USERPC01</Hostname>
   <Username>JonesA</Username>
   <TimeGenerated>03/01/14 11:00</TimeGenerated>
</MDetection>

我希望能够在所有 XML 文件中搜索特定的 SoftwareReg 或 RunReg 键,并且还能够使用通配符搜索条目。例如搜索所有“Ask.com”键或以“cr”开头的条目。

我遇到的问题是我想知道相应的 reg 键所指的主机名和用户名。我无法提取这些。

我的 Xml Powershell 不是最强大的,因此我们将不胜感激!我目前正在使用:

   $XmlData = Select-Xml -Path '\\Server\Share$\*.xml' -XPath '//MDetection' -ErrorAction 'silentlycontinue'
   $XmlData | %{$a += $_.Node.SoftwareReg.ChildNodes.'#text'}

我正在使用 $a 临时存储所有 reg 条目,但我无法提取主机名或用户名。我怀疑有一种我目前正在使用的更简单的方法!

非常感谢,

【问题讨论】:

    标签: xml search powershell


    【解决方案1】:

    尝试select将信息写入自定义对象:

    $XmlData | select @{
        n='Software';e={$_.Node.SoftwareReg.ChildNodes.'#text' | ? {$_ -ne $null}}
      },
      @{n='Hostname';e={$_.Node.Hostname.ToString()}},
      @{n='Username';e={$_.Node.Username.ToString()}}
    

    以上创建对象,其中属性Software 包含一个包含注册表路径的数组。要将分层数据转换为表格数据,您可以尝试以下操作:

    $XmlData | % {
      $username = $_.Node.Username.ToString()
      $hostname = $_.Node.Hostname.ToString()
    
      $_.Node.SoftwareReg.ChildNodes.'#text' | ? { $_ -ne $null } |
        select @{n='Software';e={$_}},
          @{n='Hostname';e={$hostname}},
          @{n='Username';e={$username}}
    }
    

    【讨论】:

    • 太好了,谢谢 - 我现在得到了所有 3 条信息,但格式不正确。我需要每行的每个 条目 - 目前我正在获取整个 节点。
    • @kr0me 您从&lt;SoftwareReg&gt; 节点获得了一个包含文本值的数组。有关创建表格输出的方法,请参阅更新的答案。
    • 好用!非常感谢您在这方面的帮助。
    【解决方案2】:

    我不得不做类似的事情。

    这样做的方法是利用 XSLT,你可以在这里了解 http://www.w3schools.com/xsl/default.asp 该教程应该足以满足您的需求。该语言可以做相当复杂的事情。

    【讨论】:

    • 谢谢,但是不能使用 Select-Xml 和 Select-String 吗?
    【解决方案3】:

    意识到使用正则表达式解析 XML 可能被认为是异端:

    $search = 'Ask.com'
    $Rsearch = [regex]::Escape($search)
    
    $regex=@"
    (?ms)<MDetection>
       <SoftwareReg>.+?$Rsearch.+?
       </RunReg>
       <Hostname>(.+?)</Hostname>
       <Username>(.+?)</Username>
       .+
    "@
    
    
    (Get-Content file.xml -Raw) -match $regex > $nul
    $matches
    
    
    Name                           Value                                                                 
    ----                           -----                                                                 
    2                              JonesA                                                                
    1                              USERPC01                                                              
    0                              <MDetection>...                                                       
    

    【讨论】:

      猜你喜欢
      • 2015-09-08
      • 2015-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 2022-12-04
      相关资源
      最近更新 更多