Я хотел бы составить список учетных записей локальных пользователей со всех серверов в сети. Сюда входят машины 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
Дай мне знать, как это работает
С уважением, Ник