Отслеживание локальных учетных записей пользователей для аудита безопасности
Я хотел бы составить список учетных записей локальных пользователей со всех серверов в сети. Это будет включать доменные и не доменные машины W2K3. Скрипт для запуска net user и передачи результатов в файл? Любая помощь приветствуется. Спасибо
2 ответа
Быстрый и Грязный Путь
Вам понадобится PsExec от Microsoft, чтобы этот скрипт работал. Я предполагаю, что вы можете подключаться к компьютерам, не входящим в домен и входящим в домен, с одинаковыми именем пользователя и паролем. Если это невозможно, дайте мне знать, и я немного изменю сценарий.
Поместите список имен машин в machines.txt и запустите:
@echo off
for /F "delims=" %%i in (machines.txt) do (
psexec \\%%i NET USER > %%i.txt
)
В итоге вы получите набор текстовых файлов в формате computer-name.txt с выводом "NET USER" на каждом компьютере.
Причудливый (тм) путь
Это довольно быстро и грязно, и вывод будет довольно болезненным для анализа. Вот причудливый скрипт в VBScript:
Option Explicit
Dim dictGroupsToIgnore, dictUsersToIgnore, objNetwork, strComputer
Dim colUsers, colGroups, objGroup, objUser
' Debugging
Const DEBUGGING = True
' Constants for comparison of accounts to ignore list
Const MATCH_EXACT = 1
Const MATCH_LEFT = 2
Set dictGroupsToIgnore = CreateObject("Scripting.Dictionary")
' dictGroupsToIgnore.Add "Name of group you want to ignore (matching left only)", MATCH_LEFT
' dictGroupsToIgnore.Add "Name of group you want to ignore", MATCH_EXACT
' Accounts to ignore during copying
Set dictUsersToIgnore = CreateObject("Scripting.Dictionary")
' dictUsersToIgnore.Add "Name of user you want to ignore (matching left only)", MATCH_LEFT
' dictUsersToIgnore.Add "Name of user you want to ignore", MATCH_EXACT
' Should this account be ignored
Function IgnoreObject(Name, dictNames)
Dim strToIgnore
IgnoreObject = False
For Each strToIgnore in dictNames
' Match Exact
If (dictNames.Item(strToIgnore) = MATCH_EXACT) and (UCase(Name) = UCase(strToIgnore)) Then
IgnoreObject = True
Exit Function
End If
' Match left
If (dictNames.Item(strToIgnore) = MATCH_LEFT) and (Left(UCase(Name), Len(strToIgnore)) = UCase(strToIgnore)) Then
IgnoreObject = True
Exit Function
End If
Next' strToIgnore
End Function
' Main
Set objNetwork = CreateObject("Wscript.Network")
While NOT WScript.StdIn.AtEndOfStream
strComputer = WScript.StdIn.ReadLine
' Get accounts on source computer and loop through them, copying as necessary
Set colUsers = GetObject("WinNT://" & strComputer)
colUsers.Filter = Array("user")
For Each objUser In colUsers
If IgnoreObject(objUser.Name, dictUsersToIgnore) = False Then
WScript.Echo strComputer & Chr(9) & "user" & Chr(9) & objUser.Name
End If
Next ' objUser
' Get groups on source computer and loop through them, copying as necessary
Set colGroups = GetObject("WinNT://" & strComputer)
colGroups.Filter = Array("group")
' Put user into destination groups
For Each objGroup In colGroups
If IgnoreObject(objGroup.Name, dictGroupsToIgnore) = False then
For Each objUser In objGroup.Members
WScript.Echo strComputer & Chr(9) & "group" & Chr(9) & objGroup.Name & Chr(9) & "member" & Chr(9) & objUser.Name
Next ' objUser
End If
Next 'objGroup
Wend ' WScript.StdIn.AtEndOfStream
Я включил некоторые функции, чтобы "игнорировать" группы или пользователей тоже.
Добавьте имена групп, которые не следует сообщать в список dictGroupsToIgnore (как показано в сценарии). MATCH_EXACT означает, что имя группы соответствует точно. MATCH_LEFT означает, что будет сопоставляться только самая левая часть имени группы (т. Е. Представьте, что после совпадения имени есть "*").
Добавьте любые имена пользователей, о которых не следует сообщать в список dictUsersToIgnore (как показано в сценарии тоже). MATCH_EXACT и MATCH_LEFT имеют те же значения, что и в списке dictGroupsToIgnores (т. Е. "IUSR_" с MATCH_LEFT означает, что любая учетная запись пользователя, начинающаяся с "IUSR_", не будет сообщаться).
Вызовите этот скрипт, перенаправляя ввод из текстового файла и вывод в текстовый файл (то есть "cscript script-name.vbs
computer_name user username
computer_name group groupname member member_1_name
computer_name group groupname member member_2_name
computer_name group groupname member member_3_name
...
Возможно, вам не понадобится информация о группе, но ее будет легко отфильтровать позже.
Если вам нужно подключиться к каждой машине с разными учетными данными, дайте мне знать, и я немного изменю сценарий.
Я помню, как работал над чем-то похожим несколько лет назад. Вероятно, есть 5 способов сделать это с помощью сценария, однако недавно я познакомился с SYDI, и я рекомендую вам проверить его, это может принести больше преимуществ, чем просто отслеживание аудита пользователей локально.
http://sydiproject.com/tools/sydi-audit-localgroups/
Отрывок с сайта: сценарии использования Возможно, вы захотите отследить, сколько локальных администраторов у вас в организации, возможно, некоторые пользователи были помещены в группу локальных администраторов "временно", но теперь имеют все привилегии, которые она предоставляет. Даже если ваша организация еще не запрещает локальный административный доступ, вы все же можете захотеть увидеть черно-белое изображение, которым пользователям был предоставлен этот доступ. Группа "Опытные пользователи" может быть другой группой, которую вы хотите отслеживать.
Если у вас стандартизированная среда, структура вашей группы на ваших клиентах должна выглядеть одинаково. Вы можете использовать инструмент, чтобы найти дополнительные группы, которых там быть не должно.
Использование скрипта Как и многие другие инструменты SYDI, этот скрипт написан на vbscript и предназначен для запуска из cscript.exe. Чтобы использовать его, вы указываете путь к выходным файлам SYDI-сервера:
Cscript.exe sydi-audit-localgroups.vbs -xN: \ SYDI \ Output
Дайте мне знать, как это работает
Бест, Ник