2012-08-14 288 views
1

所以我有一個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)當出現此錯誤消息時,使用管理憑據登錄到工作站?

謝謝大家提前任何潛在的幫助,請讓我知道是否需要更多的細節。

+0

任何人都可以嗎?即使答案是「除了手動刪除和重新加入之外,你不能通過任何其他方式來解決這個問題」,這很好。只希望有人對此有所瞭解。 – VoidnessMD 2012-08-25 21:44:17

回答

1

好吧,我覺得有點愚蠢,不早點想這個,但Lizz's提到映射驅動器讓我思考。我試圖映射驅動器,但它一直想要使用我當前的憑據或我的域與備用域用戶名。所以我嘗試了「。\ LoginB」,但只是使用了我的電腦名稱,後面跟着「LoginB」。我最終不得不使用「SystemName \ LoginB」併成功地映射了驅動器。使用,我是能夠通過改變ComputerBLogin變量,這是實際可行的以下更正上面的代碼:

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 = SystemName & "\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 

感謝燈泡瞬間LIZZ!

0

據我所知,當它處於這種狀態時,與主機及其域名的關係不能被修復;我們從來沒有能夠做到這一點。爲此,還需要在腳本中對本地管理員和Active Directory帳戶憑據進行硬編碼,這是一個相當危險的過程。

取而代之,您必須delete the host from AD using your domain credentials,然後重新啓動主機。也許在從AD中刪除後,您可以使用本地管理員憑據登錄。爲了測試目的而複製此條件的一種方法是刪除測試PC的域對象,然後重新啓動並查看是否可以進行身份​​驗證。

最後,這可能只能交互地完成。而且我不會使用WMI,因爲WMI比其他方法具有更多的安全檢查和限制,例如使用RPC在受損主機上覆制和運行腳本來啓動psexec會話。

上述鏈接中的腳本會提示您輸入AD憑據。 This link假設您正在使用這些信用卡運行腳本,如下所示。

strComputer = "atl-pro-040" 

set objComputer = GetObject("LDAP://CN=" & strComputer & _ 
    ",CN=Computers,DC=fabrikam,DC=com") 
objComputer.DeleteObject (0) 
+0

感謝Lizz的迴應。我嘗試了刪除對象,重新啓動工作站,並再次嘗試本地管理員憑據的建議 - 不幸的是我得到了相同的結果。我仍然認爲這是可行的原因是因爲我能夠使用本地管理員權限的RDP併成功登錄。因此,這是通過網絡傳遞信號的遠程通信的一種形式,如果可行的話,邏輯上人們會認爲有一種程序化的方式來做到這一點,我只是想知道如何。我試過psexec,雖然類似於netdom,但它與信任關係有關的信息出錯。 – VoidnessMD 2012-08-28 14:46:18

+0

雖然不在域中,但操作系統防火牆可能會「彈出」以阻止除RDP(3389)之外的所有端口。在那種狀態下,你能連接到它的RPC端口嗎?這些是TCP端口135,139和445. http://support.microsoft.com/kb/187628 Telnet是一種連接到TCP端口的簡單方法。 :) – Lizz 2012-08-28 16:34:31

+0

優秀的建議!所以你提到的所有端口(3389,135,139和445)都能正確連接。雖然標準telnet(23)失敗。所以我們知道一些端口被阻塞,有些不是現在。那麼,我將如何指示我的腳本只通過一個暢通的端口進行通信,或者這是可能的? – VoidnessMD 2012-08-28 18:35:24

相關問題