Восстановление доверительных отношений между PC и Active Directory

Восстановление доверительных отношений между PC и Active Directory

Рассмотрим способы решения распространённой проблемы потери доверительных отношений между рабочей станцией и доменом Active Directory (#AD). Из-за этой проблемы пользователь не может авторизоваться под своей учётной записью.

При попытке входа пользователя под доменной учётной записью, могут произойти следующие ошибки.

Trust relationship

The trust relationship between this workstation and the primary domain failed.

(Не удалось восстановить доверительные отношения между рабочей станцией и доменом.)

Security database

The security database on the server does not have a computer account for this workstation trust relationship.

(База данных диспетчера учетных записей на сервере не содержит записи для регистрации компьютера через доверительные отношения с этой рабочей станцией.)

Ошибка может возникнуть по различным факторам. Например, когда новый компьютер присоединился к домену под уже существующем именем другого компьютера, или когда виртуальная машина восстановилась с контрольной точки.

Ручной способ

Для того, чтобы исправить ошибку, необходимо последовательно выполнить следующие пункты:

  1. Сбросить аккаунт компьютера в #AD.
  2. На проблемном компьютере зайти под локальным администратором и вывести компьютер из домена в рабочую группу.
  3. Перезагрузить компьютер.
  4. Вывести компьютер из рабочей группы и ввести обратно в домен.
  5. Еще раз перезагрузить компьютер.

Автоматизация

Как обычно, привожу скрипт по автоматизации восстановления доверительных отношений. Скрипт решит проблему быстро и без перезагрузок. Запускается под администратором.

Параметры

Параметр у скрипта один, это название сервера Domain Controller DC.

  • -S -P_Server - название сервера DC (контроллера домена). Если параметр не задан, скрипт выбирает для операции контроллер домена по умолчанию.

Примеры

Восстановить доверительные отношения с доменом по умолчанию:

Терминал
.\pwsh.csc.repair.ps1

Восстановить доверительные отношения с доменом DC-server.domain.com:

Терминал
.\pwsh.csc.repair.ps1 -DC 'DC-server.domain.com'

Алгоритм работы

  • Запускается проверка доверительных отношений при помощи cmdlet’а Test-ComputerSecureChannel.
  • Если проверка пройдена, скрипт завершает работу.
  • Если проверка не пройдена, запускается цикл восстановления доверительных отношений с контроллером домена с временным интервалом в 5 секунд.

Скрипт

pwsh.csc.repair.ps1
<#PSScriptInfo
  .VERSION      0.1.0
  .GUID         52672f5d-e2c0-467a-ae1d-c0fc9009a1eb
  .AUTHOR       Kai Kimera
  .AUTHOREMAIL  mail@kai.kim
  .COMPANYNAME  Library Online
  .COPYRIGHT    2023 Library Online. All rights reserved.
  .LICENSEURI   https://choosealicense.com/licenses/mit/
  .PROJECTURI   https://lib.onl/ru/articles/2023/10/38fc94dd-8d37-5f9e-b556-676304976a9f/
#>

#Requires -Version 7.2
#Requires -RunAsAdministrator

<#
  .SYNOPSIS
  Testing and repairing the secure channel between the local computer and its domain.

  .DESCRIPTION
  Verifying that the channel between the local computer and its domain is working correctly by checking the status of its trust relationships. If a connection fails, trying to restore it.

  .PARAMETER P_Server
  Specifies the domain controller to run the command. If this parameter is not specified, this script selects a default domain controller for the operation.

  .PARAMETER P_Sleep
  Sleep time (in seconds).

  .EXAMPLE
  .\pwsh.csc.repair.ps1

  .EXAMPLE
  .\pwsh.csc.repair.ps1 -DC 'DC-server.domain.com'

  .LINK
  https://lib.onl/ru/articles/2023/10/38fc94dd-8d37-5f9e-b556-676304976a9f/
#>

# -------------------------------------------------------------------------------------------------------------------- #
# CONFIGURATION.
# -------------------------------------------------------------------------------------------------------------------- #

Param(
  [Parameter(HelpMessage="Specifies the domain controller to run the command.")]
  [Alias('DC')][string]$P_Server,

  [Parameter(HelpMessage="Sleep time (in seconds).")]
  [Alias('S')][int]$P_Sleep = 5
)

# -------------------------------------------------------------------------------------------------------------------- #
# INITIALIZATION.
# -------------------------------------------------------------------------------------------------------------------- #

function Start-Script() {
  Start-CSCRepair
}

# -------------------------------------------------------------------------------------------------------------------- #
# EDITING THE REGISTRY.
# -------------------------------------------------------------------------------------------------------------------- #

function Start-CSCRepair() {
  $Param = @{
    Server = "${P_Server}"
    Repair = $true
    Credential = (Get-Credential)
  }

  do {
    if (Test-ComputerSecureChannel) {
      Write-Host 'Connection successful. Everything is fine!'
    } else {
      Write-Host 'Connection failed! The secure channel between the local computer and the domain is broken. Removing and then rebuilds the channel established by the NetLogon service...'
      Test-ComputerSecureChannel @Param
      Start-Sleep -s $P_Sleep
    }
  } until (Test-ComputerSecureChannel)
}

# -------------------------------------------------------------------------------------------------------------------- #
# -------------------------------------------------< RUNNING SCRIPT >------------------------------------------------- #
# -------------------------------------------------------------------------------------------------------------------- #

Start-Script