1

そのため、「ドメインコントローラがダウンしているか利用できないため、またはコンピュータアカウントが見つからなかったため、Windowsはドメインに接続できません。後でもう一度やり直してください。このメッセージが続く場合は、XPProワークステーションを使用しています。表示されたら、システム管理者に連絡してください。」ドメイン資格情報を使用してログインする場合。これを手動で修正するには、ローカル管理者アカウントでログインし、ワークグループにドロップして、ドメインに再度追加します。ただし、この問題が私の仕事で頻繁に発生することを考えると、このプロセスにはかなりの時間がかかる可能性があります。私がやろうとしているのは、ドロップ/再結合プロセスをプログラムで自動化することです。次のコードは機能しますが、コンピューターがドメインまたはワークグループに正しく存在する場合にのみ機能し、現在のように不安定な状態ではありません。

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)このエラーメッセージが表示されたら、管理者の資格情報を使用してワークステーションにログインしますか?

潜在的な支援を事前に皆に感謝し、さらに詳細が必要な場合は私に知らせてください。

4

2 に答える 2

1

わかりました、私はこれをすぐに考えないのは少しばかげていると感じますが、ドライブのマッピングについてのリズの言及は私に考えさせました。ドライブをマップしようとしましたが、現在の資格情報または別のドメインユーザー名を持つドメインのいずれかを継続的に使用したいと考えていました。そこで、「。\ 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

電球の瞬間のリズをありがとう!

于 2012-08-29T00:24:01.047 に答える
0

私の知る限り、ホストとそのドメインとの関係は、この状態では修復できません。私たちはそれをプログラム的に行うことができたことがありません。これを行うには、ローカル管理者とActive Directoryアカウントの資格情報をスクリプトにハードコーディングする必要がありますが、これは非常に危険なプロセスです。

代わりに、ドメインクレデンシャルを使用してADからホストを削除してから、ホストを再起動する必要があります。おそらく、ADから削除した後、ローカル管理者の資格情報を使用してログインできるようになります。テスト目的でこの条件を複製する1つの方法は、テストPCのドメインオブジェクトを削除してから再起動し、認証できるかどうかを確認することです。

結局、これはインタラクティブにしか実行できないものかもしれません。また、WMIには、RPCを使用してpsexecセッションを開始し、損傷したホストでスクリプトをコピーして実行するなど、他の方法よりも多くのセキュリティチェックと制限があるため、WMIは使用しません。

上記のリンクのスクリプトは、ADクレデンシャルの入力を求めます。このリンクは、次のように、これらの資格情報を使用してスクリプトを実行していることを前提としています。

strComputer = "atl-pro-040"

set objComputer = GetObject("LDAP://CN=" & strComputer & _
    ",CN=Computers,DC=fabrikam,DC=com")
objComputer.DeleteObject (0)
于 2012-08-28T02:53:14.003 に答える