ネットワーク上のすべてのサーバーからのローカルユーザーアカウントのリストを編集したいと思います。これには、ドメインおよび非ドメインのW2K3マシンが含まれます。ネットユーザーを実行し、結果をファイルにパイプするスクリプト?どんな助けでも大歓迎です。どうも
このスクリプトを機能させるには、 MicrosoftのPsExec が必要です。同じユーザー名とパスワードで非ドメインメンバーとドメインメンバーのコンピューターに接続できると仮定しています。それが不可能な場合は、お知らせください。スクリプトを少し変更します。
マシン名のリストをmachines.txtに入れて、以下を実行します。
@echo off
for /F "delims=" %%i in (machines.txt) do (
psexec \\%%i Net User > %%i.txt
)
最終的には、computer-name.txt形式の一連のテキストファイルが作成され、各コンピューターに「NetUser」が出力されます。
これは非常に手間がかかり、出力を解析するのはかなり面倒です。 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リストと同じ意味を持ちます(つまり、MATCH_LEFTの「IUSR_」は「IUSR_」で始まるユーザーアカウントが報告されないことを意味します)。
テキストファイルからの入力と出力をテキストファイルにリダイレクトするこのスクリプトを呼び出すと(つまり、「cscript script-name.vbs <machines.txt> 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
それがどのように機能するか教えてください
最高、ニック