
Ich möchte eine Liste meiner DHCP-Reservierungen von meinem DHCP-Server mit Windows Server 2012R2 erhalten. Die Liste sollte IP, MAC, Name, Beschreibung und den Lease-Status der Reservierung enthalten (nur um zu überprüfen, ob der Client online ist oder nicht). Ich weiß, dass es ein CMDLet gibt, um die Reservierungen abzurufen.
$IP_res = (Get-DhcpServerv4Reservation -ComputerName $env:COMPUTERNAME -ScopeId 10.10.0.0)
Das Ergebnis enthält nicht den Leasingstatus. Es gibt jedoch ein anderes CMDLet, um ihn abzurufen:
$IP_lease =(Get-DhcpServerv4Lease -ComputerName $env:COMPUTERNAME -ScopeId 10.10.0.0)
Nun bestand meine Idee darin, ein benutzerdefiniertes Objekt zu erstellen, das alle benötigten Attribute enthält.
$save = New-Object System.Collections.Generic.List[System.Object]
foreach($line in $IP_res)
{
$new_IP_Obj = "" | Select IP, MAC, Name, Description, LeaseStatus
$var = $IP_lease | Where-Object {$_.ClientId -eq $line.ClientId }
$new_IP_Obj.IP = $line.IPAddress.IPAddressToString
$new_IP_Obj.MAC = $line.ClientId
$new_IP_Obj.Name = $line.Name
$new_IP_Obj.Description = $line.Description
$new_IP_Obj.LeaseStatus = $var.AddressState
$save.add(new_IP_obj)
}
Leider ist Where-Object ziemlich langsam, wenn man große Datenmengen vergleichen muss.
Gibt es eine Möglichkeit, die Geschwindigkeit von Where-Object zu verbessern?
Antwort1
Hier ist ein Code, den ichgefundenund hierfür modifiziert.
$Merged = @()
$Scopes = Get-DhcpServerv4Scope -ComputerName dc2008 #-ScopeId '10.1.230.0'
Foreach ($Scope In $Scopes) {
$IP_res = (Get-DhcpServerv4Reservation -ComputerName dc2008 -ScopeId $Scope.ScopeId)
$IP_lease =(Get-DhcpServerv4Lease -ComputerName dc2008 -ScopeId $Scope.ScopeId)
$IP_lease + $IP_res | Group-Object -Property ClientId | ForEach {
If ($_.group[1].AddressState -ne $null) {
$Record = New-Object -TypeName psCustomObject -Property @{
IP=$_.group[0].IPAddress.IPAddressToString;
MAC=$_.group[0].ClientId;
Name=$_.group[1].Name;
Description=$_.group[0].Description;
LeaseStatus=$_.group[1].AddressState
};
$Merged += $Record
}
}
}
$Merged | ft -AutoSize
Obwohl ich es nicht beweisen kann, neige ich dazu anzunehmen, dass Group-Object eine schnellere Methode ist (da es beide Listen erhält, kann er schnellere Suchmethoden verwenden, im Gegensatz zu „where“, das eine Liste und ein zu suchendes Element erhält).