lorsumalpha
Goto Top

Powershell: XML Attribute auslesen

Hallo,
aktuell möchte ich ein .csv Export erstellen für ein XML-Export, also diesen weiterverarbeiten und aufbereiten.
Die .xml-Datei sieht folgendermaßen aus:
<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">  
  <Obj RefId="0">  
    <TN RefId="0">  
      <T>Selected.System.Security.Cryptography.X509Certificates.X509Certificate2</T>
      <T>System.Management.Automation.PSCustomObject</T>
      <T>System.Object</T>
    </TN>
    <MS>
      <DT N="NotAfter">2022-12-20T09:10:44+01:00</DT>  
      <S N="Subject">Computer-203</S>  
    </MS>
  </Obj>
</Objs>

Mein Ansatz war folgender bisher:
$path = "C:\Temp\Cert"  
$FileLogdate = Get-Date -format 'dd_MM_yyyy'  
$exportpath = "C:\Temp\Cert\$FileLogdate-export.csv"  
Get-ChildItem $path -filter *.xml |
    ForEach-Object {
        [xml]$empDetails = Get-Content $_.Fullname
            [pscustomobject]@{
            'Client' = [string]$empDetails.Objs.Obj.MS.S;  
            'CertificateExpire' = [string]$empDetails.Objs.Obj.MS.DT;  
        } |  Export-CSV -Append -Path $exportpath -NoTypeInformation   
    }

Leider bekomme ich die Objekte nicht, liegt das am N="X"?, kann ich das gesondert ansteuern?

Danke für alle Hilfe!

Content-ID: 3984015058

Url: https://administrator.de/contentid/3984015058

Ausgedruckt am: 22.11.2024 um 13:11 Uhr

3803037559
Lösung 3803037559 19.09.2022 um 09:01:54 Uhr
Goto Top
$empDetails.Objs.Obj.MS.S.innerText
lorsumalpha
lorsumalpha 19.09.2022 um 09:03:06 Uhr
Goto Top
Zitat von @3803037559:

$empDetails.Objs.Obj.MS.S.innerText

Danke dir!
lorsumalpha
lorsumalpha 19.09.2022 um 09:38:41 Uhr
Goto Top
@3803037559
Hast du Zufällig noch eine Idee hierzu:
Ich habe ein paar Sonderfälle bei mir, wo zwei Attribute drin sind, welche ich aussortieren möchte:
Beispiel .xml:
<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">  
  <Obj RefId="0">  
    <TN RefId="0">  
      <T>Selected.System.Security.Cryptography.X509Certificates.X509Certificate2</T>
      <T>System.Management.Automation.PSCustomObject</T>
      <T>System.Object</T>
    </TN>
    <MS>
      <DT N="NotAfter">2022-12-18T14:52:35+01:00</DT>  
      <S N="Subject">Computer-203</S>  
    </MS>
  </Obj>
  <Obj RefId="1">  
    <TNRef RefId="0" />  
    <MS>
      <DT N="NotAfter">2023-02-24T08:35:36+01:00</DT>  
      <S N="Subject">Computer-203</S>  
    </MS>
  </Obj>
</Objs>

Hier bildet er natürlich beide Werte in einer Spalte wieder:
"Computer-203 Computer 203", "2022-12-18T14:52:35+01:00 2023-02-24T08:35:36+01:00"

Gäbe es einen einfachen Workaround?

aktueller Code:

$path = "C:\Temp\Cert"  
$FileLogdate = Get-Date -format 'dd_MM_yyyy'  
$exportpath = "C:\Temp\Cert\$FileLogdate-expordt.csv"  
Get-ChildItem $path -filter *.xml |
    ForEach-Object {
        [xml]$empDetails = Get-Content $_.Fullname
            [pscustomobject]@{
            'Client' = [string]$empDetails.Objs.Obj.MS.S.innerText;  
            'CertificateExpire' = [string]$empDetails.Objs.Obj.MS.DT.InnerText;  
        } |  Export-CSV -Append -Path $exportpath -NoTypeInformation   
    }
3803037559
3803037559 19.09.2022 um 09:42:01 Uhr
Goto Top
Und welchen willst du ?
lorsumalpha
lorsumalpha 19.09.2022 um 09:42:35 Uhr
Goto Top
@3803037559
Ich würde gerne beide in einer gesonderten Spalte haben, bzw. einfach abgetrennt
3803037559
3803037559 19.09.2022 um 09:44:31 Uhr
Goto Top
Dann mach einfach zwei weitere Properties wenn es mehr wie eins gibt, und nimm den ArrayIndex 0 für das erste und 1 für das zweite, feddisch.
lorsumalpha
lorsumalpha 19.09.2022 um 10:02:22 Uhr
Goto Top
Zitat von @3803037559:

Dann mach einfach zwei weitere Properties wenn es mehr wie eins gibt, und nimm den ArrayIndex 0 für das erste und 1 für das zweite, feddisch.

Okay kann sein, dass ich auf dem Schlau stehe oder mir etwas an Powershell-Kenntnissen fehlt - habe folgendes Probiert ohne Erfolg leider:
$path = "C:\Temp\Cert\"  
$FileLogdate = Get-Date -format 'dd_MM_yyyy'  
$exportpath = "C:\Temp\Cert\$FileLogdate-asdfsd.csv"  
Get-ChildItem $path -filter *.xml |
    ForEach-Object {
        [xml]$empDetails = Get-Content $_.Fullname
            [pscustomobject]@{
            'Test' =[string]$_.FullName ;  
            'Client' = [string]$empDetails.Objs.Obj.MS.S.innerText;  
            'CertificateExpire' = [string]$empDetails.Objs.Obj.MS.DT.InnerText;  
            'Client 2'[1] = [string]$empDetails.Objs.Obj.MS.S.innerText;  
            'CertificateExpire 2' = [string]$empDetails.Objs.Obj.MS.DT.InnerText;  
        } |  Export-CSV -Append -Path $exportpath -NoTypeInformation   
    }
3803037559
3803037559 19.09.2022 aktualisiert um 10:09:10 Uhr
Goto Top
Okay kann sein, dass ich auf dem Schlau stehe
Auf dem "Schlau" weiß ich nicht, aber was ich weiß ist das du die IF Abfrage vergessen hast ... Gönne dir mal einen Kaffee damit die grauen Zellen am Montag mal langsam in Wallung kommen
lorsumalpha
Lösung lorsumalpha 19.09.2022 um 12:59:51 Uhr
Goto Top
Zitat von @3803037559:

Okay kann sein, dass ich auf dem Schlau stehe
Auf dem "Schlau" weiß ich nicht, aber was ich weiß ist das du die IF Abfrage vergessen hast ... Gönne dir mal einen Kaffee damit die grauen Zellen am Montag mal langsam in Wallung kommen

Ja der hat echt geholfen :D
Hab jetzt einen etwas anderen Workaround gefunden:
$path = "C:\Temp\Cert\"  
$FileLogdate = Get-Date -format 'dd_MM_yyyy'  
$exportpath = "C:\Temp\Cert\$FileLogdate-sdf.csv"  

Get-ChildItem $path -filter *.xml |
    ForEach-Object {
        [xml]$empDetails = Get-Content $_.Fullname
        $empDetails.Objs.Obj | 
        % {
            [pscustomobject] @{
                "Client"            = $_.ms.s.innertext  
                "CertificateExpire" = $_.ms.dt.innertext  
            }
        } | Export-CSV -Append -Path $exportpath -NoTypeInformation 
}
3803037559
3803037559 19.09.2022 aktualisiert um 13:18:29 Uhr
Goto Top
Hey, mal jemand der auch mitdenkt 👍, ist ja selten hier face-smile! Separate Zeilen sind ja auch eh besser als weitere Spalten in einer CSV.
lorsumalpha
lorsumalpha 20.09.2022 um 10:45:22 Uhr
Goto Top
Zitat von @3803037559:

Hey, mal jemand der auch mitdenkt 👍, ist ja selten hier face-smile! Separate Zeilen sind ja auch eh besser als weitere Spalten in einer CSV.

Das ganze funktioniert echt gut - leider habe ich nun ein zwei Fälle, wo zwei <S N="XX"></S> Attribute abgefragt werden sollen
Weißt du zufällig, ob man nach dem N Filtern kann? Hier eine Beispiel .xml:
<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">  
  <Obj RefId="0">  
    <TN RefId="0">  
      <T>Selected.System.Security.Cryptography.X509Certificates.X509Certificate2</T>
      <T>System.Management.Automation.PSCustomObject</T>
      <T>System.Object</T>
    </TN>
    <MS>
      <DT N="NotAfter">2022-12-18T13:43:35+01:00</DT>  
      <S N="Subject">Computer-203</S>  
      <S N="Issuer">DOMAIN</S>  
    </MS>
  </Obj>
</Objs>
3803037559
3803037559 20.09.2022 aktualisiert um 10:58:51 Uhr
Goto Top
Where-Object ist wie immer dein Freund.
$_.ms.dt.s | ?{$_.n -eq 'Subject'} | %{$_.innerText}