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

Опубликовано: 16 Марта, 2023
Требуемые порты контроллеров домена: используйте PowerShell, чтобы проверить, прослушивают ли они

Контроллер домена Active Directory должен прослушивать определенные порты для обслуживания различных клиентских запросов. Например, когда клиентскому компьютеру необходимо пройти аутентификацию, он подключается к серверу, на котором размещена служба KDC и который прослушивает порт 88. Точно так же сетевые порты TCP 139 и UDP 138 требуются для службы репликации SYSVOL, которая выполняется между всеми контроллеры домена. Как минимум, они должны прослушивать следующие требуемые порты:

  • UDP-порт 88 требуется для аутентификации. UDP-порт 88 используется клиентами и контроллерами домена для аутентификации друг друга.
  • И UDP, и TCP-порт 135 необходимы для связи между контроллерами домена и клиентами с контроллерами домена.
  • Сетевые порты TCP 139 и UDP 138 используются службой репликации SYSVOL для репликации содержимого папки SYSVOL.
  • Порт UDP 389 для сетевого порта LDAP используется для обработки обычных запросов проверки подлинности от клиентских компьютеров.
  • Порт TCP и UDP 464 используется для смены пароля Kerberos.
  • TCP-порты 3268 и 3269 необходимы для обмена данными с глобальным каталогом от клиентов к контроллерам домена. Серверы глобального каталога помогают быстро найти объект в Active Directory.
  • Сетевые порты DNS TCP и UDP 53 используются клиентами и контроллерами домена для целей разрешения имен.

Проверьте состояние сетевого порта на контроллере домена

Если вы хотите проверить состояние сетевого порта на определенном контроллере домена, вы можете запустить простую команду NetStat, которая выведет список всех сетевых портов, которые прослушивает контроллер домена. Чтобы проверить состояние порта на конкретном контроллере домена и сохранить вывод в текстовый файл, выполните следующую команду:

Netstat –an –b | find /I “’Listening” > C:TempDCPorts.txt

Когда вы выполняете команду, она проверяет все порты, прослушиваемые на контроллере домена, а затем сохраняет выходные данные в файл C:TempDCPorts.TXT. Вы можете перемещаться по файлу, чтобы убедиться, что контроллер домена прослушивает необходимые сетевые порты. Однако это становится затруднительным, если вам нужно проверить состояние сетевых портов на каждом контроллере домена. Если вы используете описанный выше метод для проверки состояния каждого порта на каждом контроллере домена, это может занять значительное время. Вот где эта статья пригодится. Здесь мы предоставляем сценарий PowerShell, который подключается к каждому контроллеру домена, а затем собирает состояние сетевого порта.

Требования для запуска скрипта PowerShell

Убедитесь, что вы запускаете сценарий с рядового сервера Windows Server 2012 R2 или контроллера домена, и обязательно создайте папку Temp на диске C:, поскольку сценарий создает отчет с именем «DCPortReport.CSV» в папке C:Temp.. Помимо соблюдения вышеперечисленных требований, есть еще несколько требований, которые вам необходимо выполнить:

  • Сначала загрузите PortQry от Microsoft. Сценарий использует инструмент для сбора состояния порта с целевого контроллера домена.
  • Создайте текстовый файл с именем «DCList.TXT», содержащий имена контроллеров домена Active Directory.

Сценарий проверяет общие порты контроллера домена, такие как UDP-389, TCP-389, UDP-135, TCP-135, UDP-88, TCP-88, UDP-445 и TCP-445. Статус каждого порта отображается в отчете, созданном скриптом.

$TestCSVFile = "C:TempDCPortReport.CSV"
Remove-Item $TestCSVFile -ErrorAction SilentlyContinue
$ThisString="Контроллер домена,Подключение,Статус команды, UDP-389, TCP-389, UDP-135, TCP-135, UDP-88, TCP-88, UDP-445, TCP-445,Окончательный статус"
Добавить содержимое “$TestCSVFile” $ThisString
$ TestStatus = «Пройдено»
$ТестТекст = ""
$сумвал=0
$ReachOrNot = «Да»
$AnyGap = «Нет»
$TotNo = 0
$AnyOneOk="Нет"
$IntDirNow = "C:ReqPortTest"
mkdir $IntDirNow-Force
$PortQryExe = «C:TempPortQry.exe»
Foreach ($ItemName в Get-Content «$GDCList»)
{
$IsDCGap = «Нет»
$ThisService="NetLogon"
$Ошибка.Очистить()
Get-Service -Name "$ThisService" -ComputerName $ItemName
ЕСЛИ ($Error.Count -eq 0)
{
$AnyOneOk="Да"
$PortTCP389Status="Прослушивание"
$PortTCP135Status="Прослушивание"
$PortTCP88Status=”Прослушивание”
$PortTCP445Status="Прослушивание"
$PortUDP389Status=”Прослушивание”
$PortUDP135Status="Прослушивание"
$PortUDP88Status=”Прослушивание”
$PortUDP445Status="Прослушивание"
$LookFor = «Отфильтровано»
$ThisServer=$ItemName
$ Порт = «389»
$PortProtocol = «UDP»
$cmd = $PortQryExe + "-n" + $ThisServer + "-p" + $PortProtocol + "-e" + $port
$PortQryResultFile = "C:TempReqPortTest"+$CurProfNowForAll+$ThisServer+"_"+$Port+"_"+$PortProtocol+".TXT"
Remove-Item $PortQryResultFile -ErrorAction SilentlyContinue
$Output = Invoke-Expression $cmd
$Вывод | Выходной файл $PortQryResultFile
$ThisLookFor=$Искать
$FoundOrNot=Select-String -Путь $PortQryResultFile -Шаблон $ThisLookFor
$TotFoundNow=$FoundOrNot.Count
$FinStatus=""
ЕСЛИ ($TotFoundNow -ne 0)
{
$PortUDP389Status = «Отфильтровано»
$AnyGap = «Да»
$IsDCGap = «Да»
}
Remove-Item $PortQryResultFile -ErrorAction SilentlyContinue
$Порт = «135»
$PortProtocol = «UDP»
$cmd = $PortQryExe + "-n" + $ThisServer + "-p" + $PortProtocol + "-e" + $port
$PortQryResultFile = "C:TempReqPortTest"+$CurProfNowForAll+$ThisServer+"_"+$Port+"_"+$PortProtocol+".TXT"
Remove-Item $PortQryResultFile -ErrorAction SilentlyContinue
$Output = Invoke-Expression $cmd
$Вывод | Выходной файл $PortQryResultFile
$ThisLookFor=$Искать
$FoundOrNot=Select-String -Путь $PortQryResultFile -Шаблон $ThisLookFor
$TotFoundNow=$FoundOrNot.Count
$FinStatus=""
ЕСЛИ ($TotFoundNow -ne 0)
{
$PortUDP139Status = «Отфильтровано»
$AnyGap = «Да»
$IsDCGap = «Да»
}
Remove-Item $PortQryResultFile -ErrorAction SilentlyContinue
$Порт = «88»
$PortProtocol = «UDP»
$cmd = $PortQryExe + "-n" + $ThisServer + "-p" + $PortProtocol + "-e" + $port
$PortQryResultFile = "C:TempReqPortTest"+$CurProfNowForAll+$ThisServer+"_"+$Port+"_"+$PortProtocol+".TXT"
Remove-Item $PortQryResultFile -ErrorAction SilentlyContinue
$Output = Invoke-Expression $cmd
$Вывод | Выходной файл $PortQryResultFile
$ThisLookFor=$Искать
$FoundOrNot=Select-String -Путь $PortQryResultFile -Шаблон $ThisLookFor
$TotFoundNow=$FoundOrNot.Count
$FinStatus=""
ЕСЛИ ($TotFoundNow -ne 0)
{
$PortUDP88Status = «Отфильтровано»
$AnyGap = «Да»
$IsDCGap = «Да»
}
Remove-Item $PortQryResultFile -ErrorAction SilentlyContinue
$Порт = «445»
$PortProtocol = «UDP»
$cmd = $PortQryExe + "-n" + $ThisServer + "-p" + $PortProtocol + "-e" + $port
$PortQryResultFile = "C:TempReqPortTest"+$CurProfNowForAll+$ThisServer+"_"+$Port+"_"+$PortProtocol+".TXT"
Remove-Item $PortQryResultFile -ErrorAction SilentlyContinue
$Output = Invoke-Expression $cmd
$Вывод | Выходной файл $PortQryResultFile
$ThisLookFor=$Искать
$FoundOrNot=Select-String -Путь $PortQryResultFile -Шаблон $ThisLookFor
$TotFoundNow=$FoundOrNot.Count
$FinStatus=""
ЕСЛИ ($TotFoundNow -ne 0)
{
$PortUDP445Status = «Отфильтровано»
$AnyGap = «Да»
$IsDCGap = «Да»
}
Remove-Item $PortQryResultFile -ErrorAction SilentlyContinue
$ Порт = «389»
$PortProtocol = «TCP»
$cmd = $PortQryExe + "-n" + $ThisServer + "-p" + $PortProtocol + "-e" + $port
$PortQryResultFile = "C:TempReqPortTest"+$CurProfNowForAll+$ThisServer+"_"+$Port+"_"+$PortProtocol+".TXT"
Remove-Item $PortQryResultFile -ErrorAction SilentlyContinue
$Output = Invoke-Expression $cmd
$Вывод | Выходной файл $PortQryResultFile
$ThisLookFor=$Искать
$FoundOrNot=Select-String -Путь $PortQryResultFile -Шаблон $ThisLookFor
$TotFoundNow=$FoundOrNot.Count
$FinStatus=""
ЕСЛИ ($TotFoundNow -ne 0)
{
$PortTCP389Status = «Отфильтровано»
$AnyGap = «Да»
$IsDCGap = «Да»
}
Remove-Item $PortQryResultFile -ErrorAction SilentlyContinue
$Порт = «135»
$PortProtocol = «TCP»
$cmd = $PortQryExe + "-n" + $ThisServer + "-p" + $PortProtocol + "-e" + $port
$PortQryResultFile = "C:TempReqPortTest"+$CurProfNowForAll+$ThisServer+"_"+$Port+"_"+$PortProtocol+".TXT"
Remove-Item $PortQryResultFile -ErrorAction SilentlyContinue
$Output = Invoke-Expression $cmd
$Вывод | Выходной файл $PortQryResultFile
$ThisLookFor=$Искать
$FoundOrNot=Select-String -Путь $PortQryResultFile -Шаблон $ThisLookFor
$TotFoundNow=$FoundOrNot.Count
$FinStatus=""
ЕСЛИ ($TotFoundNow -ne 0)
{
$PortTCP139Status = «Отфильтровано»
$AnyGap = «Да»
$IsDCGap = «Да»
}
Remove-Item $PortQryResultFile -ErrorAction SilentlyContinue
$Порт = «88»
$PortProtocol = «TCP»
$cmd = $PortQryExe + "-n" + $ThisServer + "-p" + $PortProtocol + "-e" + $port
$PortQryResultFile = "C:TempReqPortTest"+$CurProfNowForAll+$ThisServer+"_"+$Port+"_"+$PortProtocol+".TXT"
Remove-Item $PortQryResultFile -ErrorAction SilentlyContinue
$Output = Invoke-Expression $cmd
$Вывод | Выходной файл $PortQryResultFile
$ThisLookFor=$Искать
$FoundOrNot=Select-String -Путь $PortQryResultFile -Шаблон $ThisLookFor
$TotFoundNow=$FoundOrNot.Count
$FinStatus=”Хорошо”
ЕСЛИ ($TotFoundNow -ne 0)
{
$PortTCP88Status = «Отфильтровано»
$AnyGap = «Да»
$IsDCGap = «Да»
}
Remove-Item $PortQryResultFile -ErrorAction SilentlyContinue
$Порт = «445»
$PortProtocol = «TCP»
$cmd = $PortQryExe + "-n" + $ThisServer + "-p" + $PortProtocol + "-e" + $port
$PortQryResultFile = "C:TempReqPortTest"+$CurProfNowForAll+$ThisServer+"_"+$Port+"_"+$PortProtocol+".TXT"
Remove-Item $PortQryResultFile -ErrorAction SilentlyContinue
$Output = Invoke-Expression $cmd
$Вывод | Выходной файл $PortQryResultFile
$ThisLookFor=$Искать
$FoundOrNot=Select-String -Путь $PortQryResultFile -Шаблон $ThisLookFor
$TotFoundNow=$FoundOrNot.Count
$FinStatus=""
ЕСЛИ ($TotFoundNow -ne 0)
{
$PortTCP445Status = «Отфильтровано»
$AnyGap = «Да»
$IsDCGap = «Да»
}
Remove-Item $PortQryResultFile -ErrorAction SilentlyContinue
IF ($PortTCP389Status -eq «Отфильтровано» -или $PortTCP135Status -eq «Отфильтровано» -или $PortTCP88Status -eq «Отфильтровано» -или $PortTCP445Status -eq «Отфильтровано» -или $PortUDP389Status -eq «Отфильтровано» -или $PortUDP135Status - eq «Отфильтровано» -или $PortUDP88Status -eq «Отфильтровано» -или $PortUDP445Status -eq «Отфильтровано»)
{
$FinStatus = «ВНИМАНИЕ: этот контроллер домена не прослушивает требуемые порты контроллера домена».
}
$DCConError = "ОК"
$ComConError = "ОК"
$FinalStr = $ItemName+", "+$DCConError+", "+$ComConError+", "+$PortUDP389Status+", "+$PortTCP389Status+", "+$PortUDP135Status+", "+$PortTCP135Status+", "+$PortUDP88Status+"," +$PortTCP88Status+","+$PortUDP445Status+","+$PortTCP445Status+","+$FinStatus
Добавить содержимое $TestCSVFile $FinalStr
ЕСЛИ ($IsDCGap -eq «Да»)
{
$TotNo++
}
}
еще
{
$ThisSTR = $ItemName+», «Ошибка подключения к контроллеру домена»
Добавить содержимое “$TestCSVFile” $ThisStr
}
}
ЕСЛИ ($AnyGap -eq «Да»)
{
$TestStatus="Критический"
$TestText = «Контроллеры домена не прослушивают необходимые порты. Убедитесь, что все контроллеры домена прослушивают необходимые порты и протоколы».
$SumVal = $TotNo
}
ЕСЛИ ($AnyGap -eq «Нет»)
{
$ TestStatus = «Пройдено»
$TestText = «Все контроллеры домена прослушивают необходимые порты. Пожалуйста, убедитесь, что AD Health Profiler смог выполнить Dynamic Pack для всех контроллеров домена».
$СумВал = ""
ЕСЛИ ($AnyOneOk -eq «Нет»)
{
$TestStatus="Ошибка"
$TestText = «Ошибка выполнения динамического пакета»
$СумВал = ""
}
}
$STR = $ADTestName +",""+$TestStartTime+"",+$TestStatus+"","+$SumVal +"",+$TestText

После успешного выполнения сценария в папке «C:Temp» будет создан файл отчета с именем DCPortReport.CSV. Отчет включает состояние порта для каждого контроллера домена, как показано в отчете ниже:

Как видно из отчета, сценарий подключался к каждому контроллеру домена, запускал инструмент PortQry, а затем собирал информацию о состоянии порта для каждого контроллера домена. Как указано в столбце «Окончательное состояние» отчета, контроллеры домена DC3.TechGenix.com и DC4.TechGenix.com не прослушивают один или несколько портов. Все, что вам нужно сделать, это просто проверить выходные данные и убедиться, что ничто в операционной системе не мешает контроллеру домена прослушивать необходимые сетевые порты.

Этот сценарий PowerShell может оказаться удобным, если вы хотите проверить состояние порта контроллера домена в лесу Active Directory. Хотя вы можете проверить состояние порта на одном контроллере домена с помощью команды NetStat, как описано выше, использование сценария сэкономит вам много времени. Вы можете включить сценарий PowerShell в свою процедуру проверки работоспособности Active Directory и запускать этот сценарий каждый месяц, чтобы убедиться, что контроллеры домена прослушивают необходимые порты.