В этой статье мы рассмотрим, как получить списки пользователей и групп, которым предоставлены права локальных администраторов на компьютерах и серверах Windows в вашей сети.
Просмотр локальных администраторов на локальном компьютере
В Windows вы можете просмотреть, добавить или удалить пользователей в локальной группе Administrators с помощью оснастки управления компьютером (
compmgmt.msc
). Разверните Computer Management -> Local users and Group -> Groups. Выберите группу Administrator.
По умолчанию на компьютере Windows, который добавлен в домен Active Directory, права администратора предоставляются локальным администраторам и доменной группе Domain Admins.
Все остальные пользователи или группу добавляются в группу администраторов отдельно (вручную, групповыми политиками, скриптами и т.д.).
Чтобы вывести состав локальной группы Administrators, можно воспользоваться командлетом Get-LocalGroupMember из встроенного модуля Microsoft.PowerShell.LocalAccounts.
Get-LocalGroupMember -Group "Administrators"
Обратите внимание, что в параметре Principal указан источник данного пользователя/группы. Это может быть Local, домен Active Directory или Azure AD.
Чтобы вывести только локальных пользователей с правами администратора:
Get-LocalGroupMember Administrators | Where-Object { (Get-LocalUser $_.SID -ErrorAction SilentlyContinue).Enabled }
Можно отфильтровать только пользователей из AD:
Get-LocalGroupMember Administrators | Where-Object {$_.PrincipalSource -eq "ActiveDirectory"} | select PrincipalSource,class,name,SID
Если на компьютере установлен модуль Active Directory for Windows PowerShell из пакета RSAT, вы можете получить дополнительную информацию о пользователях или группах AD по их SID.
В данном примере скрипт получит членов всех групп Active Directory, которые входят в состав локальных администраторов (список пользователей в группе AD получаем с помощью команды Get-ADGroupMember). Затем с помощью Get-ADUser мы получим SamAccountName и состояние учетной записи (Enabled = True/False)
$admins=Get-LocalGroupMember Administrators | Where-Object {$_.PrincipalSource -eq "ActiveDirectory"}
Foreach ($admin in $admins)
{
If ($admin.objectclass –eq "User") {get-aduser $admin.sid|select SamAccountName,enabled }
If ($admin.objectclass –eq "Group") {Get-ADGroupMember $admin.sid | foreach { Get-ADUser $_ |Select-Object SamAccountName,enabled }}
}
Получить список администраторов на удаленных компьютерах Windows
Рассмотренные выше пример позволяют получить список пользователей с правами администратора на локальном компьютере. Теперь рассмотрим, как удаленно получить состав группы локальных администраторов.
Для запуска команд на удаленных компьютерах должен быть настроен PowerShell Remoting (вы можете включить и настроить WinRM с помощью GPO) и открыт порт файервола TCP 5985 (вы можете открыть порт в Windows Defender Firewall через GPO).
Для выполнения команды на удаленном компьютере используется PowerShell командлет Invoke-Command. Следующая команда получит список администраторов на удаленном компьютере с именем wks-t1122:
Invoke-Command -ComputerName wks-t1122 -ScriptBlock{Get-LocalGroupMember -Name 'Administrators'|select Name,ObjectClass,PrincipalSource|ft}
Теперь рассмотрим, как получить список администраторов сразу с нескольких компьютеров. Для удобства мы сразу исключим группу Domain Admins из результатов:
$results = Invoke-Command wks-t112,srv-rds2 -ScriptBlock {Get-LocalGroupMember -Name 'Administrators'|where {$_.name –notlike “*Domain Admins*”}|select Name,ObjectClass,PrincipalSource}
$results | Select-Object PSComputerName,Name,ObjectClass,PrincipalSource
Можно экспортировать получившийся список пользователей и групп в CSV файл с помощью Export-CSV:
$results | Export-CSV "C:\PS\admins.CSV" -NoTypeInformation -Encoding UTF8
Вы можете опросить сразу множество компьютеров или серверов из домена. В данном примере я хочу получить список админов на всех Windows Server в AD. Получим список компьютеров с помощью Get-ADComputer:
$computers = (Get-ADComputer -Filter 'operatingsystem -like "*Windows server*" -and enabled -eq "true"').Name
Теперь запросим состав группы администраторов на каждом хосте:
$results = Invoke-Command -ComputerName $computers -ScriptBlock {Get-LocalGroupMember -Name 'Administrators'|where {$_.name –notlike "*Domain Admins*"}|select Name,ObjectClass,PrincipalSource} -ErrorAction SilentlyContinue
Удалить пользователей из группы локальных администраторов Windows
Администраторам предприятия крайне важно следить за составом группы локальных администраторах на рабочих станция Windows и серверах в сети. Нужно минимизировать количество пользователей с правами администраторов.
Чтобы вручную удалить пользователя из группы локальных админов, можно использовать команду:
Remove-LocalGroupMember -Group Administrators -Member username
Можно удалить пользователя из группы удаленно:
Invoke-Command -ComputerName wks-t1122 –ScriptBlock {Remove-LocalGroupMember -Group Administrators -Member username}
Но можно использовать более продвинутый сценарий. Допустим, вы сформировали список пользователей с правами администраторов на компьютерах и сохранили его в переменной $results.
$results = Invoke-Command wks-11,wks-22 -ScriptBlock {Get-LocalGroupMember -Name 'Administrators'|where {$_.name –notlike “*Domain Admins*”}|select Name,ObjectClass,PrincipalSource,SID}
Затем выведем список пользователей и компьютеров в виде списка Out-GridView:
$principals_to_remove=$results | Out-GridView -Title "Select principal to remove from local admins" -OutputMode Multiple
Теперь вы должны выбрать в таблице пользователей, которых нужно удалить из группы администраторов (зажмите CTRL, чтобы выделить несколько строк в таблице), и выполнить код:
foreach ($principal in $principals_to_remove)
{
Invoke-Command $principal.PSComputerName -ScriptBlock {Remove-LocalGroupMember -Group Administrators -Member $using:principal.name}
}
$using:principal.name
позволяет передать значение локальной переменной с вашего компьютера в удаленную сессию PSRemoting.В результате, выбранные вами пользователи будут удалены из групп локальных администраторов на удаленных компьютерах Windows.