我对Server 2008 R2域有一个(至少我认为)棘手的问题。我为AD计算机帐户编写了一个清理脚本。除了AD中的帐户,我还想删除SCCM和DNS帐户。但是使用DNS我有一个问题。我需要记录所有内容,因为我的脚本每天都会作为一项工作运行。 使用正常的AD模块cmdlet通过使用以下内容可以很好地工作:
Remove-ADComputer -Identity $account -confirm:$false
if($?){
Write-Log -LogContent "Delete-OldADaccount: successfully deleted account `"$($account.name)`" with LastLogondate `"$($account.LastLogondate)`", full path `"$($account.distinguishedname)`"" -LogPath $logFile
} else {
Write-Log -LogContent "Delete-OldADaccount: failed to delete account `"$($account.name)`": $($error[0].Exception.Message)" -LogPath $logFile -Level 'Warn'
}
为了删除旧的DNS条目,我发现了两个针对Server 2008 R2的解决方案(我不能将那些很酷的新Server 2012 DNS模块用于ps):
dnscmd $DNSServer /RecordDelete $ZoneName $Computer A /f
和
Get-WmiObject -ComputerName $dnsserver -Namespace 'Root\MicrosoftDNS' -class MicrosoftDNS_AType -Filter "domainname = '$computer'" | Remove-WmiObject
但是,即使DNS中没有与我的计算机帐户名称匹配的记录,两个命令(dnscmd和Remove-WmiObject)也始终返回true。所以我不能使用与上面类似的结构。
所以我尝试过这样的事情:
try{
[System.Net.DNS]::GetHostEntry($computer)
Get-WmiObject -ComputerName $dns -Namespace 'Root\MicrosoftDNS' -class MicrosoftDNS_AType -Filter "domainname = '$computer'" | Remove-WmiObject -whatif
Get-WmiObject -ComputerName $dns -Namespace 'Root\MicrosoftDNS' -class MicrosoftDNS_AAAAType -Filter "domainname = '$computer'" | Remove-WmiObject -whatif
Write-Log -LogContent "Delete-OldADaccount: successfully deleted DNS entry for `"$($computer)`"" -LogPath $logFile
}
catch {
Write-Log -LogContent "Delete-OldADaccount: failed to delete DNS entry for `"$($computer)`": $($error[0].Exception.Message)" -LogPath $logFile -Level 'Warn'
}
使用静态函数[System.Net.DNS]::GetHostEntry($computer)
我测试是否至少有一个ipv4条目(因为我的系统上的ipv6被禁用,如果只有一个ipv6条目,我会得到一个异常。如果ipv4和ipv6都存在它作品)。如果有条目,则继续使用ipv4和ipv6的Remove-WmiObject cmdlet。
如果DNS中没有这样的条目,我会得到一个异常并直接跳转到我记录错误的catch块。
但即使使用这种方法,如果Remove-WmiObject成功,我也不知道。我必须执行ipconfig /flushdns
并重新运行命令[System.Net.DNS]::GetHostEntry($computer)
以查看它是否现在失败并将其解释为“条目已删除”。
请问,还有另一个cmdlet或Server 2008 R2从DNS中删除条目并验证删除是否成功的方法?帮助;)
答案 0 :(得分:1)
我无法使用那些很酷的新的Server 2012 DNS模块进行ps
是的,你可以,只要你有至少一台足够新的机器来运行它们。它们可以很好地对抗2008 R2域控制器。这会简化很多事情!
否则,您仍然可以使用CIM / WMI调用来检索记录的值,而不是使用GetHostEntry
。
if (Get-WmiObject -ComputerName $dnsserver -Namespace 'Root\MicrosoftDNS' -class MicrosoftDNS_AType -Filter "domainname = '$computer'") {
Write-Log -LogContent "Delete-OldADaccount: failed to delete DNS entry for "$($computer)": Entry still exists on $dnsserver" -LogPath $logFile -Level 'Warn'
} else {
Write-Log -LogContent "Delete-OldADaccount: successfully deleted DNS entry for "$($computer)"" -LogPath $logFile
}