2012-08-14 5 views
1

보고 할 XP Pro 워크 스테이션이 있는데 입니다. "도메인 컨트롤러가 다운되었거나 사용할 수 없기 때문에 Windows가 도메인에 연결할 수 없습니다 또는 컴퓨터 계정을 찾을 수 없기 때문에 나중에 다시 시도하십시오.이 메시지가 계속 나타나면 시스템 관리자에게 도움을 요청하십시오. " 도메인 자격 증명으로 로그인 할 때 이 수동으로 수정하려면 로컬 관리자 계정으로 로그인하고 작업 그룹에 놓은 다음 도메인에 다시 추가하기 만하면됩니다. 그러나이 프로세스는 내 작업에서이 문제가 다소 자주 발생하는 것을 고려하면 상당한 시간이 걸릴 수 있습니다. 내가 뭘 하려는지 프로그래밍 방식으로 떨어지는/rejoining 프로세스를 자동화하는 것입니다. 다음 코드는 작동하지만 현재 컴퓨터가 도메인이나 작업 그룹에 올바르게 있고 limbo가 아닌 경우에만 작동합니다. "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 행에 로컬 관리자 자격 증명을 사용하여 컴퓨터에 로그인 할 경우 "액세스 거부 SWbemLocator가."

Set objWMIService = objwbemLocator.ConnectServer(SystemName, strNamespace, ComputerBLogin, ComputerBPass) 

함께 오류가 발생하지 않는다고

그래서 두 가지 방법을 사용하면 컴퓨터가이 절벽에있을 때 WMI에 액세스 할 수있는 방법이 없습니다. 내 연구에서는 마치 "워크 스테이션과 도메인 간의 트러스트 관계가 실패했습니다"라고 생각되지만 나에게 로컬 관리자 자격 증명으로 로그인 할 수없는 이유는 설명하지 않습니다.

NETDOM에 의지하고 싶지 않지만 어쨌든 시도했습니다. 실패한 신뢰 관계에 대해서도 오류가 발생합니다.

그래서 제 질문은 다음과 같습니다)이 오류 메시지가 존재 프로그래밍 작업 그룹에 워크 스테이션을 삭제하고이 도메인에 다시 추가 할 수있는 방법이
?
B) 프로그래밍 방식으로 워크 스테이션과 도메인 간의 트러스트 관계를 복구합니다 (실제로 문제가있는 경우).
C)이 오류 메시지가 나타나면 관리자 자격 증명으로 워크 스테이션에 로그인하십시오.

잠재적 인 도움이 필요한 모든 분들께 미리 감사드립니다. 더 자세한 정보가 필요하면 알려주십시오.

+0

누구나? 대답은 "수동으로 떨어 뜨리고 다시 참여하는 것 외에는 다른 방법으로는 해결할 수 없습니다"라고해도 괜찮습니다. 누군가가 이것에 대한 통찰력을 갖기를 바랄뿐입니다. – VoidnessMD

답변

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에는 손상된 호스트에서 스크립트를 복사하고 실행하기 위해 RPC를 사용하여 psexec 세션을 시작하는 등의 다른 방법보다 보안 검사 및 제한 사항이 많기 때문에 WMI를 사용하지 않습니다.

위 링크의 스크립트는 AD 자격 증명을 요구합니다. This link은 다음과 같이 해당 cred로 스크립트를 실행한다고 가정합니다. 좋아

strComputer = "atl-pro-040" 

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

응답 Lizz 주셔서 감사합니다. 내가 개체를 제거하고, 워크 스테이션을 재부팅하고, 로컬 관리자 자격 증명을 다시 시도하는 것이 좋습니다 - 불행히도 나는 같은 결과를 얻었습니다. 내가 여전히 이것을 할 수 있다고 생각하는 이유는 로컬 관리 cred와 RDP를 사용하고 성공적으로 로그인 할 수 있기 때문입니다. 따라서 네트워크를 통해 전달되는 신용 정보가있는 원격 통신의 일부 형태입니다. 작동하는 경우 논리적으로는 프로그래밍 방식으로 생각할 수 있습니다. 아직 방법을 찾지 못했습니다. netdom 비슷한 트러스트 관계에 대한 정보와 함께 오류가 있지만 psexec 시도했습니다. – VoidnessMD

+0

도메인에 있지 않은 동안 OS 방화벽은 RDP (3389)를 제외하고 모든 포트를 차단하도록 "가동"될 수 있습니다. 그 상태에서 RPC 포트에 연결할 수 있습니까? TCP 포트 135, 139 및 445입니다. http://support.microsoft.com/kb/187628 텔넷은 TCP 포트에 연결하는 간단한 방법입니다. :) – Lizz

+0

우수 제안! 따라서 언급 한 모든 포트 (3389, 135, 139 및 445)는 올바르게 연결됩니다. 표준 telnet (23)이 실패하더라도. 따라서 일부 포트는 차단되고 일부 포트는 차단되지 않습니다. 그렇다면 스크립트에서 차단 해제 된 포트를 통해서만 통신하도록하거나 어떻게 가능합니까? – VoidnessMD