web-dev-qa-db-ja.com

ユーザーのフォルダアクセス許可を一覧表示する

複数のフォルダー内の複数のサブフォルダーにアクセスできるドメインのユーザーがいます。彼の権利はかなり細かく定義されていました。現在、彼は退職しますが、契約したリソースとして会社で働き続けます。

私は彼がアクセス権を持っていたすべてのフォルダを見つけて、彼のアクセス許可を取り消し、次に別のアクセス許可のセットを設定する必要があります。

特定のユーザーのすべてのNTFSアクセス許可を一覧表示するツール(フリーウェアが望ましい)はありますか?私はSysinternalsのAccessEnumを試してみましたが、リストをユーザー名でフィルタリングすることはできず、私にとっては役に立ちません。私もCACLSを見てきましたが、私が知る限り、ユーザーではなくファイルで並べられたアクセス許可が表示されます。

何か案は?

14
imagodei

私は自分の質問に対する解決策を見つけました。とてもシンプルでクリーンだと思います。 subinaclをインストールして、コマンドプロンプトから1行実行するだけです。

ここからsubinaclをダウンロードできます 。正式にはWindows 2000、Windows XP、Windows Server 2003でのみサポートされていますが、Windows Vista、Windows Server 2008、およびWindows 7でも動作するはずです。

次に、コマンドプロンプトから次のコマンドを実行します。

subinacl /testmode /noverbose /outputlog=c:\TEXTFILENAME.TXT /subdirectories=directoriesonly X:\*.* /findsid=DOMAIN\username

ここでX:はスキャンしているドライブで、usernameはリストする権限を持つユーザー。スキャンには時間がかかる場合があり、結果はTEXTFILENAME.TXTにあります。

スイッチ/ noverboseを使用すると、アクセス許可のコンパクトなリストが表示されます-基本的に、ユーザーがアクセスできるディレクトリが表示されます(アクセスマスクと一部の時には重宝するかもしれない他のもの).

OpenOffice Calc を使用してリストをインポートし、カスタムフィルターを適用して、+ FILEで始まる行のみをフィルター処理しました。これらの行には、ユーザーがアクセスできるディレクトリが含まれています。これは、単純なツールを使用して、最終的に関連情報のみを取得する方法です。

多くの場合、継承は親ディレクトリで有効になっているため、アクセス許可を調整するためにアクセスする必要がある実際のディレクトリ数は、通常、リスト自体よりも大幅に少なくなります。

3
imagodei

これは、(おそらく注意が必要ですが)ユーザー "someuser"がアクセスできるすべてのフォルダーを検索するように見えます。この例では、Cドライブで、組み込みのWindows icaclsコマンドを使用しています。

icacls c:\*. /findsid someuser /t /c /l

/ tは、ディレクトリを再帰的に実行するように指示するために必要です。/cは、エラーが発生した場合でも続行するように指示するために必要です。/lは、シンボリックリンク(存在する場合)で機能します。 (最後の1つはLであり、これらのフラグは大文字でも小文字でもかまいません。)

*.は、「ファイルではなくディレクトリを探す」と言う方法としてDOSの古参者に認識されます。もちろん、フォルダではなくファイルを検索する場合は、*.*に変更します。もちろん、任意のドライブをポイントするか、任意のフォルダから実行して、ドライブ/フォルダパスを省略して、そのフォルダのみを基準に検索します。

OPと同じ答えを探したところ、このエントリが見つかりましたが、ダウンロード可能なツールに基づくオファーしか表示されずに困っていました。他の人と同じように、私は組み込みの何かを使用することを好み、このicaclsツールでそれを見つけました。

また、Windows Server 2012、2008、およびWindows 7で動作することを確認したので、Server 2003、Windows 8などでも動作するようです。

結果のリストは、次のように、行ごとに示されたフォルダになります。

SIDが見つかりました:c:\ somedir\somesubdir。

トラバースされている一部のディレクトリへのアクセス権を持たないユーザーとしてこれを実行すると、次のような結果にエラーがインターリーブされることに注意してください。

c:\ System Volume Information:アクセスが拒否されました。

また、ドライブ全体を検索している場合、そのようなエラーが何百も発生し、ドライブ内で結果を見つけるのが難しくなります。

答えは管理者としてコマンドラインを実行することであると考える人もいますが、以前は非表示になっていたフォルダーをたどることになるため、このようなエラーがはるかに多く発生します。

これらのエラーを非表示にすることに興味があった場合、エラーが除外されないため、findコマンドを使用して、成功した結果(「SIDが見つかりました」を参照するもの)のみをパイプ処理することはできません。検索コマンドへのパイプで。代わりに、すべてのエラーを削除する場合は、2>nul:を使用して、エラーストリーム(stderr)を「ビットバケット」にリダイレクトするというあいまいなトリックを使用する必要があります。したがって、上記の例は次のようになります。

icacls c:\*. /findsid someuser /t /c /l 2>nul:

そのようなエラーを生成したフォルダーのいくつかは、現在は非表示になっていますが、名前付きの「someuser」がアクセスできるが、YOUはアクセスできないフォルダーである可能性があることに注意してください。したがって、これらのエラーを単に無視することについて、2度考えたい場合があります。しかし、必要に応じて、それを行うことができます。

その可能性はこの答えの価値を潜在的に制限していると私は理解しています。物事に精通している人が私の答えをさらに拡張または修正したい場合は、歓迎します。

13
charlie arehart

他のものをダウンロードする必要なくPowerShellを使用できます。これはv2.0以降で機能します。

$ReferenceAccountName = 'DOMAIN\Username'
[string[]]$SearchDirectories = @('X:\SomeDirectory', 'F:\AnotherDirectory')

foreach ($RootDir in $SearchDirectories) {
    $DirACL = Get-Acl -Path $RootDir
    foreach ($ACL in $DirACL.Access){
        if ($ACL.IdentityReference -like $ReferenceAccountName){
            Write-Output $RootDir
        }
    }
    foreach ($Directory in (Get-ChildItem -Path $RootDir -Recurse | `
                            Where-Object -FilterScript {$_.Attributes `
                            -contains 'Directory'})){
        $DirACL = Get-Acl -Path $Directory.FullName
        foreach ($ACL in $DirACL.Access){
            if ($ACL.IdentityReference -like $ReferenceAccountName){
                Write-Output $Directory.FullName
            }
        }
    }
}

PowerShell v3以降で使用できるものほどきれいではありませんが、動作します。これは、文字列形式で見つかったディレクトリのリストを出力します。

それらをオブジェクトとして簡単に出力し、それらを使用して作業を続けることができます(CSVファイルにエクスポートし、エントリを見つけたら削除し、情報でチケットを更新します...など)。出力呼び出し。

6
Jon