web-dev-qa-db-ja.com

セキュリティ監査のためのローカルユーザーアカウントの追跡

ネットワーク上のすべてのサーバーからのローカルユーザーアカウントのリストを編集したいと思います。これには、ドメインおよび非ドメインのW2K3マシンが含まれます。ネットユーザーを実行し、結果をファイルにパイプするスクリプト?どんな助けでも大歓迎です。どうも

3
Jeff

迅速で汚い方法

このスクリプトを機能させるには、 MicrosoftのPsExec が必要です。同じユーザー名とパスワードで非ドメインメンバーとドメインメンバーのコンピューターに接続できると仮定しています。それが不可能な場合は、お知らせください。スクリプトを少し変更します。

マシン名のリストをmachines.txtに入れて、以下を実行します。

@echo off

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

最終的には、computer-name.txt形式の一連のテキストファイルが作成され、各コンピューターに「NetUser」が出力されます。

ファンシー(tm)ウェイ

これは非常に手間がかかり、出力を解析するのはかなり面倒です。 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
...

グループ情報は必要ないかもしれませんが、後で簡単に除外できます。

異なる資格情報で各マシンに接続する必要がある場合は、私に知らせてください。スクリプトを少し変更します。

3
Evan Anderson

数年前に似たようなことに取り組んだことを覚えています。スクリプトを介してこれを簡単に実行できる方法はおそらく5つありますが、最近SYDIを紹介したので、チェックすることをお勧めします。ローカルのユーザーの監査追跡よりも多くのメリットが得られる可能性があります。

http://sydiproject.com/tools/sydi-audit-localgroups/

サイトからの抜粋:使用シナリオ組織内にいるローカル管理者の数を追跡したい場合があります。おそらく、一部のユーザーは「一時的に」ローカル管理者グループに配置されていますが、提供されるすべての特権で落ち着きました。組織がローカル管理アクセスをまだ許可していない場合でも、このアクセスが許可されているユーザーを白黒で表示できるようにしたい場合があります。パワーユーザーグループは、監視する別のグループにすることができます。

標準化された環境がある場合、クライアントのグループ構造はすべて同じように見えるはずです。このツールを使用して、存在してはならない追加のグループを見つけることができます。

スクリプトの使用他の多くのSYDIツールと同様に、このスクリプトはvbscriptで記述されており、cscript.exeから実行することを目的としています。これを使用するには、SYDIサーバーの出力ファイルへのパスを引数として指定します。

Cscript.exe sydi-audit-localgroups.vbs -xN:\ SYDI\Output

それがどのように機能するか教えてください

最高、ニック

1
Nick O'Neil