Отслеживание локальных учетных записей пользователей для аудита безопасности

Я хотел бы составить список учетных записей локальных пользователей со всех серверов в сети. Это будет включать доменные и не доменные машины 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 report.txt"), и вы получите выходные данные в формате TAB с разделителями:

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

Дайте мне знать, как это работает

Бест, Ник

Другие вопросы по тегам