Как найти сервер контроллер домена

В некоторых случаях вам нужно определить на каком контроллере домена вы аутентифицированы (ваш logonserver). Это может пригодиться при проблемах с применением групповых политик, когда пользователи жалуются на медленный вход в систему. Пользователь может аутентифицироваться на неверном контроллере домена из-за того, что ближайший к нему DC не доступен, доступ к нему блокируется межсетевым экраном, неверной настройки подсетей и сайтов в Active Directory или проблемами с DNS. В результате пользователь может получать все GPO, скрипты, и т.д., не с ближайшего контроллера домена, а с любого другого DC. Это может привести к долгому применению GPO, медленной установке программ, медленной загрузки перемещаемых профилей или файлов в перенаправленных папках.

Содержание:

  • Как узнать на каком контроллере домена вы залогинены?
  • Как Windows определяет ближайший контроллер домена?

Как узнать на каком контроллере домена вы залогинены?

Вы можете узнать контроллер домена, через который вы выполнили вход в домен несколькими способами:

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

Зная контроллер домена, можно различную информацию о пользователя из журналов безопасности DC (например, историю входов пользователя в домен и другие логи).

Можно автоматически записывать информацию, на каком контроллере домена авторизовался пользователь в описание компьютера в AD. Так можно узнать LogonServer для конкретного компьютера из AD, не обращаясь к конкретному компьютеру по сети или локально.

Как Windows определяет ближайший контроллер домена?

За определение LogonServer при загрузке Windows отвечает служба NetLogon. Она должны быть запущена:

get-service netlogon

служба netlogon нужна для обнаружения контроллера домена

Упрощенно процесс поиска контроллера домена клиентом Windows выглядит так:

  1. При загрузке Windows служба NetLogon делает DNS запрос за списком контроллеров домена (SVR записи
    _ldap._tcp.dc._msdcs.domain_
    ;
  2. DNS возвращает список DC в домене;
  3. Клиент делает LDAP запрос к DC для определения сайта AD по-своему IP адресу;
  4. DC возвращает сайт, которому соответствует IP клиента или наиболее близкий сайт (эта информация кэшируется в ветке реестра
    HKLMSystemCurrentControlSetServicesNetlogonParameters
    и используется при следующем входе для более быстрого поиска);
  5. Клиент через DNS запрашивает список контроллеров домена в сайте (в разделе _
    tcp.sitename._sites...
    ); ldap записи в DNS зоне сайта
  6. Windows пытается связаться со всеми DC в сайте и первый ответивший используется для выполнении аутентификации и в качестве LogonServer.

Вы можете переключить ваш компьютер на другой контроллер домена AD вручную с помощью команды:

nltest /SC_RESET:WINITPROMSK-DC02.winitpro.ru

nltest сменить контроллер домена

Flags: 30 HAS_IP HAS_TIMESERV
Trusted DC Name \MSK-DC02.winitpro.ru
Trusted DC Connection Status Status = 0 0x0 NERR_Success
The command completed successfully

Если указанный DC не доступен, появится ошибка:

I_NetLogonControl failed: Status = 1311 0x51f ERROR_NO_LOGON_SERVERS

Если ни один из контроллеров домена не доступен, или компьютер отключен от сети, то при входе пользователя появится надпись:

There are currently no logon servers available to service the logon request.
Отсутствуют серверы, которые могли бы обработать запрос на вход в сеть.

Войти на такой компьютер можно только под сохраненными учетными данными доменного пользователя.

Найти ближайший к вам контроллер домена согласно иерархии сайтов, подсетей и весов можно с помощью командлета Get-ADDomainController из модуля Active Directory для PowerShell:

Get-ADDomainController -Discover -NextClosestSite

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

Как найти все контроллеры домена

Как вы думаете, сколько есть способов получить список контроллеров домена? Давайте посчитаем. Для примера возьмет тестовый домен с оригинальным именем TEST.LOCAL, в котором есть один контроллер домена с еще более оригинальным 🙂 именем DC-TEST.

Первый способ, которым я обычно пользуюсь — утилита командной строки Netdom. Для получения списка контроллеров домена воспользуемся командой:

Netdom query DC

вывод списка контроллеров домена с помощью утилиты Netdom

Второй пойдет утилита Nltest. Выведем список контроллеров командой:

Nltest /dclist:test.local

вывод списка контроллеров домена с помощью утилиты Nltest

Способ третий — утилита DSQUERY, специально предназначенная для поиска объектов в Active Directory. Найти контроллеры домена с ее помощью можно так:

DSQUERY server -o rdn

или так:

DSQUERY server

вывод списка контроллеров домена с помощью утилиты DSQUERY

Перейдем к PowerShell. Поименно вывести контроллеры домена можно командой:

Get-ADDomainController -Filter * | select Name

вывод списка контроллеров домена с помощью PowerShell

Переходим к нестандартным методам поиска. Выведем список контроллеров с помощью утилиты Nslookup. Каждый контроллер домена регистрирует в DNS запись SRV вида _ldap._tcp.dc._msdcs.domain.com, по которой его и можно найти. Для поиск по DNS воспользуемся командой:

Nslookup -type=all _ldap._tcp.dc._msdcs.test.local

вывод списка контроллеров домена с помощью nslookup

С помощью WMI в Windows можно сделать практически все, в том числе и получить список контроллеров домена. Для этого нам потребуется класс Win32_NTDomain, в котором помимо прочего хранятся имена контроллеров домена. Получить их можно из командной строки:

wmic NTDOMAIN GET DomainControllerName

или из PowerShell:

Get-WmiObject -Class win32_NTDomain | ft -a DomainControllerName

вывод списка контроллеров домена с помощью WMI

Ну и последний из известных мне способов. Все домен контроллеры являются членами группы «Domain Controllers», и для их получения остается только вывести список членов этой группы. Сделать это можно из командной строки:

net group "Domain Controllers" /domain

или из PowerShell:

Get-ADGroupMember -Identity "Domain Controllers" | select Name

ывод списка контроллеров домена с помощью членства в группе

Всего получается семь способов. Если знаете еще, пишите.

DNS and DHCP are the best way to check since there can be Unix/Linux machines on the network managed by the AD domain controller or acting as the domain controller.

Plus, considering active directory is nothing more than Microsoft’s version of Kerberos, LDAP, dhcp and dns. It would be better to understand and debug things at lower layers than layer 7+. This is because the operating system would preform these same requests and the underlining RFC for each protocol actually operates at a OSI level not the “insert favorite tool here” level.

One can go a step further and query the dhcp for options 6, 15, and 44 to get the domain name, domain name server, and Wins/NetBIOS name server.

Then using dns to check for the _kerberos._tcp, _kpasswd._tcp, _LDAP._TCP.dc._msdcs, and _ldap._tcp SRV records:

nslookup -type=srv _kerberos._tcp.EXMAPLE.COM
nslookup -type=srv _kpasswd._tcp.EXAMPLE.COM
nslookup -type=srv _ldap._tcp.EXAMPLE.COM
nslookup -type=srv _ldap._tcp.dc._msdcs.EXAMPLE.COM

.EXAMPLE.COM ::= value returned from dhcp option-1

This breaks down into three areas, two are protocol supported DNS-SD records:

  • _kerberos._tcp and _kpasswd._tcp (also under UNIX/Linux/OSX+some windows networks has _kadmin._tcp) are for kerberos
  • _ldap._tcp is for ldap (openldap, opendc, sun/oracle directory, ms ad)
    _LDAP._TCP.dc._msdcs is the Microsoft only extension to ldap to map the domain controller.

Находим контроллер домена в сети.

Для того чтобы узнать IP-адреса и имена контроллеров домена в сети нужно в командной строке ввести следующий командлет:

nslookup

Как найти контроллер домена в сети

Информация о материале
Автор: Максим Донецкий
Категория: Администрирование компьютерной сети

Опубликовано: 08 августа 2016

  • Системное администрирование

  • Windows

  • Active Directory

Комментарии   


0


#2
Имя
12.03.2021 13:45

Если комп уже в домене, то можно и так. А если нужно зайти по РДП на КД с не-доменного компа? Например, чтобы посмотреть крайнее использованное имя и назначить следующее.


Цитировать


+5


#1
Ivan
01.11.2017 14:14

Неверно.
Так мы узнаем DNS сервер по умолчанию, но он не обязательно совпадает с контроллером домена.

Нужно так
> set logon
В ответе получим имя сервера, на котором мы залогинились.


Цитировать

Вы можете использовать командлет PowerShell Get-ADDomainController для получения информации о контроллерах домена в Active Directory. Этот командлет является частью модуля Active Directory для Windows PowerShell, который может быть установлен как на Windows Server, так и на рабочих станциях Windows. Подробности смотрите в статье «Как установить и использовать Модуль Active Directory для Windows PowerShell».

Командлет Get-ADDomainController

Get-ADDomainController выводит информацию об одном или нескольких контроллеров домена Active Directory на основе критериев обнаруживаемых служб, параметров поиска или путём предоставления идентификатора контроллера домена, например имени NetBIOS.

Командлет Get-ADDomainController получает контроллеры домена, указанные в параметрах. Вы можете получить контроллеры домена, используя опции -Identity, -Filter или -Discover.

При запуске Get-ADDomainController без каких-либо параметров командлет отображает информацию о текущем контроллере домена (LogonServer), используемом этим компьютером для проверки подлинности (контроллер домена выбирается в соответствии с топологией IP-подсети сайта AD):

Get-ADDomainController

Командлет вернул все поля с информацией о контроллере домена, доступной в базе данных Active Directory.

ComputerObjectDN           : CN=HACKWARE-SERVER,OU=Domain Controllers,DC=ds,DC=hackware,DC=ru
DefaultPartition           : DC=ds,DC=hackware,DC=ru
Domain                     : ds.hackware.ru
Enabled                    : True
Forest                     : ds.hackware.ru
HostName                   : HackWare-Server-2022.ds.hackware.ru
InvocationId               : bf704d68-01ea-4e3d-83fe-6f556ca09e14
IPv4Address                : 192.168.1.60
IPv6Address                : fd28:62f2:dde3:0:4def:bfd5:11ad:1fe2
IsGlobalCatalog            : True
IsReadOnly                 : False
LdapPort                   : 389
Name                       : HACKWARE-SERVER
NTDSSettingsObjectDN       : CN=NTDS Settings,CN=HACKWARE-SERVER,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=ds,DC=hackware,DC=ru
OperatingSystem            : Windows Server 2022 Standard
OperatingSystemHotfix      :
OperatingSystemServicePack :
OperatingSystemVersion     : 10.0 (20348)
OperationMasterRoles       : {SchemaMaster, DomainNamingMaster, PDCEmulator, RIDMaster…}
Partitions                 : {DC=ForestDnsZones,DC=ds,DC=hackware,DC=ru, DC=DomainDnsZones,DC=ds,DC=hackware,DC=ru, CN=Schema,CN=Configuration,DC=ds,DC=hackware,DC=ru, CN=Configuration,DC=ds,DC=hackware,DC=ru…}
ServerObjectDN             : CN=HACKWARE-SERVER,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=ds,DC=hackware,DC=ru
ServerObjectGuid           : 1eb9f6f2-1fcd-446f-a0db-80b356e27673
Site                       : Default-First-Site-Name
SslPort                    : 636

Примеры использования Get-ADDomainController

Чтобы получить контроллер домена с помощью механизма обнаружения DCLocator, используйте опцию -Discover. Вы можете указать критерии поиска, задав такие опции, как -Service, -SiteName, -DomainName, -NextClosestSite, -AvoidSelf и -ForceDiscover.

Также вы можете найти контроллер домена, которому должен принадлежать ваш компьютер, через службу -DCLocator:

Get-ADDomainController -Discover

Следующая команда получит один доступный контроллер домена на указанном сайте:

Get-ADDomainController -Discover -Site "Default-First-Site-Name"

Опция -ForceDiscover указывает командлету очистить всю кэшированную информацию о контроллере домена и выполнить новое обнаружение. Если этот параметр не указан, командлет может возвращать кэшированные сведения о контроллере домена.

Get-ADDomainController -Discover -Site "Default-First-Site-Name" -ForceDiscover

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

Get-ADDomainController -Discover -Domain "user01.com"

Вы можете найти ближайший доступный контроллер домена с активной ролью веб-служб AD:

Get-ADDomainController -ForceDiscover -Discover -Service ADWS

Опция -Service задаёт типы получаемых контроллеров домена. Вы можете указать более одного типа, используя список, разделённый запятыми. Допустимые значения для этого параметра:

  • PrimaryDC или 1
  • GlobalCatalog или 2
  • KDC или 3
  • TimeService или 4
  • ReliableTimeService или 5
  • ADWS или 6

Пример использования опции -Service для поиска PDC (Primary Domain Controller Emulator) в вашем домене:

Get-ADDomainController -Discover -Service PrimaryDC

Эта команда ищет компьютер с функцией Глобального каталога в текущем лесу:

Get-ADDomainController -Discover -Service "GlobalCatalog"

Эта команда получает основной контроллер домена с помощью обнаружения и проверяет, используется ли он в качестве сервера времени.

Get-ADDomainController -Discover -Domain "corp.contoso.com" -Service "PrimaryDC","TimeService"

Если ваш контроллер домена не найден или не отвечает, вы можете найти его на ближайшем сайте AD (определяется весом межсайтовых ссылок):

Get-ADDomainController -Discover -ForceDiscover -NextClosestSite

Чтобы найти и получить более одного контроллера домена, используйте опцию -Filter.

Чтобы отобразить список всех контроллеров домена в текущем домене, выполните такую команду:

Get-ADDomainController -Filter * | Format-Table

Используя следующую команду, вы можете подсчитать количество контроллеров домена в AD:

Get-ADDomainController -Filter * | Measure-Object

Вы можете отобразить более удобную таблицу, в которой показаны все контроллеры домена, их имена хостов, IP-адреса, версии ОС и имена сайтов AD:

Get-ADDomainController -Filter *| Select-Object Name,ipv4Address,OperatingSystem,site | Sort-Object name

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

Get-ADDomainController -Filter * -Server dc01.test.com | Select Name,ipv4Address, IsGlobalCatalog,Site

Использование Get-ADDomainController для поиска контроллеров домена по определенным критериям

Давайте рассмотрим несколько полезных команд, которые вы можете использовать для получения списка контроллеров домена в AD по определенным критериям.

Опция -Identity указывает контроллер домена, который нужно получить. Вы можете идентифицировать контроллер домена по его GUID, IPV4Address, глобальному IPV6Address или имени узла DNS.

Чтобы найти контроллер домена по его IP-адресу:

Get-ADDomainController -Identity "192.168.100.6"

Эта команда получает контроллер домена, используя его NetBIOS имя.

Get-ADDomainController -Identity "PDC-01"

Эта команда получает контроллер домена, используя его имя хоста DNS, в домене, указанном параметром -Site, указанным в параметре -Server, и с указанием учётных данных администратора.

Get-ADDomainController -Identity "TK5-CORP-DC-10.user01.com" -Server "user01.com" -Credential "corpadministrator"

Чтобы найти все контроллеры домена, в именах которых есть DC02:

Get-ADDomainController -Filter {name -like "*dc02*"} | Select Name,ipv4Address,OperatingSystem,site

Чтобы отобразить список контроллеров домена на сайтах, имена которых начинаются с «Mun*»:

Get-ADDomainController -Filter {site -like "Mun*"} | Select Name,ipv4Address,OperatingSystem,site

Чтобы отобразить список всех контроллеров домена только для чтения (RODC):

Get-ADDomainController -Filter {IsReadOnly -eq $true} | Select-Object Name,ipv4Address,OperatingSystem,site

Чтобы найти контроллеры домена на сайте «Rome» с включённой ролью глобального каталога:

Get-ADDomainController -Filter {site -eq "Rome" -and IsGlobalCatalog -eq $true} | Select-Object Name,ipv4Address,OperatingSystem,site

Скрипт PowerShell для проверки доступности всех контроллеров домена

Следующий скрипт PowerShell позволяет поочерёдно проверять контроллеры домена и выполнять для каждого из них определённые действия:

$DCs = Get-ADDomainController -Filter *
ForEach-Object($DC in $DCs)
{
	действия
}

Вот пример простого скрипта PowerShell, который проверяет доступность порта LDAPS (TCP 636) на каждом контроллере домена в вашем домене с помощью командлета Test-NetConnection. Если порт LDAPS недоступен, появится предупреждение.

$DCs = Get-ADDomainController -Filter * | Select-Object Hostname,Ipv4address,isGlobalCatalog,Site,Forest,OperatingSystem
ForEach($DC in $DCs)
{
	$PortResult=Test-NetConnection -ComputerName $DC.Hostname -Port 636 -InformationLevel Quiet
	if ($PortResult -ne "$True"){
		write-host $DC.Hostname " не доступен" -BackgroundColor Red -ForegroundColor White
	}else {
	write-host $DC.Hostname " доступен" -BackgroundColor Green -ForegroundColor White}
}

Получился простой скрипт для отслеживания доступности всех контроллеров домена в вашем домене.

Также существуют разные сценарии для проверки всех контроллеров домена по очереди.

Связанные статьи:

  • Как установить Active Directory Domain Services с помощью PowerShell (100%)
  • Как установить и использовать Модуль Active Directory для Windows PowerShell (100%)
  • Как настроить Windows Server 2022 с помощью PowerShell (50%)
  • Управление ролями и функциями Windows Server с помощью PowerShell (50%)
  • Аналог Add-Computer в PowerShell 7 (50%)
  • LAPS: управление паролями локальных администраторов на компьютерах домена (RANDOM – 50%)

Добавить комментарий