所以我有一個XP Pro工作站報告「Windows無法連接到域,或者是因爲域控制器關閉或不可用,或者因爲您的計算機帳戶未找到,請稍後重試。如果此消息繼續出現,請聯繫您的系統管理員以獲得幫助。使用域憑證登錄時使用。要手動解決這個問題,我只需使用本地管理員帳戶登錄,將其放到工作組中,然後重新將其添加到域中即可。然而,這個過程需要花費相當長的時間,因爲這個問題在我的工作中經常出現。我試圖做的是以編程方式自動化丟棄/重新連接過程。以下代碼有效,但前提是計算機正確地位於域或工作組中,而不是像現在這樣陷於僵局。當「Windows無法連接到域」時無法訪問WMI錯誤消息
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)當出現此錯誤消息時,使用管理憑據登錄到工作站?
謝謝大家提前任何潛在的幫助,請讓我知道是否需要更多的細節。
任何人都可以嗎?即使答案是「除了手動刪除和重新加入之外,你不能通過任何其他方式來解決這個問題」,這很好。只希望有人對此有所瞭解。 – VoidnessMD 2012-08-25 21:44:17