如何使用powershell

时间:2016-08-08 19:02:35

标签: windows powershell dns active-directory

我对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中删除条目并验证删除是否成功的方法?帮助;)

1 个答案:

答案 0 :(得分:1)

  

我无法使用那些很酷的新的Server 2012 DNS模块进行ps

是的,你可以,只要你有至少一台足够新的机器来运行它们。它们可以很好地对抗2008 R2域控制器。这会简化很多事情!

否则,您仍然可以使用CIM / WMI调用来检索记录的值,而不是使用GetHostEntry

示例,礼貌Jon Dechiro

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 
}