我试图用一些Powershell代码来清理DNS服务器。有多个DNS记录与相同的IP地址,我希望删除所有记录,但最新的那个IP地址。
我已经设法把重复出现的IP地址,名字,时间戳放到一个数组中。但是我肯定不能删除除最新记录之外的所有记录,因为数组包含多个ip地址,而且我只需要为每个ip保存最新的记录。
这是我到目前为止所得到的,任何协助都将不胜感激:
$CollectionDC = @()
$TotalDuplicateIP = @()
$RecordsDC = Get-DnsServerResourceRecord -ComputerName blaa -ZoneName "blaaaa.com" -RRType A
Foreach ($RecordDC in $RecordsDC)
{
$NewObjectdc = New-Object PsObject -Property @{
RecordName = $RecordDC.HostName
IP = $RecordDC.RecordData.IPv4Address
Timestamp = $RecordDC.TimeStamp
}
$CollectionDC += $NewObjectdc
}
$DuplicateIPDNS = ($CollectionDC.IP | group | ?{$_.Count -gt 1}).Values
foreach($item in $DuplicateIPDNS)
{
if($item.IPAddressToString -like "172.31.*")
{
$TotalDuplicateIP += $CollectionDC | Where-Object {$_.IP -eq $item.IPAddressToString}
}
}
$TotalDuplicateIP = $TotalDuplicateIP | sort IP,RecordName | Where-Object {$_.RecordName -notmatch "@|DomainDnsZones|ForestDnsZones|gc._msdcs"}
foreach($Record in $TotalDuplicateIP)
{
$Record
#Keep only the latest record (timestamp) for each IP
#Remove-DnsServerResourceRecord -WhatIf
}以上输出命令:
Timestamp IP RecordName
--------- -- ----------
12/11/2019 3:00:00 AM 172.31.0.107 blaa-217 #Remove
12/11/2019 11:00:00 AM 172.31.0.107 blaa-247 #Keep
12/10/2019 9:00:00 AM 172.31.0.107 blaa-301 #Remove
12/11/2019 2:00:00 AM 172.31.0.107 blaa-306 #Remove
12/11/2019 7:00:00 AM 172.31.0.107 blaa-320 #Remove
12/11/2019 8:00:00 AM 172.31.0.110 blaa-175 #Remove
12/11/2019 9:00:00 AM 172.31.0.110 blaa-236 #Keep
12/11/2019 8:00:00 AM 172.31.0.110 blaa-318 #Remove发布于 2019-12-12 09:59:11
我会改变一些事情。如果您有大量的DNS记录,Group-Object将需要很长时间来处理。
$IPRange = '192.168.60.*'
$ZoneName = 'test.local.uk'
$DNSQueryDC = 'mydc.test.local.uk'
# Get DNS records - exclude what you can here as "Group-Object" is slow - it will make subsequent processing faster
$RecordsDC = Get-DnsServerResourceRecord -ComputerName $DNSQueryDC -ZoneName $ZoneName -RRType A | Where-Object {
($_.Timestamp)`
-and ($_.HostName -notlike "*$ZoneName*")`
-and ($_.HostName -ne '@')
}
# Get all records matching the IP range
$CollectionDC = $RecordsDC | Where-Object { $_.RecordData.IPv4Address -like $IPRange } | ForEach-Object {
[pscustomobject] @{RecordName = $_.HostName;IP = $_.RecordData.IPv4Address;Timestamp = $_.TimeStamp}
}
# Group by IP to retrieve duplicates
$CollectionDC | Group-Object -Property IP | Where-Object { $_.Count -gt 1} | ForEach-Object {
# Sort by timestamp, then select all except the most recent one
Write-Host "Found duplicate IPs for: " $_.Name -ForegroundColor Yellow
$DuplicateIPs = $_.Group | Sort-Object Timestamp -Descending
Write-Host "`nMost recent record:"
$DuplicateIPs | Select-Object -First 1 | Out-Host
$RecordsToDelete = $DuplicateIPs | Select-Object -Skip 1
Write-Host "Deleting older records:" -ForegroundColor Cyan
$RecordsToDelete | Out-Host
# Now remove them
#
}发布于 2019-12-12 09:11:45
我不理解group将数组按相似项分组。一旦我得到了它,一切都在一起了。
下面是完成的部分。
$LatestRecord = @()
foreach($Record in $TotalDuplicateIP | Group-Object IP | Sort-Object Timestamp)
{
$LatestRecord += $Record.Group | select -Last 1
}
$Filtered = $TotalDuplicateIP | Where-Object { $_ -notin $LatestRecord }
foreach($ToRemoveItem in $Filtered)
{
#Write-Host -ForegroundColor Green "Removing:" $ToRemoveItem.Timestamp $ToRemoveItem.IP $ToRemoveItem.RecordName
Remove-DnsServerResourceRecord -ZoneName "blaaaa.com" -RRType A -Name $ToRemoveItem.RecordName -RecordData $ToRemoveItem.IP -WhatIf
}https://stackoverflow.com/questions/59284516
复制相似问题