Windows Server для самых маленьких. Часть 15: Управляем серверами с рабочей станции
Все части серии «Windows Server для самых маленьких»Серверы в этой серии — Server Core, и на них нет ничего, кроме консоли. Многое из того, что мы делали в прошлых частях, выполнялось с рабочей станции ws1: модуль ActiveDirectory, Get-DnsServerZone, Install-WindowsFeature -ComputerName, Invoke-Command. В прошлой части мы разобрали WinRM — транспорт для части этих команд. Теперь соберём рабочее место целиком: откуда на рабочей станции берутся модули ролей, по каким протоколам каждый из них ходит на сервер, что делать, когда модуля нет, и как не превратить рабочую станцию администратора в самое слабое место домена.
RSAT
Remote Server Administration Tools — те же инструменты управления, что ставятся на сервер вместе с ролью (-IncludeManagementTools), но для Windows 10 и 11: модули PowerShell, оснастки MMC и утилиты командной строки. С Windows 10 1809 это не отдельный установщик, а компоненты по требованию (Features on Demand): пакеты, которые Windows скачивает с Windows Update, когда их просят. Список и установка требуют консоли администратора — без повышенных прав Get-WindowsCapability отвечает «The requested operation requires elevation.». Так выглядит список на Windows 11 24H2 до установки:
PS C:\> Get-WindowsCapability -Online -Name 'Rsat.*' | Select-Object Name, State
Name State
---- -----
Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0 NotPresent
Rsat.AzureStack.HCI.Management.Tools~~~~0.0.1.0 NotPresent
Rsat.BitLocker.Recovery.Tools~~~~0.0.1.0 NotPresent
Rsat.CertificateServices.Tools~~~~0.0.1.0 NotPresent
Rsat.DHCP.Tools~~~~0.0.1.0 NotPresent
Rsat.Dns.Tools~~~~0.0.1.0 NotPresent
Rsat.FailoverCluster.Management.Tools~~~~0.0.1.0 NotPresent
Rsat.FileServices.Tools~~~~0.0.1.0 NotPresent
Rsat.GroupPolicy.Management.Tools~~~~0.0.1.0 NotPresent
Rsat.IPAM.Client.Tools~~~~0.0.1.0 NotPresent
Rsat.NetworkController.Tools~~~~0.0.1.0 NotPresent
Rsat.NetworkLoadBalancing.Tools~~~~0.0.1.0 NotPresent
Rsat.RemoteAccess.Management.Tools~~~~0.0.1.0 NotPresent
Rsat.ServerManager.Tools~~~~0.0.1.0 NotPresent
Rsat.StorageMigrationService.Management.Tools~~~~0.0.1.0 NotPresent
Rsat.StorageReplica.Tools~~~~0.0.1.0 NotPresent
Rsat.SystemInsights.Management.Tools~~~~0.0.1.0 NotPresent
Rsat.VolumeActivation.Tools~~~~0.0.1.0 NotPresent
Rsat.WSUS.Tools~~~~0.0.1.0 NotPresent
PS C:\> Get-WindowsCapability -Online -Name 'Rsat.*' | Where-Object State -eq NotPresent | Add-WindowsCapability -Online
Состав списка зависит от версии Windows: в документации есть ещё Rsat.LLDP.Tools, Rsat.RemoteDesktop.Services.Tools и Rsat.Shielded.VM.Tools, которых в 24H2 нет. Последняя строка ставит всё; для этой серии достаточно шести: ActiveDirectory.DS-LDS, Dns, DHCP, GroupPolicy.Management, позже CertificateServices и ServerManager (его AD-инструменты всё равно притянут как зависимость). Одна ловушка: в сети с WSUS компоненты по требованию по умолчанию ищутся на WSUS, где их нет, и установка падает с 0x800f0954. Лечится политикой «Specify settings for optional component installation and component repair» (Computer Configuration → Administrative Templates → System) с флажком «Download repair content and optional features directly from Windows Update instead of Windows Server Update Services (WSUS)».
Что приносят компоненты: модули PowerShell (ActiveDirectory, DnsServer, DhcpServer, GroupPolicy), оснастки (dsa.msc, dssite.msc, domain.msc, adsiedit.msc, dnsmgmt.msc, dhcpmgmt.msc, gpmc.msc, а от CertificateServices — certsrv.msc, certtmpl.msc и pkiview.msc, модуля PowerShell у него нет) и утилиты (repadmin, dcdiag, ntdsutil, dsacls, netdom, ldp, dnscmd). Проверить, что появилось, в PowerShell 7 — с одной оговоркой:
PS C:\> Get-Module -ListAvailable ActiveDirectory, DnsServer, DhcpServer, GroupPolicy | Select-Object Name, Version
Name Version
---- -------
ActiveDirectory 1.0.1.0
DnsServer 2.0.0.0
PS C:\> Get-Module -ListAvailable DhcpServer, GroupPolicy -SkipEditionCheck | Select-Object Name, Version, CompatiblePSEditions
Name Version CompatiblePSEditions
---- ------- --------------------
DhcpServer 2.0.0.0 {}
GroupPolicy 1.0.0.0 {}
Модули лежат в каталоге Windows PowerShell 5.1, и PowerShell 7 показывает оттуда только те, что объявили совместимость с ним (CompatiblePSEditions с Core). DhcpServer и GroupPolicy этого не объявили, поэтому Import-Module DhcpServer загружает модуль не в PowerShell 7, а через слой совместимости — об этом в разделе про неявный remoting. Если модуль на деле работает и в PowerShell 7, его можно загрузить напрямую: Import-Module DhcpServer -SkipEditionCheck; с DhcpServer и GroupPolicy это работает.
Версия RSAT должна соответствовать версии управляемых серверов, и номер версии модуля тут не помогает: DnsServer и в Windows Server 2019, и в 2025 — 2.0.0.0, но в 2025 в нём на две команды больше (Get- и Set-DnsServerEncryptionProtocol, DNS поверх HTTPS). Модуль из старой Windows не знает команд и параметров новой, а новая команда, отправленная на старый сервер, упирается в его провайдер:
PS C:\> Get-DnsServerEncryptionProtocol -CimSession dns2019 # сервер DNS на Windows Server 2019
Get-DnsServerEncryptionProtocol: The WS-Management service cannot process the request. The class PS_DnsServerEncryptionProtocol does not exist in the root/microsoft/windows/dns namespace.
Если рабочая станция — Windows Server, то же самое ставится как компоненты: Install-WindowsFeature RSAT-AD-Tools, RSAT-DNS-Server, RSAT-DHCP, GPMC.
Транспорты
У модулей RSAT несколько разных способов добраться до сервера, и знать их нужно, чтобы понимать, какой порт открыть и почему одна команда работает, а соседняя нет.
Собственный протокол. Модуль ActiveDirectory ходит на ADWS, порт 9389 (часть 13). Модуль GroupPolicy — по LDAP на контроллер и по SMB в SYSVOL, с параметром -Server или -Domain. Это модули, которые знают, с чем работают, и транспорт у них зашит.
CIM через WinRM. Модули DnsServer, DhcpServer, Storage, NetTCPIP, NetAdapter, NetSecurity, SmbShare, ScheduledTasks, PrintManagement, Defender и ещё несколько десятков устроены одинаково: их команды — это функции, сгенерированные из CDXML (cmdlet definition XML), обёртки над классами WMI. Параметр -CimSession у всех общий: он принимает готовый сеанс CIM или имя компьютера, и тогда сеанс создаётся на один вызов; транспорт до удалённого сервера — WinRM с операциями WS-Management над CIM:
PS C:\> Get-Command Get-DnsServerZone | Select-Object CommandType, Source, Version
CommandType Source Version
----------- ------ -------
Function DnsServer 2.0.0.0
PS C:\> Get-ChildItem C:\Windows\System32\WindowsPowerShell\v1.0\Modules\DnsServer\*.cdxml | Select-Object -First 3 Name
Name
----
PS_DnsServer_v1.0.0.cdxml
PS_DnsServerCache_v1.0.0.cdxml
PS_DnsServerClientSubnet_v1.0.0.cdxml
PS C:\> Get-CimClass -Namespace root/Microsoft/Windows/DNS -ClassName PS_DnsServerZone -ComputerName dc1 | Select-Object -ExpandProperty CimClassMethods | Select-Object -First 4 Name
Name
----
Export
Get
Remove
Resume
В модуле DnsServer 51 файл CDXML и 133 функции. Get-DnsServerZone -CimSession dc1 — это вызов статического метода Get класса PS_DnsServerZone в пространстве имён root/Microsoft/Windows/DNS на dc1 через WinRM; всего у класса шесть методов (ещё Suspend и Sync), и каждой функции соответствует свой: Suspend-DnsServerZone — Suspend, Remove-DnsServerZone — Remove. Создание зоны — уже другой класс, PS_DnsServerPrimaryZone. Один сеанс на несколько команд и серверов экономит время на установку соединения:
PS C:\> Import-Module DhcpServer -SkipEditionCheck
PS C:\> $cim = New-CimSession -ComputerName dc1, dc2
PS C:\> Get-DnsServerZone -CimSession $cim | Where-Object IsDsIntegrated | Format-Table ZoneName, PSComputerName
ZoneName PSComputerName
-------- --------------
_msdcs.corp.example.com dc1
1.168.192.in-addr.arpa dc1
corp.example.com dc1
_msdcs.corp.example.com dc2
1.168.192.in-addr.arpa dc2
corp.example.com dc2
PS C:\> Get-DhcpServerv4ScopeStatistics -CimSession $cim | Format-Table ScopeId, InUse, Free, PSComputerName
ScopeId InUse Free PSComputerName
------- ----- ---- --------------
192.168.1.0 29 152 dc1
192.168.1.0 27 154 dc2
PS C:\> Get-CimInstance Win32_OperatingSystem -CimSession $cim | Format-Table CSName, LastBootUpTime, FreePhysicalMemory
CSName LastBootUpTime FreePhysicalMemory
------ -------------- ------------------
DC1 26.10.2026 13:40:44 1539176
DC2 25.10.2026 11:47:59 2626256
PS C:\> Remove-CimSession $cim
Одна и та же область на обоих серверах — пара отказоустойчивости из части 8. Import-Module ... -SkipEditionCheck в первой строке не случаен: без него DhcpServer загрузится через слой совместимости, и сеанс CIM из PowerShell 7 туда не передать — команда ответит «Cannot convert the "CimSession: dc1" value of type "Deserialized.Microsoft.Management.Infrastructure.CimSession" to type "Microsoft.Management.Infrastructure.CimSession"». Get-CimInstance — то же самое для любого класса WMI, и это замена Get-WmiObject из Windows PowerShell 5.1, который ходил по DCOM и которого в PowerShell 7 нет. Для серверов без WinRM у New-CimSession есть -SessionOption (New-CimSessionOption -Protocol Dcom), но это уже RPC со всеми его портами.
-ComputerName у DnsServer и DhcpServer — не WinRM. У команд этих двух модулей есть и -ComputerName, и по названию кажется, что это тот же сеанс на один вызов. Но это обычный параметр метода, который передаётся провайдеру: команда вызывает локальный класс PS_DnsServerZone, а его провайдер, поставленный вместе с RSAT, сам обращается к службе DNS на dc1 по RPC — по протоколу MS-DNSP, тому же, что и оснастка DNS Manager; у DhcpServer так же работает MS-DHCPM. Разницу видно по PSComputerName:
PS C:\> Get-CimClass -Namespace root/Microsoft/Windows/DNS -ClassName PS_DnsServerZone | Select-Object CimClassName, @{n='Provider'; e={$_.CimClassQualifiers['provider'].Value}}
CimClassName Provider
------------ --------
PS_DnsServerZone DnsServerPSProvider
PS C:\> Get-DnsServerZone -ComputerName dc1 -Name corp.example.com | Select-Object ZoneName, ZoneType, IsDsIntegrated, PSComputerName
ZoneName ZoneType IsDsIntegrated PSComputerName
-------- -------- -------------- --------------
corp.example.com Primary True
PS C:\> Get-DnsServerZone -CimSession dc1 -Name corp.example.com | Select-Object ZoneName, ZoneType, IsDsIntegrated, PSComputerName
ZoneName ZoneType IsDsIntegrated PSComputerName
-------- -------- -------------- --------------
corp.example.com Primary True dc1
Результат одинаковый, а путь разный: с -ComputerName команда выполнилась на рабочей станции, в процессе WmiPrvSE.exe, и соединения с dc1 открыл он — к порту 135 и к динамическому порту службы DNS (это видно в «Смотрим руками» ниже). Поэтому -ComputerName работает без WinRM на сервере, но требует правил файрвола «DNS Service» и «DHCP Server Management», которые роль включает при установке.
RPC и DCOM. Командлеты Windows PowerShell 5.1 с -ComputerName — Get-Service, Get-Process, Get-EventLog — в PowerShell 7 этого параметра не имеют («A parameter cannot be found that matches parameter name 'ComputerName'.»). Из оставшихся по RPC ходят Get-WinEvent -ComputerName, сеансы CIM по DCOM, -ComputerName модулей DNS и DHCP и большинство оснасток MMC: Endpoint Mapper на 135 и динамический порт из части 3. На файрволе сервера для них нужны группы правил, большинство которых по умолчанию выключено, и без них ответ один:
PS C:\> Get-WinEvent -ComputerName dc1 -LogName System -MaxEvents 1
Get-WinEvent: The RPC server is unavailable.
PS C:\> Invoke-Command dc1, dc2 { Enable-NetFirewallRule -DisplayGroup 'Remote Event Log Management', 'Remote Service Management', 'Remote Scheduled Tasks Management', 'Windows Management Instrumentation (WMI)', 'Remote Volume Management' }
На контроллерах домена группа «Windows Management Instrumentation (WMI)» уже включена, на рядовых серверах — нет; остальные четыре выключены везде. Какая оснастка по чему ходит:
| Оснастка | Транспорт | Правило файрвола на сервере |
|---|---|---|
| Active Directory Users and Computers, Sites and Services, ADSI Edit | LDAP 389/3268, для части операций RPC (SAMR) | открыты на контроллере всегда |
| DNS Manager | RPC к службе DNS (MS-DNSP: 135 и динамический порт) | «DNS Service» — включено при установке роли |
| DHCP Manager | RPC к службе DHCP (MS-DHCPM) | «DHCP Server Management» — включено при установке роли |
| Group Policy Management | LDAP и SMB (445) | открыты на контроллере |
| Event Viewer, Services, Task Scheduler, Computer Management | RPC к каждой службе отдельно | группы «Remote … Management» — выключены |
| Disk Management | RPC к службе Virtual Disk | «Remote Volume Management» — выключено, и включать его нужно и на сервере, и на рабочей станции |
| Server Manager | WinRM | «Windows Remote Management» — включено |
Поэтому Enter-PSSession dc1 работает на свежем сервере, а Event Viewer с подключением к dc1 — нет: разные протоколы, разные правила. В сети с файрволом между сегментом администраторов и серверами динамические порты RPC становятся отдельной задачей, которую WinRM на 5985 снимает целиком, — и это главный практический аргумент в пользу PowerShell с -CimSession и Invoke-Command перед оснастками.
Неявный remoting
Модуля нет на рабочей станции, или он старее серверного, или рабочая станция вообще не Windows. В части 14 был Invoke-Command, но писать каждую команду внутри блока неудобно. Неявный remoting импортирует команды из сеанса как локальные:
PS C:\> $s = New-PSSession -ComputerName dc1
PS C:\> Import-Module -PSSession $s -Name DhcpServer -Prefix DC1
PS C:\> Get-DC1DhcpServerv4Scope | Format-Table ScopeId, Name, State
ScopeId Name State
------- ---- -----
192.168.1.0 Office Active
PS C:\> Get-Command Get-DC1DhcpServerv4Scope | Select-Object CommandType, Source
CommandType Source
----------- ------
Function DhcpServer
PS C:\> (Get-Module DhcpServer).Path
C:\Users\alice.admin\AppData\Local\Temp\remoteIpMoProxy_DhcpServer_2.0.0.0_dc1_6f0c…\remoteIpMoProxy_DhcpServer_2.0.0.0_dc1_6f0c….psm1
На рабочей станции появился модуль-заместитель с тем же именем, сгенерированный во временной папке, а в нём — функции с префиксом DC1: вызов Get-DC1DhcpServerv4Scope выполняет Get-DhcpServerv4Scope в сеансе на dc1 и возвращает результат. Автодополнение и справка работают, объекты приходят сериализованными (экземпляры CIM PowerShell восстанавливает как CIM, остальное — как Deserialized.* без методов). Без -Prefix функции получат родные имена и перекроют локальные, если они есть. Старшая форма того же — Import-PSSession -Session $s -Module DhcpServer, она называет модуль-заместитель tmp_<случайное имя>. Export-PSSession сохраняет заместителей на диск как обычный модуль, который при первом вызове сам откроет сеанс к dc1:
PS C:\> Export-PSSession -Session $s -Module DhcpServer -OutputModule DhcpFromDc1
PS C:\> Remove-PSSession $s
# в новом окне
PS C:\> Import-Module DhcpFromDc1 -Prefix DC1
PS C:\> Get-DC1DhcpServerv4Scope | Format-Table ScopeId, Name, State, PSComputerName
Creating a new session for implicit remoting of "Get-DhcpServerv4Scope" command...
ScopeId Name State PSComputerName
------- ---- ----- --------------
192.168.1.0 Office Active dc1
Это же решает проблему версий: модуль DhcpServer с контроллера на Windows Server 2025 через неявный remoting знает все команды и параметры 2025, какой бы RSAT ни стоял на рабочей станции. И это же способ управлять Windows-серверами с Linux или macOS из PowerShell 7 — через сеанс по SSH из следующей части.
Тем же механизмом PowerShell 7 загружает модули, которые не объявили совместимость с ним. Import-Module DhcpServer без -SkipEditionCheck поднимает локальный процесс Windows PowerShell 5.1 — сеанс WinPSCompatSession к localhost — и импортирует модуль оттуда:
PS C:\> Import-Module DhcpServer
WARNING: Module DhcpServer is loaded in Windows PowerShell using WinPSCompatSession remoting session; please note that all input and output of commands from this module will be deserialized objects. If you want to load this module into PowerShell please use 'Import-Module -SkipEditionCheck' syntax.
PS C:\> Get-PSSession | Format-Table Id, Name, ComputerName, State
Id Name ComputerName State
-- ---- ------------ -----
2 WinPSCompatSession localhost Opened
PS C:\> Get-DhcpServerv4ScopeStatistics -ComputerName dc1 | Format-Table ScopeId, InUse, Free, PSComputerName
ScopeId InUse Free PSComputerName
------- ----- ---- --------------
192.168.1.0 29 152 localhost
PSComputerName здесь — localhost: объект пришёл из процесса 5.1 на той же машине, а уже тот обратился к dc1. Так же загружается GroupPolicy, и так же PowerShell 7 находит Get-WmiObject, если его вызвать: команда работает, но через тот же слой и с теми же десериализованными объектами.
Windows Admin Center
Windows Admin Center (WAC) — веб-интерфейс к серверам: страница в браузере, за ней шлюз, который ходит на серверы по WinRM — PowerShell Remoting и WMI поверх WinRM. Ставится на сервер управления (wac.corp.example.com) или на рабочую станцию; на Windows Server слушает 443, на клиентской Windows — 6600 и только локально. Пользователей шлюза он проверяет через Windows (Active Directory или локальные группы) или через Microsoft Entra ID, облачный каталог Microsoft из последних частей серии, и показывает для каждого сервера: обзор с нагрузкой, события, службы, процессы, обновления, файрвол, роли, хранилище, сеть, сертификаты, планировщик, реестр, PowerShell-консоль в браузере; расширения — Active Directory, DNS, DHCP, Hyper-V, кластеры, Azure. Текущая версия ставится не MSI, а EXE-установщиком:
PS C:\> Start-BitsTransfer -Source https://aka.ms/WACdownload -Destination C:\Temp\WindowsAdminCenter.exe
PS C:\> Start-Process -FilePath C:\Temp\WindowsAdminCenter.exe -ArgumentList '/VERYSILENT' -Wait
Без своего сертификата (/CertificateThumbprint= с отпечатком из LocalMachine\My) установщик выпускает самоподписанный на 60 дней — для проверки, не для работы. У шлюза на сервере есть знакомая из части 14 особенность: он подключается к серверам от имени пользователя, то есть делает второй прыжок, и для единого входа без повторного ввода пароля каждому управляемому серверу нужно разрешить делегирование на основе ресурса для учётной записи компьютера шлюза — так предписывает документация WAC; делегирование здесь выполняет сам шлюз, а не сеанс PowerShell на промежуточном сервере, как в части 14:
PS C:\> Set-ADComputer -Identity (Get-ADComputer srv1) -PrincipalsAllowedToDelegateToAccount (Get-ADComputer wac)
Для этой серии он ценен одной кнопкой: в каждом инструменте WAC на панели есть значок PowerShell, который показывает скрипты, стоящие за действиями на этой странице. Так из любого действия в UI можно получить команду для скрипта. Мы будем на него ссылаться, но не опираться: всё, что он делает, делается командами, которые он же и показывает.
Рабочая станция администратора
Рабочая станция, с которой администратор домена входит на контроллеры, — вторая по ценности цель после самих контроллеров. Правила, которые из этого следуют, не зависят от размера организации.
Отдельная учётная запись. alice читает почту и ходит в браузер; alice.admin из части 4 не делает ни того, ни другого. На рабочей станции она используется только для запуска инструментов:
PS C:\> runas /user:CORP\alice.admin pwsh
PS C:\> Start-Process pwsh -Credential (Get-Credential CORP\alice.admin)
PS C:\> runas /netonly /user:CORP\alice.admin "mmc dsa.msc" # /netonly: локально под текущим, к сети — под alice.admin
Программа с аргументами берётся в кавычки целиком, иначе runas примет dsa.msc за лишний параметр.
Куда попадает пароль. Каждый интерактивный вход — RDP, runas без /netonly — оставляет в памяти lsass целевой машины учётные данные, которые можно извлечь. Правило: административные учётные данные вводятся только на машинах того же уровня доверия. Контроллер доверен — на него можно входить по RDP; сервер с веб-приложением, который ломают через уязвимость в этом приложении, — нет. Для RDP на такие серверы есть Remote Credential Guard (mstsc /remoteGuard /v:srv1): учётные данные остаются на рабочей станции, запросы Kerberos сервер пересылает обратно на неё по мере надобности, и в его памяти ни пароля, ни ключей нет; работает только по Kerberos, без отката на NTLM. Более ранний вариант — Restricted Admin (mstsc /restrictedAdmin /v:srv1): вход без передачи учётных данных вовсе, только для членов локальной группы Administrators на сервере, и с сервера дальше по сети идёт уже его учётная запись компьютера, а не ваша — тот же второй прыжок. Оба режима сервер должен разрешить: политика «Remote host allows delegation of nonexportable credentials» (параметр DisableRestrictedAdmin = 0 в HKLM\SYSTEM\CurrentControlSet\Control\Lsa).
Protected Users. Встроенная группа домена, членам которой контроллеры запрещают всё, что делает учётные данные уязвимыми: NTLM, DES и RC4 в Kerberos, делегирование любого вида, TGT дольше четырёх часов, а рабочие станции не кешируют их пароль и NT-хеш и не дают войти без сети. Административные учётные записи кладут в неё, предварительно проверив по событиям 4776 и 4769 из части 6, что они не пользуются NTLM и RC4 (и что у них есть ключи AES — пароль менялся после перехода домена на 2008); учётные записи служб и компьютеров туда не кладут:
PS C:\> Add-ADGroupMember -Identity 'Protected Users' -Members alice.admin
Разделение уровней. В модели, которую Microsoft называла tiering, а теперь — enterprise access model, учётные записи и машины делятся на уровни: 0 — контроллеры, PKI, системы управления идентичностью и те, кто ими управляет; 1 — серверы и приложения; 2 — рабочие станции и пользователи. Учётная запись уровня 0 не входит на машины уровней 1 и 2, и наоборот. Рабочая станция администратора уровня 0 (PAW, privileged access workstation) — отдельная машина или отдельная виртуальная машина с минимумом софта, без почты и браузера, которой владеет только администратор. Для домена из трёх контроллеров это звучит избыточно; для домена, который взломали через ноутбук администратора, — единственное, что помогло бы.
LAPS. Локальный администратор на каждом сервере и рабочей станции с одинаковым паролем — вторая по частоте причина распространения атаки по сети. Windows LAPS (встроен в Windows с обновлений апреля 2023 года) меняет пароль локального администратора на каждой машине на случайный и хранит его в атрибуте учётной записи компьютера в каталоге — msLAPS-Password или, зашифрованным, msLAPS-EncryptedPassword; оба в списке атрибутов, которые RODC из части 11 не получает. Включается расширением схемы (Update-LapsADSchema), правом компьютеров писать свой атрибут (Set-LapsADComputerSelfPermission) и групповой политикой, а читается Get-LapsADPassword ws1 -AsPlainText тем, кому делегировано право.
Смотрим руками
Все транспорты сразу. Четыре команды с рабочей станции, а затем список установленных соединений с dc1 и процессов, которым они принадлежат:
PS C:\> $dc1 = (Resolve-DnsName dc1.corp.example.com).IPAddress
PS C:\> Get-ADUser alice -Server dc1 | Out-Null # ADWS
PS C:\> Get-DnsServerZone -CimSession dc1 | Out-Null # CIM через WinRM
PS C:\> Get-DnsServerZone -ComputerName dc1 | Out-Null # RPC из локального провайдера
PS C:\> $dcom = New-CimSession dc1 -SessionOption (New-CimSessionOption -Protocol Dcom)
PS C:\> Get-CimInstance Win32_Service -Filter "Name='DNS'" -CimSession $dcom | Out-Null # DCOM
PS C:\> Get-NetTCPConnection -RemoteAddress $dc1 -State Established | Sort-Object RemotePort | Format-Table RemotePort, OwningProcess, @{n='Process'; e={(Get-Process -Id $_.OwningProcess).Name}}
RemotePort OwningProcess Process
---------- ------------- -------
135 1236 svchost
135 1236 svchost
135 3412 WmiPrvSE
9389 5124 pwsh
9389 5124 pwsh
49671 3412 WmiPrvSE
49673 5124 pwsh
-RemoteAddress берёт все адреса dc1: в сети с IPv6 соединения идут по 2001:db8:1::10, и фильтр по одному 192.168.1.10 ничего бы не нашёл. Читаем по строкам:
- два соединения
pwshс 9389 — ADWS; модульActiveDirectoryдержит их открытыми для следующих команд; - соединения с 5985 уже нет:
-CimSession dc1с именем вместо сеанса создал сеанс CIM на один вызов и закрыл его; WmiPrvSEс 135 и с 49671 — этоGet-DnsServerZone -ComputerName: локальный провайдер спросил у Endpoint Mapper порт службы DNS и подключился к нему (на сервереGet-NetTCPConnection -LocalPort 49671 -State Listenпокажет процессdns);pwshс 49673 — DCOM к службеWinmgmtнаdc1, а два соединенияsvchostс 135 — это локальная службаRpcSs, через которую DCOM находит объект на сервере.
Кто хочет увидеть то же на уровне пакетов — pktmon start --capture, команды, pktmon stop и pktmon etl2pcap для Wireshark (захват требует прав администратора на рабочей станции). Оснастка ведёт себя как третья строка: dnsmgmt.msc с подключением к dc1 — те же 135 и динамический порт службы DNS, внутри — вызовы MS-DNSP вроде R_DnssrvQuery2. Если на файрволе между рабочей станцией и сервером открыт только 5985, оснастка и Get-DnsServerZone -ComputerName dc1 не подключатся, а Get-DnsServerZone -CimSession dc1 будет работать.
И проверка, что рабочая станция не держит того, чего не должна. В окне, открытом runas /netonly, whoami показывает corp\alice — локально процесс работает под ней, а klist после первого обращения к серверу — билеты alice.admin: у такого сеанса входа тип 9, NewCredentials, и его учётные данные используются только для сети. Кто в группе:
PS C:\> Get-ADGroupMember 'Protected Users' | Select-Object Name
Name
----
Alice Admin
На сервере, куда alice.admin подключалась через Invoke-Command, её учётных данных нет — WinRM с Kerberos их туда не передаёт (часть 14).
Источники
- Install and Manage Remote Server Administration Tools in Windows — состав RSAT, установка на Windows Server и клиентской Windows, права администратора;
- Available features on demand — имена компонентов
Rsat.*, их состав и зависимости; - Get-WindowsCapability и Add-WindowsCapability — список и установка компонентов по требованию;
- Configure a Windows Repair Source — политика «Specify settings for optional component installation and component repair»;
- Install-WindowsFeature — компоненты RSAT на Windows Server;
- about_Windows_PowerShell_Compatibility — слой совместимости,
WinPSCompatSession,CompatiblePSEditionsи-SkipEditionCheck; - Import-Module, Import-PSSession и Export-PSSession — неявный remoting,
-PSSession,-Prefix, сохранение заместителей в модуль; - CDXML overview — команды, сгенерированные из описаний классов CIM;
- New-CimSession, New-CimSessionOption и Get-CimInstance — сеансы CIM по WinRM и DCOM;
- DnsServer, Get-DnsServerZone и DhcpServer — модули DNS и DHCP, параметры
-ComputerNameи-CimSession; - MS-DNSP: Domain Name Service (DNS) Server Management Protocol и MS-DHCPM: Microsoft Dynamic Host Configuration Protocol (DHCP) Server Management Protocol — RPC-протоколы управления службами DNS и DHCP;
- GroupPolicy — модуль групповых политик;
- Service overview and network port requirements for Windows — порты ADWS, RPC и динамический диапазон;
- Get-WinEvent —
-ComputerNameбез Remoting и требование к файрволу; - Enable-NetFirewallRule — включение групп правил по
-DisplayGroup; - Troubleshoot Disk Management — правило «Remote Volume Management» на обеих сторонах;
- Get-NetTCPConnection и Packet Monitor (Pktmon) — соединения и захват пакетов встроенными средствами;
- What is Windows Admin Center, Install Windows Admin Center, Get started with Windows Admin Center и User access control and permissions — шлюз и его транспорт, установка, порты 443 и 6600, просмотр скриптов PowerShell, единый вход и делегирование;
- Runas — синтаксис и
/netonly; - Administrative tools and logon types — типы входа RDP,
runasиrunas /netonlyи где остаются учётные данные; - Remote Credential Guard — Remote Credential Guard и Restricted Admin, политика на сервере;
- Protected Users Security Group — ограничения для членов группы и предупреждения;
- Enterprise access model и Privileged access devices — уровни доступа и PAW;
- Windows LAPS overview, Get-LapsADPassword и Update-LapsADSchema — Windows LAPS, атрибуты и командлеты.
С рабочей станции Windows к серверам Windows дорога построена. Но у серверов есть ещё одна дверь, которой уже двадцать лет пользуются администраторы Linux, и с 2018 года она есть и в Windows Server — вместе с возможностью сделать PowerShell тем, что открывается за ней.
Дальше — часть 16: SSH на Windows Server. OpenSSH Server как компонент, sshd_config и отличия от Linux, ключи и файл administrators_authorized_keys, PowerShell как оболочка по умолчанию, вход по Kerberos через GSSAPI, PowerShell Remoting поверх SSH вместо WinRM — в том числе с Linux и macOS, и почему встроенный клиент Windows и клиент из Git for Windows ведут себя по-разному.
Оставить комментарий могут только зарегистрированные пользователи.
Войдите на сайт или зарегистрируйтесь, чтобы оставить комментарий.