「信頼関係がワークステーションとプライマリ ドメインの間で失敗しました」という問題の修正方法

Windowsシステム管理者にとって最も一般的な問題の一つは、信頼されたActive Directoryコンピューターがドメインから外れることです。悪名高い「このワークステーションとプライマリドメイン間の信頼関係が失敗しました」というエラーメッセージは非常によく見られます。

このガイドでは、私が20年以上にわたりActive Directoryを管理してきた経験から得たあらゆるトリックと、それをPowerShellで自動化する方法を学ぶことができます。

「このワークステーションとプライマリドメイン間の信頼関係が失敗しました」というエラーメッセージ

ADドメインがコンピューターを信頼しなくなるのは、おそらくローカルコンピューターのパスワードがActive Directoryに保存されているパスワードと一致しないためです。

The Trust Relationship Between This Workstation and the Primary Domain Failed

ADがコンピューターを信頼するためには、2つのパスワードが同期している必要があります。同期していない場合、悪名高いエラーメッセージ「このワークステーションとプライマリドメイン間の信頼関係が失敗しました」が表示されます。

残念ながら、私や他のシス管が100%の確実性を持って解決策を見つけたことはありません。それがこのガイドを書いた理由です。

このガイドは、この問題を一度解決し、さらにPowerShellでプロセスを自動化するための唯一の情報源となることを目指しています。

Active Directoryコンピューターアカウントのパスワード

新しいコンピュータがActive Directoryに追加されると、パスワード付きのコンピュータアカウントが作成されます。デフォルトでは、そのパスワードは30日間有効です。30日後に自動的に変更されます。もし変更されたのにクライアントのパスワードが変更されていない場合、”このワークステーションとプライマリドメイン間の信頼関係が失敗しました”というエラーメッセージが表示されます。

既存のポリシーの表示

ドメイン全体のポリシーは、グループポリシー管理コンソール(GPMC)を開いて表示することができます。GPMC内で、デフォルトドメインポリシーをクリックし、コンピュータの構成 –> Windowsの設定 –> セキュリティ設定 > ローカルポリシー > セキュリティオプションに移動します。

セキュリティオプションに入ったら、以下に示すように、ドメインメンバー: 最大マシンアカウントパスワード寿命ポリシーを探します。

Computer Account Password Age Policy

ADに参加しているコンピュータでは、regeditを開き、HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parametersレジストリキーに移動し、以下に示すようにMaximumPasswordAge値を見つけます。

Local Computer Account Password Age Registry Value

その際、DisablePasswordChange値を1に設定することで、ローカルコンピュータでのパスワード変更を完全に無効にすることもできます。

コンピュータアカウントが変更されると、ローカルコンピュータとADコンピュータアカウントの両方のパスワードが一緒に変更されるはずです。一時的に同期が取れなくなった場合に備えて、ADは現在のパスワードと前のパスワードを知っています。

コンピュータアカウントパスワード変更プロセス

通常、Netlogon Windowsサービスを使用している場合、コンピュータは自動的にパスワードの変更を開始します。これはコンピュータの再起動時や、コンピュータオブジェクトがADに認証する必要がある場合に行われます。

Netlogon Windowsサービスを使用すると、ローカルコンピュータがパスワードの変更シーケンスを開始します。コンピュータはまずドメインコントローラーでパスワードの変更を開始します。これが成功すると、ローカルのパスワードを一致させるために、HKLM\SECURITY\Policy\Secrets<hostname>.ACCレジストリキー内で変更を試みます。

通常、このプロセスは素晴らしく機能します。コンピュータが30日以上オフラインになっていても、ローカルコンピュータがパスワードの変更を開始するためです。

しかし、次のような問題が発生する場合があります:

  • コンピュータがADコンピュータアカウントを変更するが、ローカルのパスワードを変更できない場合
  • コンピュータがSysprepを実行せずに再イメージ化される場合
  • OSが再インストールされ、古い有効なADコンピュータアカウントで認証を試みる場合
  • …その他の場合

上記のいずれかが発生すると、「このワークステーションとプライマリ ドメイン間の信頼関係が失敗しました」というエラーメッセージが表示されます。

問題の確認

問題が存在することがわかったら、どのコンピュータに問題があるかを複製するか、少なくとも判断する方法はありますか?各コンピュータに対して対話的にログインを試みることもできますが、スケーラブルではなく、デスクから立ち上がりたくありません。できるかもしれません

ドメイン内のコンピュータのうち、この問題を根絶するために「このワークステーションとプライマリ ドメイン間の信頼関係が失敗しました」というエラーメッセージを持つものを特定するために、ローカルおよびリモートで実行できるスクリプトを作成しましょう。

まず第一に、ドメインの認証が機能していないと仮定するので、管理者グループのローカルユーザーアカウントを知る必要があります。ローカルの管理者パスワードを知っていることを願っています!

nltest(コマンドラインツール)

nltestは、コンピュータの信頼関係をテストする古いスクールのコマンドラインツールです。このツールは、RSATをインストールするときにインストールされるか、直接ドメインコントローラーで利用できます。

コンピュータにログオンしているときに、次のコマンドを実行することで信頼関係を確認できます:

> nltest /sc_verify:<your domain FQDN>

警告: この方法は推奨されません。nltestは、起動されたユーザーコンテキストでのみ機能します。コンピュータの信頼関係が壊れている場合、ローカルユーザーとしてログインしている場合、ローカルユーザーの資格情報を使用してドメインに接続しようとします。これにより、アクセスが拒否されます。

netdom(コマンドラインツール)

netdomは、信頼関係を確認するための別のコマンドラインツールです。このツールは、RSATをインストールすると同時にインストールされるか、またはドメインコントローラー上で直接利用することができます。

netdom verifyを使用して、信頼関係を確認するには、以下の情報を提供します:

  • 確認するコンピュータ名
  • ドメインのFQDN
  • リクエストを認証するユーザー名
  • ユーザーアカウントのパスワード

以下は例です:

> netdom verify MYCOMPUTER /Domain:domain.local /UserO:abertram /PasswordO:*

PasswordOパラメータに*の値を指定すると、netdomはパスワードの入力を求めます。

Test-ComputerSecureChannel (PowerShell)

「このワークステーションとプライマリドメイン間の信頼関係が失敗しました」という問題を解決する最良の方法の1つは、Test-ComputerSecureChannelコマンドレットを使用することです。このPowerShellコマンドレットはWindows 10に付属しており、使いやすくなっています。

Test-ComputerSecureChannelのコマンドレットは、Windows 10コンピューター上でローカルに動作します。コンピューターに対話的にログインした状態で、PowerShellコンソールを開き、パラメータなしでTest-ComputerSecureChannelを実行します。信頼関係が有効かどうかに応じて、TrueまたはFalseが返されます。

PS51> Test-ComputerSecureChannel
True

また、Serverパラメータを使用して、パスワードが同期されているかどうかを確認するために特定のドメインコントローラーを指定することもできます。

PS51> Test-ComputerSecureChannel -Server 'DC.domain.local'
False

このコマンドレットは使用方法が簡単で、Repairオプションもありますが、修正のデモンストレーションは後で行います。

対象のコンピューターのローカル管理者パスワードを知っていて、それらのコンピューターでPowerShellリモートが有効になっている場合、Invoke-Commandコマンドレットも使用できます。Invoke-Commandコマンドレットを使用することで、一度に1台または複数のコンピューターでTest-ComputerSecureChannelをリモートで実行できます。

PS51> Invoke-Command -ComputerName PC1, PC2, PC3 -ScriptBlock { Test-ComputerSecureChannel }

一括で信頼関係をチェックする

これで、信頼関係をリモートでチェックする方法がわかったので、すべてのADコンピューターをチェックするために使用できるコードスニペットを紹介します!このスクリプトでは、まずコンピューターがオンラインであることを確認しています。オンラインでない場合はOfflineを返し、そうでない場合はTest-ComputerSecureChannelを各コンピューターで実行し、TrueまたはFalseを返します。

Testing trust relationships in bulk
$localCredential = Get-Credential @(Get-AdComputer -Filter *).foreach({ $output = @{ ComputerName = $_.Name } if (-not (Test-Connection -ComputerName $_.Name -Quiet -Count 1)) { $output.Status = 'Offline' } else { $trustStatus = Invoke-Command -ComputerName $_.Name -ScriptBlock { Test-ComputerSecureChannel } -Credential $localCredential $output.Status = $trustStatus } [pscustomobject]$output })

問題を理解することは最初のステップですが、それを修正するにはどうすればよいのでしょうか?コンピューターアカウントをローカルコンピューターに保存されているものとADに保存されているものと同じにする必要があることをすでに知っています。

「このワークステーションとプライマリドメイン間の信頼関係が失敗しました」という問題に対するさまざまな「解決策」があります。これらの解決策はGUI、PowerShell、または古いコマンドラインツールを使用して行うことができます。

  1. ADでコンピューターアカウントのパスワードをリセットする
  2. ローカルコンピューターアカウントのパスワードをリセットする
  3. Windowsコンピューターを離脱し、再参加する
  4. コンピューターアカウントを完全に削除し、Windowsコンピューターを再参加する

たくさんのオプションがありますね! このガイドでは、この問題をPowerShellとコマンドラインツールを使用して修正する方法に焦点を当てます(完全性のために)。 まだPowerShellを使用していない場合は、使用してみる価値があります!

問題の解決:コンピューターパスワードのリセット

netdom(コマンドラインツール)

A trust can be repaired and the “the trust relationship between this workstation and the primary domain failed” error message can be eliminated by using the old-school netdom command-line tool. If you’re logged into the computer locally as an administrative user, you can run netdom resetpwd to initiate the password reset sequence as shown below.

この例では:

  • DCはドメインコントローラーの名前です
  • abertramはコンピューターアカウントをリセットする権限を持つActive Directoryユーザーアカウントの名前です
  • *はパスワードのプロンプトが表示されるユーザーアカウントのパスワードのプレースホルダーです。
> netdom resetpwd /s:DC /ud:abertram /pd:*

Reset-ComputerMachinePassword(PowerShell)

信頼関係を修復するための最良の方法の1つは、Reset-ComputerMachinePasswordコマンドレットを使用することです。このコマンドレットはローカルコンピューターで実行され、パスワードのリセットシーケンスを開始します。構文は非常にシンプルです。

PS51> Reset-ComputerMachinePassword

特定のDCをリセットする場合は、Serverパラメーターを使用してオプションの資格情報とともに指定することもできます(デフォルトではローカルユーザーが使用されます)。

以下の例では、ADのユーザー名とパスワードを入力するように促され、ローカルコンピュータおよびDCドメインコントローラーのパスワードをリセットしようとします。

PS51> Reset-ComputerMachinePassword -Server DC -Credential (Get-Credential)

これは、Invoke-Commandを使用してリモートで実行することもできますが、コンピュータにPowerShellリモートが利用可能である場合に限ります。以下では、コンピュータのローカル管理者アカウントのユーザー名とパスワードを取得しています。また、このコンピュータのADアカウントパスワードをリセットする権限を持つ資格情報も取得しています。そして、$domainCredential$using構文を使用してリモートセッションに渡しています。

$localAdminCredential = Get-Credential
$domainCredential = Get-Credential

PS51> Invoke-Command -Computername MYCOMPUTER -Credential $localAdminCredential -ScriptBlock { Reset-ComputerMachinePassword -Server DC -Credential $using:domainCredential }

コンピュータアカウントがActive Directoryから削除されている場合でも、これは動作します。同じ名前のコンピュータアカウントを作成し、Reset-ComputerMachinePasswordを使用してパスワードを同期させることができます。

一括でローカルコンピュータアカウントのパスワードをリセットする

「このワークステーションとプライマリドメインの間の信頼関係が失敗しました」というエラーを一度に複数のコンピュータで解消したいですか?問題ありません。便利なforeachループを使用して、Reset-ComputerMachinePasswordを一括で実行できます。

Resetting computer account passwords in bulk
$localAdminCredential = Get-Credential $domainCredential = Get-Credential @(Get-AdComputer -Filter *).foreach({ $output = @{ ComputerName = $_.Name } if (-not (Test-Connection -ComputerName $_.Name -Quiet -Count 1)) { $output.Status = 'Offline' } else { $pwChangeOutput = Invoke-Command -Computername $_.Name -Credential $localAdminCredential -ScriptBlock { Reset-ComputerMachinePassword -Server DC -Credential $using:domainCredential } $output.PasswordChangeOutput = $pwChangeOutput } [pscustomobject]$output })

Test-ComputerSecureChannel -Repair (PowerShell)

パスワード変更プロセスを開始する別の方法は、Test-ComputerSecureChannelを実行し、今回はRepairオプションを使用することです。私の理解では、このプロセスはReset-ComputerMachinePasswordを使用する場合と同じです。コンピュータのコンソールでRepairパラメータとCredentialパラメータを使用してください。

PS51> Test-ComputerSecureChannel -Repair -Credential (Get-Credential)

ここでは常にCredentialパラメータを使用してください。使用しない場合、nltestユーティリティと同様にローカルアカウントを使用しようとして機能しなくなります。

一括で信頼関係を修復する

これを以前使用していた便利なforeachループに追加し、問題なく解決できます。

Resetting computer account passwords in bulk
$localAdminCredential = Get-Credential $domainCredential = Get-Credential @(Get-AdComputer -Filter *).foreach({ $output = @{ ComputerName = $_.Name } if (-not (Test-Connection -ComputerName $_.Name -Quiet -Count 1)) { $output.Status = 'Offline' } else { $repairOutput = Invoke-Command -Computername $_.Name -Credential $localAdminCredential -ScriptBlock { Test-ComputerSecureChannel -Repair -Credential $using:domainCredential } $output.RepairOutput = $repairOutput } [pscustomobject]$output })

問題の修正:ドメインへの再参加

コンピュータアカウントのパスワードをリセットしてもうまくいかない場合、常に最後の手段があります。コンピュータをActive Directoryドメインに再参加することができます。常に必要ではありませんが、このアプローチを使用する必要がある場合もあります。

一部の報告では、再参加は必要ないという情報も聞きました。新しい参加を強制するだけで済む場合もあります。個別にご確認ください。

次のようにすることができます:

  • ローカルの管理者アカウントでコンピュータにログオンする
  • システムのプロパティに移動する
  • 変更をクリックする
  • ワークグループに設定する
  • 再起動する
  • ドメインに戻す

couldという言葉に注目してください。これは行わないでください。PowerShellで自動化できるため、時間の無駄です。

PowerShellを使用して、ドメインからの離脱とドメインへの参加を行う方法は2つあります。

CIMを使用する

PowerShellを使用してドメインに参加(または離脱)するには、Win32_ComputerSystem CIMクラスを使用します。このクラスには、コンピュータをドメインに参加させるUnJoinDomainOrWorkgroup()メソッドとJoinDomainOrWorkGroup()メソッドがあります。

CIMなので、これはローカルと同様に簡単にリモートで実行できます。デスクから快適にリモートで実行することを想定しているため、以下のコードスニペットをご覧ください。

「このワークステーションとプライマリ ドメインの信頼関係が失敗しました」というエラーが消えます!

$computername = 'PITA'

$instance = Get-CimInstance -ComputerName $computername -ClassName 'Win32_ComputerSystem'

$invCimParams = @{
    MethodName = 'UnjoinDomainOrWorkGroup'
    Arguments = @{ FUnjoinOptions=0;Username="Administrator";Password="mypassword" }
}
$instance | Invoke-CimMethod @invCimParams

上記のFUnjoinOptionsパラメータに注目してください。ここでは4を指定しました。これは、コンピュータを手動で離脱するときのデフォルトの動作を実行します。このオプションでは、Active Directory内のコンピュータアカウントを無効にします(アカウントが見つかる場合)。この動作を避けたい場合は、ここでオプション0を使用できます。

コンピュータが離脱したら、JoinDomainOrWorkGroup()メソッドを使用してドメインに再参加できます。

$computername = 'PITA'

$instance = Get-CimInstance -ComputerName $computername -ClassName 'Win32_ComputerSystem'

$invCimParams = @{
    MethodName = 'JoinDomainOrWorkGroup'
    Arguments = @{ FJoinOptions=3;Name=mydomain.local;Username="mydomain\domainuser";Password="mypassword" }
}
$instance | Invoke-CimMethod @invCimParams

上記のFJoinOptionsパラメーターに注意してください。ここでは3を指定しました。これにより、コンピューターを手動で参加させる場合のデフォルトの動作が行われます。このオプションはADコンピューターアカウントを作成します。JoinDomainOrWorkgroupのドキュメントには、他にも特定のOUに追加するなどのオプションがあります。

ヒント:複数のコンピューターを指定することで、このメソッドを使用して一度に複数のコンピューターを参加または再参加させることもできます。これはGet-CimInstanceComputerNameパラメーターで指定します。

Remove-ComputerおよびAdd-Computerコマンドレットの使用

PowerShellでは、組み込みのPowerShellコマンドレットでコンピューターをドメインに参加させたり、ドメインから離脱させたりすることもできます。Remove-ComputerおよびAdd-Computerコマンドレットを使用できます。

PowerShellを使用してコンピュータを非参加状態にするには、コンピュータのコンソールにログインし、Remove-Computerコマンドレットを使用します。コンピュータを非参加状態にするための権限を持つドメインの資格情報を提供します。また、Restartパラメータを指定して非参加後に再起動を強制し、Forceを指定して確認のプロンプトを表示しないようにすることもできます。

PS51> Remove-Computer -UnjoinDomaincredential (Get-Credential) -Restart -Force

コンピュータが再起動されたら、Add-Computerコマンドレットを使用してPowerShellでコンピュータをドメインに参加させることができます。また、Add-Computerコマンドレットを使用してリモートでコンピュータに接続する場合は、ComputerNameパラメータを指定します。接続にはローカルユーザーの資格情報を使用し、ドメインの資格情報で認証します。

再起動後、もう「このワークステーションとプライマリドメイン間の信頼関係が失敗しました」というエラーメッセージが表示されないことを願っています。

$localCredential = Get-Credential
$domainCredential = Get-Credential

Add-Computer -ComputerName PITA -LocalCredential $localCredential -DomainName domain.local -Credential $domainCredential -Restart -Force

自動ドメインの非参加と参加

このプロセスを何度も繰り返す必要があったため、すべてを自動化するPowerShellスクリプトを作成しました。コンピュータの名前を指定すれば、次のことを行います:

  • コンピュータを非参加状態にする
  • 再起動して再起動を待つ
  • コンピュータに参加する
  • 再起動して再起動を待つ

このスクリプトはGitHubで試すことができます。

概要

ワークステーションとプライマリドメイン間の信頼関係が失敗しました」というエラーメッセージの問題と、複数の解決策について、おそらく完全に理解しているはずです。このガイドがいくつかの洞察を提供し、コンピュータがドメインから外れる問題に対する独自の解決策を見つけるのに役立てば幸いです!

さらなる情報

関連する他の投稿もチェックしてみてください!

Source:
https://adamtheautomator.com/the-trust-relationship-between-this-workstation-and-the-primary-domain-failed/