Назад | Перейти на главную страницу

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

Я хотел бы составить список учетных записей локальных пользователей со всех серверов в сети. Сюда входят машины W2K3 с доменом и без него. Сценарий для запуска сетевого пользователя и передачи результатов в файл? Любая помощь приветствуется. Спасибо

Быстрый и грязный путь

Тебе понадобиться PsExec от Microsoft чтобы этот скрипт работал. Я предполагаю, что вы можете подключиться к компьютерам, не являющимся членами домена, и компьютерам, входящим в домен, с одним и тем же именем пользователя и паролем. Если это невозможно, дайте мне знать, и я немного изменю сценарий.

Поместите список имен машин в файл machines.txt и запустите:

@echo off

for /F "delims=" %%i in (machines.txt) do (
 psexec \\%%i NET USER > %%i.txt
)

В результате вы получите кучу текстовых файлов в формате имя-компьютера.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 имя-сценария.vbs <machines.txt> report.txt»), и вы получите вывод с разделителями табуляции в формате:

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

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

С уважением, Ник