pixel0815
Goto Top

DHCP XML Bearbeitung via Powershell

Hallo zusammen,

ich bin auf die Idee gekommen einen DHCP Server zu exportieren.
Die XML Datei enthält natürlich einzelne Werte die nicht auf dem neuen DHCP Server passen.
Wenn ich eine Scope exportiere funktioniert der untenstehende Skriptteil wunderbar.

Wenn ich aber nun z.B. 5 Scopes exportiere, werden durch die Schleifen nicht alle bearbeitet.

Kann mir hier mal jemand auf die Sprünge helfen?

Export:
Export-DhcpServer -ScopeID $DHCPScope -File $DHCPConfigXML -Leases -Force -ComputerName $QuellDHCPServer -Verbose

Bearbeitung der XML Datei:
$DHCPXML =[xml](Get-Content C:\DHCPdata.xml)
@($DHCPXML.DHCPServer.IPv4.Scopes.Scope.Reservations.SelectNodes("Reservation")) | %{$_.'Name'=($_.'Name' -replace 'oldfqdn','newfqdn')}  
@($DHCPXML.DHCPServer.IPv4.Scopes.Scope.Leases.SelectNodes("Lease"))| %{$_.'HostName'=($_.'HostName' -replace 'oldfqdn','newfqdn')}  
$DHCPXML.Save("C:\ForNewDHCPServer.xml")  

Content-Key: 2676299659

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

Printed on: May 3, 2024 at 08:05 o'clock

Member: colinardo
Solution colinardo May 05, 2022, updated at May 06, 2022 at 06:17:01 (UTC)
Goto Top
Servus
Wenn ich aber nun z.B. 5 Scopes exportiere, werden durch die Schleifen nicht alle bearbeitet.
Kann ich nicht nachvollziehen, klappt im Test einwandfrei, guckst du hier in der folgende Demo das Ergebnis, alle Namen die TESTLAB.INTERN enthalten werden ersetzt mit NEW.DOMAIN
https://tio.run/##vVbRbpswFH0eX4FQJ16GDTTJkorQpkmkIiVplETbpG2aGLiFLTEIO8 ...

$DHCPXML = New-Object XML
$DHCPXML.Load("C:\DHCPdata.xml") # Die Load Methode des XML-Objects ist etwas sicherer da sie das Encoding in der XML Declaration beachtet  
$DHCPXML.DHCPServer.IPv4.Scopes.Scope.Reservations.Reservation | %{$_.Name = $_.Name -replace 'olddomain\.tld','newdomain.tld'}  
$DHCPXML.DHCPServer.IPv4.Scopes.Scope.Leases.Lease | %{$_.HostName = $_.HostName -replace 'olddomain\.tld','newdomain.tld'}  
$DHCPXML.Save("C:\ForNewDHCPServer.xml")  

Das einzige was ich mir bei dir vorstellen könnte wäre das du evt. nicht beachtet hast das -replace mit RegularExpression Syntax arbeitet. Des weiteren solltest du .SelectNodes nur verwenden wenn die Knoten auch wirklich keine XML-Namespace Angabe haben was sie i.d.R. beim DHCP-Export haben, wenn sie es haben das Ergebnis aber leer ist, was ich aber in älteren Versionen von hier aus nicht ausschließen kann, deswegen auf meine Methode ausweichen die ich in der Demo-Variante verwendet habe um die einzelnen Knoten abzuarbeiten.
Also statt
$DHCPXML.DHCPServer.IPv4.Scopes.Scope.Reservations.SelectNodes("Reservation")  
folgendes für den Input des Foreach-Objects
$DHCPXML.DHCPServer.IPv4.Scopes.Scope.Reservations.Reservation

Wenn du zusätzlich natürlich noch IPv6 Scopes hast musst du diese auch berücksichtigen, im Moment bearbeitest du ja nur IPv4 Scopes.
Des weiteren musst du auch die Options berücksichtigen, wenn in denen auch der Domain-Name verwendet wird.
Willst du wirklich alle Vorkommen in Bereichen egal wo berücksichtigen kannst du etwas generisches wie
$DHCPXML.DHCPServer.SelectNodes("//text()") | %{$_.innerText = $_.innerText -replace 'olddomain\.tld','newdomain.tld'}  
verwenden, das in allen Textknoten die alte Domain durch die neue ersetzt.
https://tio.run/##1VZrb9owFP28/Ioo6pRWWuwkQHgopKWANCSgCNA2aZumLLkt2cBBsY ...

Grüße Uwe
Member: pixel0815
pixel0815 May 27, 2022 at 13:04:05 (UTC)
Goto Top
Hallo Colinardo, du hast völlig recht. Ich danke dir für die Hinweise face-smile face-smile Das hat super geklappt. LG