Всем привет.
Время от времени наблюдаю как некоторые хосты могут выпадать из доверительных отношений в домене по разным причинам. Например из-за не смены пароля пользователя в домене вовремя согласно внутренней политики кампании.
Как это лечится?
Самый простой способ это вывести хост из домена и тут же ввести его обратно. Но ходить к хосту ножками не всегда возможно. Поэтому пробуем это сделать через Powershell.
Мне известно два варианта. Пусть "AdminDC" это наш администратор домена, а "admin" это наш локальный администратор на подопытном хосте. Все операции проводим с хоста администратора домена.
$user = "FORZA\AdminDC"
$pass = ConvertTo-SecureString -String 'MyPasssword' -Force -AsPlainText
$cred = New-Object System.Management.Automation.PSCredential($user,$pass)
$Hostname = Read-Host "Please enter the computers hostname that you wish to remove and re-add to the domain"
$DomainName = Read-Host "Please enter the Domain name"
# Вариант №1
Используем два известных командлета Remove-Computer и Add-Computer.
# выводим компьютер из домена в группу WKS
Remove-Computer -ComputerName $Hostname -WorkgroupName "WKS" -UnjoinDomaincredential $user -PassThru -Verbose -Restart
# возможно хост надо перегрузить принудительно
Restart-Computer -ComputerName $Hostname -Wait
# а теперь заводим компьютер в домен
Add-Computer -ComputerName $Hostname -LocalCredential "$Hostname\admin" -Credential $cred -DomainName $DomainName -Force -Verbose -Restart
Замечу что при выводе из домена вам может помешать правила Firewall-а подопытного хоста,
а при вводе в домен отсутствие прав на выполнение удаленных WMI-запросов.
# Вариант №2
Есть еще два командлета для манипуляции с членством в домене, UnjoinDomainOrWorkGroup и
JoinDomainOrWorkGroup соответственно.
Например, ввод хоста в домен может выглядеть так.
$localstring = $Hostname + "\admin"
$localcred = Get-Credential $localstring -Message "Введите данные пользователя, являющимся локальным администратором на удаленном компьютере:"
$Computer = Get-WmiObject Win32_ComputerSystem -ComputerName $Hostname -Credential $localcred
$domain = $Computer.Domain
$domain
$r = $Computer.JoinDomainOrWorkGroup($domain, $cred.GetNetworkCredential().Password, $cred.UserName, 0, 1)
if ($r.ReturnValue -eq "0"){
Sleep(3)
$winOS = Get-WmiObject Win32_OperatingSystem -ComputerName $Hostname -Credential $localcred
$sresult = $winOS.win32shutdown(6)
if($sresult.ReturnValue -ne "0"){
[System.Windows.Forms.MessageBox]::Show("Не удалось перегрузить компьютер. Ошибка №" + $sresult.ReturnValue, "Ошибка")
}
}
else {
[System.Windows.Forms.MessageBox]::Show("Не удалось ввести компьютер в домен. Ошибка №" + $r.ReturnValue, "Ошибка")
}
И бонусный вариант.
# Вариант №3
Недавно встретил информацию что вернуть доверительные отношения в домене можно вызовом одного единственного командлета
Test-ComputerSecureChannel -Repair -credential $cred -verbose
Пользуйтесь.
No comments:
Post a Comment
А что вы думаете по этому поводу?