3

我使用Powershell To Check Local Admin Credentials作为此代码段的基础,但遇到了问题。(不想线程劫持)

Add-Type -AssemblyName System.DirectoryServices.AccountManagement
$pc = New-Object System.DirectoryServices.AccountManagement.PrincipalContext('machine',$entry)
if($pc.ValidateCredentials("secretadmin", "secretpassword")){Write-host "good"}else{write-host "bad"}

它大约有 50% 的时间有效。剩下的时间,我明白了

使用“2”参数调用“ValidateCredentials”的异常:“不允许同一用户使用多个用户名与服务器或共享资源建立多个连接。断开与服务器或共享资源的所有先前连接,并再试一次。

这让我想起了使用 net use 验证凭据的批处理脚本,我们只需要删除映射的驱动器即可解决问题。由于没有我知道的已保存对象,我不确定如何清除此登录。我检查了登录用户,什么也没看到

基本上,我们正在为医院构建数百台服务器,并且需要确保符合政策,检查这些凭据只是其中的一部分,但这就是我遇到问题的地方。

任何帮助将不胜感激。在提出这些问题之前作为旁注。凭据是正确的,它们在脚本中是硬编码的,我可以收到失败并立即使用引发错误的相同凭据通过 RDP 和 psexec 登录。防火墙允许任何从我的主机到目的地。

4

1 回答 1

2

PrincipalContext实现IDisposable所以我建议这样做:

Add-Type -AssemblyName System.DirectoryServices.AccountManagement
$pc = New-Object DirectoryServices.AccountManagement.PrincipalContext('machine',$entry)

try {
    if($pc.ValidateCredentials("secretadmin", "secretpassword")) {
        Write-host "good"
    }
    else {
        Write-host "bad"
    }
}
finally {
    $pc.Dispose()
}
于 2013-11-11T22:55:53.953 回答