Скрипт для поиска пользователей в группе Администраторы на серверах

Скрипт проходит по всем серверам из Active Directory, смотрит состав локальной группы Администраторы и сохраняет список в файл. Будет полезным для поддержания безопасности в среде с большим количеством серверов.
Пример скрипта
- $ExportFile = "C:\temp\remotes.csv"
- $SearchBase = "OU=Серверы,DC=dmosk,DC=local"
- $AdminList = @{}
- $ToCSV = ""
- function Get-LocalAdmin {
- param ($strcomputer)
- try {
- $users = Gwmi win32_groupuser –computer $strcomputer -ErrorAction Stop
- } catch {
- Write-Host $strcomputer
- }
- if ($users) {
- $admins = $users |? { ($_.groupcomponent –match 'Администраторы') -or ($_.groupcomponent –match 'Administrators') }
- $return = $admins |% {
- $_.partcomponent –match “.+Domain\=(.+)\,Name\=(.+)$” > $nul
- $matches[1].trim('"') + “\” + $matches[2].trim('"')
- }
- return $return
- }
- }
- $ServersList = Get-ADComputer -SearchBase $SearchBase -Filter * -Properties OperatingSystem | Where { $_.OperatingSystem -match "Windows" }
- $ServersList | Select-Object Name | ForEach-Object {
- $UserList = Get-LocalAdmin $_.Name
- if ($UserList) {
- $AdminList[$_.Name] = $UserList
- }
- }
- $AdminList.Keys | % {
- $ServerName = $_
- $AdminUsers = $AdminList[$ServerName]
- $ToCSV += "$ServerName;$AdminUsers`r`n"
- }
- if (Test-Path $ExportFile) {
- Remove-Item $ExportFile
- }
- $ToCSV >> $ExportFile
Описание скрипта
1 - 4 | Определяем переменные для дальнейшего использования. |
1 | Путь к файлу, в который будет сохранен результат. |
2 | Контейнер в Active Directory, в котором находятся учетные записи компьютеров серверов. |
3 | Создаем и хэш-массив. В Powershell необходимо делать до начала использования. |
4 | Создаем пустую переменную. Ее будем наполнять списком пользователей, которые входят в группу Администраторы. |
6 - 21 | Функция для поиска пользователей в группе Администраторы. |
7 | Функции будет передаваться имя сервера. Его будем сохранять в переменную $strcomputer |
8 - 12 | Создаем исключение для выполняемой операции. Если запрос не будет выполнен корректно, на экран будет выведено название сервера. |
9 | Обращаемся в WMI объекту win32_groupuser со списком групп Windows. |
11 | Если обращение к WMI выполнено с ошибкой (чаще всего из-за недоступности RPC), на экран будет выведено название сервера, к которому в данный момент идет обращение. |
13 | Условие, при котором проверяется существование переменной со списком групп, полученной в строчке 9 |
14 | Создаем переменную, в которую войдет список пользователей группы Администраторы или Administrators (на серверах с английской версией). |
15 - 18 | Вытаскиваем пользователей из административной группы и удаляем лишнюю служебную информацию. |
19 | Функция возвращает список пользователей. |
23 | Создаем переменную и помещаем в нее список компьютеров, на которых будем искать администраторов. В данном примере, это компьютеры из Active Directory. |
24 - 29 | Извлекаем по одному сервера, которые были получены в строчке 23. |
25 | Запускаем функцию и передаем ей имя сервера. Результат работы записываем в переменную $UserList |
26 | Условие проверяет наличие значения переменной $UserList |
27 | Если список пользователей есть, добавляем его в массив $AdminList |
31 - 35 | Перебираем массив $AdminList и пополняем список серверов и администраторов для них. |
32 | Создаем переменную, в которую запишем имя сервера. |
33 | Создаем переменную, в которую поместим список пользователей для сервера из строчки 32. |
34 | В переменной $ToCSV находятся строчки для будущего файла. Каждая строчка — имя сервера и перечень администраторов, разделенные точкой с запятой. |
37 - 39 | Проверяем наличие в системе файла, в который хотим поместить результат работы скрипта. Если файл существует, удаляем его. |
41 | Создаем файл выгрузки и помещаем в него список администраторов. |