所以我有一个 XP Pro 工作站报告“Windows 无法连接到域,因为域控制器已关闭或不可用,或者因为找不到您的计算机帐户。请稍后再试。如果此消息继续出现,请联系您的系统管理员寻求帮助。” 使用域凭据登录时。要手动修复此问题,我只需使用本地管理员帐户登录,将其放入工作组,然后将其重新添加到域中。然而,考虑到这个问题在我的工作中经常出现,这个过程可能需要相当长的时间。我正在尝试做的是以编程方式自动化删除/重新加入过程。以下代码有效,但前提是计算机正确位于域或工作组中,而不是像现在这样处于不确定状态。
Const JOIN_DOMAIN = 1
Const ACCT_CREATE = 2
Const ACCT_DELETE = 4
Const WIN9X_UPGRADE = 16
Const DOMAIN_JOIN_IF_JOINED = 32
Const JOIN_UNSECURE = 64
Const MACHINE_PASSWORD_PASSED = 128
Const DEFERRED_SPN_SET = 256
Const INSTALL_INVOCATION = 262144
Const WbemAuthenticationLevelPktPrivacy = 6
'On Error Resume Next
SystemName = "SystemName"
strNamespace = "root\cimv2"
ComputerBLogin = "LoginB"
ComputerBPass = "PassB"
ComputerALogin = "LoginA"
ComputerAPass = "PassA"
DomainName = "domain.com"
OU = "OU=desiredou,DC=domain,DC=com"
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate,authenticationLevel=pktPrivacy}!\\" & SystemName & "\root\cimv2")
If Err.Number <> 0 Then
Set objWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMIService = objwbemLocator.ConnectServer(SystemName, strNamespace, ComputerBLogin, ComputerBPass)
objWMIService.Security_.authenticationLevel = WbemAuthenticationLevelPktPrivacy
Err.Clear
End IF
Set colComputers = objWMIService.ExecQuery("Select * from Win32_ComputerSystem")
For Each objComputer in colComputers
Return = objComputer.UnJoinDomainOrWorkGroup(NULL, NULL)
Return = objComputer.JoinDomainOrWorkGroup("WORKGROUP", NULL, NULL)
If Err.Number <> 0 Then
Set WshShell = CreateObject("WScript.Shell")
message = WshShell.Popup (SystemName & " could not be dropped to the workgroup!" & vbCr &_
"Error: " & Err.Description,, "Title", 0 + 16)
Else
Set WshShell = CreateObject("WScript.Shell")
message = WshShell.Popup (SystemName & " was successfully dropped to the WORKGROUP!",, "Title", 0 + 64)
End If
Next
For Each objComputer in colComputers
ReturnValue = objComputer.JoinDomainOrWorkGroup(DomainName, ComputerAPass, ComputerALogin, OU, JOIN_DOMAIN + ACCT_CREATE)
If Err.Number <> 0 Then
Set WshShell = CreateObject("WScript.Shell")
message = WshShell.Popup ("Unable to join " & SystemName & " to the domain! Please join manually.",, "Title", 0 + 16)
Else
Set WshShell = CreateObject("WScript.Shell")
message = WshShell.Popup ("Domain joining was successful!",, "Title", 0 + 64)
End If
Next
当脚本到达第 24 行时:
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate,authenticationLevel=pktPrivacy}!\\" & SystemName & "\root\cimv2")
它错误“远程服务器机器不存在或不可用:'GetObject'”。如果机器在域中正确,该行将正常工作。AD 对象确实存在。如果出现此错误,我将其编码为在第 29 行使用本地管理员凭据登录机器:
Set objWMIService = objwbemLocator.ConnectServer(SystemName, strNamespace, ComputerBLogin, ComputerBPass)
这将与“SWbemLocator:访问被拒绝”出错。
因此,当机器处于这种状态时,使用我熟悉的两种方法都无法访问 WMI。在我的研究中,似乎“工作站和域之间的信任关系已经失败”,但对我来说,这并不能解释为什么我无法使用本地管理员凭据登录。
我不想求助于 NETDOM,但我还是尝试了。它也错误地谈论失败的信任关系。
所以我的问题是:
A)当出现此错误消息时,有没有办法以编程方式将工作站放到工作组中并将其重新添加到域中?
B)以编程方式修复工作站和域之间的信任关系(如果这实际上是什么问题)?
C)当出现此错误消息时,使用管理员凭据登录工作站?
提前感谢大家的任何潜在帮助,如果需要更多详细信息,请告诉我。