当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] “此工作站与主域之间的信任关系失败”[已解决]

作者:精品下载站 日期:2024-12-14 13:15:17 浏览:14 分类:玩电脑

“此工作站与主域之间的信任关系失败”[已解决]


一旦困扰 Windows 系统管理员的最常见问题得到信任,Active Directory 计算机似乎就会脱离域。臭名昭著的“该工作站与主域之间的信任关系失败”错误非常常见。

在本指南中,您将了解我在管理 Active Directory 的 20 多年中遇到的每一个技巧,以及如何使用 PowerShell 将其自动化。

此工作站与主域之间的信任关系失败”错误消息

当 AD 域不再信任计算机时,很可能是因为本地计算机的密码与 Active Directory 中存储的密码不匹配。

这两个密码必须同步,AD 才能信任计算机。如果它们不同步,您将收到臭名昭著的错误消息“此工作站与主域之间的信任关系失败

不幸的是,我和其他系统管理员发现从来没有一个解决方案能够 100% 有效。这就是我编写本指南的原因。

本指南旨在成为针对每种单一方法的单一存储库,一劳永逸地解决此问题,并使用 PowerShell 自动化该过程。

Active Directory 计算机帐户密码

将新计算机添加到 Active Directory 时,会创建一个带有密码的计算机帐户。默认情况下,该密码的有效期为 30 天。 30 天后,它会自动更改。如果它更改而客户端密码没有更改,您将收到“此工作站与主域之间的信任关系失败”错误消息。

查看现有策略

您可以通过打开组策略管理控制台 (GPMC) 查看域范围的策略。在 GPMC 内,单击默认域策略,然后导航至计算机配置 -> Windows 设置 -> 安全设置 > 本地策略 > 安全选项

进入安全选项后,查找名为域成员:机器帐户密码最长期限的策略。

在加入 AD 的计算机上,打开 regedit 并导航到 HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters 注册表项,然后找到 MaximumPasswordAge 值,如下所示。

当您在其中时,您可以通过将 DisablePasswordChange 值设置为 1 来完全禁止本地计算机更改密码。

当计算机帐户发生变化时,本地计算机和AD计算机帐户都应一起更改密码。 AD 知道当前的和前一个,以防它们在短时间内不同步。

计算机帐户密码更改过程

当一切正常工作时,使用 Netlogon Windows 服务,计算机会自动启动密码更改。这种情况会在计算机重新启动期间或计算机对象需要向 AD 进行身份验证时发生。

使用 Netlogon Windows 服务,本地计算机启动密码更改序列。计算机首先在域控制器上启动密码更改。如果成功,它会尝试更改本地密码以匹配 HKLM\SECURITY\Policy\Secrets.ACC 注册表项。

通常,即使计算机因本地计算机启动密码更改而关闭或离线超过 30 天,此过程也能正常工作。

但是,在以下情况下会出现问题:

  • 计算机更改AD计算机帐户但无法更改本地密码
  • 计算机在不运行 Sysprep 的情况下重新映像
  • 操作系统已重新安装,并尝试使用旧的、已启用的 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 将提示输入密码。

测试计算机安全通道 (PowerShell)

解决“此工作站与主域之间的信任关系失败”问题的最佳方法之一是使用 Test-ComputerSecureChannel cmdlet。此 PowerShell cmdlet 随 Windows 10 一起提供,并且更易于使用。

Test-ComputerSecureChannel cmdlet 在 Windows 10 计算机上本地运行。以交互方式登录计算机后,打开 PowerShell 控制台并运行 Test-ComputerSecureChannel(不带任何参数)。它将返回 True 或 False,具体取决于信任是否有效。

PS51> Test-ComputerSecureChannel
True

您还可以使用 Server 参数指定特定的域控制器来确认密码同步。

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

这个 cmdlet 使用起来很简单,并且有一个Repair选项,但我们将为修复部分保存一个演示。

如果您知道要检查的计算机的本地管理员密码并且在这些计算机上启用了 PowerShell 远程处理,则还可以使用 Invoke-Command cmdlet。通过使用 Invoke-Command cmdlet,您可以同时在一台或多台计算机上远程运行 Test-ComputerSecureChannel

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

批量检查信任关系

现在您已经知道如何远程检查信任关系,这里有一个代码片段,您可以使用它来检查所有您的 AD 计算机!在此脚本中,我首先进行测试以确保计算机在线。如果没有,它将返回离线。如果是这样,它将在每台计算机上运行 Test-ComputerSecureChannel 并返回 TrueFalse

$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(命令行工具)

使用老式的 netdom 命令行工具可以修复信任并消除“此工作站与主域之间的信任关系失败”错误消息。如果您以管理用户身份本地登录计算机,则可以运行 netdom resetpwd 来启动密码重置序列,如下所示。

在这个例子中:

  • DC 是域控制器的名称
  • abertram 是有权重置计算机帐户的 Active Directory 用户帐户的名称
  • * 是用户帐户密码的占位符,将提示输入密码。
> netdom resetpwd /s:DC /ud:abertram /pd:*

重置计算机密码 (PowerShell)

修复信任关系的最佳方法之一是使用 Reset-ComputerMachinePassword cmdlet。此 cmdlet 在本地计算机上运行,并将启动密码重置序列。它的语法再简单不过了。

PS51> Reset-ComputerMachinePassword

如果您想指定要重置的特定 DC,可以使用 Server 参数和选项凭据(默认为本地用户)指定它。

下面的示例将提示输入 AD 用户名和密码,并尝试重置本地计算机和 DC 域控制器上的密码。

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

如果计算机上有 PowerShell 远程处理功能,也可以使用 Invoke-Command 远程运行此操作。下面,我将获取计算机上本地管理员帐户的用户名和密码。我还获得了有权重置此计算机的 AD 帐户密码的凭据。然后,我使用 $using 构造将 $domainCredential 传递到远程会话中。

$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

$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
 
})

测试-ComputerSecureChannel-修复 (PowerShell)

启动密码更改过程的另一种方法是运行Test-ComputerSecureChannel,但这次使用Repair选项。据我所知,此过程与使用 Reset-ComputerMachinePassword 相同。在计算机控制台上使用 Repair 参数和 Credential 参数。

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

请务必在此处使用 Credential 参数。如果不这样做,与 nltest 实用程序类似,它将尝试使用本地帐户,但无法工作。

批量修复信任关系

将此命令放入我们一直在使用的方便的 foreach 循环中,Bob 就是你的叔叔!

$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 域。尽管并非一直有必要,但有时我不得不使用这种方法。

请注意,我听到一些报告称分离是不必要的。您也许可以通过强制新加入来逃脱。 YMMV。

可以

  • 通过本地管理帐户登录计算机
  • 转到系统属性
  • 点击更改
  • 将其设置为工作组
  • 重启
  • 将其设置回域

请注意我如何提到可以。不要这样做。当你可以使用 PowerShell 自动化它时,这是浪费你的时间。

我发现您可以通过两种方法使用 PowerShell 退出域和使用 PowerShell 加入域。

使用CIM

您可以使用 Win32_ComputerSystem CIM 类通过 PowerShell 加入域(或取消加入)。此类有两个方法,允许您将计算机取消加入和加入名为 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-CimInstance 上的 ComputerName 参数指定多台计算机。

使用删除计算机和添加计算机 Cmdlet

您还可以使用内置 PowerShell cmdlet 通过 PowerShell 将计算机加入或取消加入域。您可以使用 Remove-ComputerAdd-Computer cmdlet。

要使用 PowerShell 取消加入计算机,请登录计算机控制台并使用 Remove-Computer cmdlet。提供具有退出计算机权限的域凭据。您还可以指定 Restart 参数以在取消加入后强制重新启动,并指定 Force 不提示确认。

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

计算机重新启动后,您可以使用 Add-Computer cmdlet 通过 PowerShell 将计算机加入域。您可以通过提供 ComputerName 参数来远程使用 Add-Computer cmdlet。您还将使用本地用户凭据进行连接,并使用域凭据对域进行身份验证。

当它恢复时,希望您不再收到“此工作站和主域之间的信任关系失败”错误消息。

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

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

自动域退出和重新加入

因为我必须多次执行此过程,所以我构建了一个 PowerShell 脚本来为您完成所有操作。如果您向其提供计算机的名称,它将:

  • 取消连接计算机
  • 重新启动并等待恢复
  • 加入电脑
  • 重新启动并等待恢复

您可以通过 GitHub 尝试此脚本。

概括

您现在应该充分了解该问题以及臭名昭著的“此工作站与主域之间的信任关系失败”错误消息的多种解决方案。我希望本指南能为您提供一些见解,并让您能够针对计算机掉域的问题提出一些自己的解决方案!

进一步阅读

请务必查看其他一些相关帖子!

  • Active Directory 脚本丰富:快来获取吧!
  • Get-AdUser:使用 PowerShell 查找 Active Directory 用户
  • 如何使用 PowerShell 和 CSV 文件同步 AD

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯