PowerShellによるイベントログ情報取得

Windowsのファイルシステムのうち、NTFSではフォルダやファイルに対してアクセス許可(アクセス権、アクセス規制とも)を設定できます。PowerShellはこうしたアクセス許可の確認、設定機能も装備しています。サーバーのシステム管理においては、ユーザーの権限に応じてフォルダやファイルのアクセス許可の範囲を制限する必要があるため、こうしたアクセス許可の管理は非常に重要です。

まず、アクセス許可の設定を取得するには、Get-Aclコマンドレットを使用します。

ACL

WindowsのNTFSでは、各ディレクトリごとにACL(Access Control List)を使ってファイルのアクセス許可を管理します。

まず、Get-Aclをそのまま実行すると、カレントディレクトリのアクセス許可設定情報をオブジェクトとして出力します。Get-Aclの出力結果は、Format-List(省略形fl)コマンドレットで整形するといいでしょう。

Get-Acl | fl

カレントディレクトリのアクセス許可設定。

ディレクトリのパス(Path)、所有者(Owner)、所有者のグループ(Group)、アクセス許可が設定されているユーザーとその許可内容のリスト(Access)などを表示します。

パス(Path)の表示が、「Microsoft.PowerShell.Core\FileSystem::~」となることにも着目してください。PowerShellでは伝統的なファイルシステムだけでなく、プロバイダの切り替えによってさまざまなパスを扱えるので、ファイルシステムのパスにはファイルシステムであることを明記する表示になります。

特定のファイルやフォルダの情報を表示するときは、次のように実行します。

Get-Acl  ファイルやフォルダのパス

ファイル sample.txt のアクセス許可情報を取得。

Get-Aclコマンドレットで得られる情報は、基本的にファイルやフォルダのプロパティの[セキュリティ]タブで表示・設定する情報です。

ファイル sample.txt のプロパティウィンドウの[セキュリティ]タブ。

sample.txtの[セキュリティ]タブの[詳細設定]ボタンをクリックした詳細ウィンドウ。

監査情報の取得

既定の設定では監査に関する設定情報を取得しません。監査の設定情報も取得するときは、-Auditスイッチパラメータを指定してください。また、取得した監査情報を表示するには、オブジェクトの.Auditプロパティを使用します。

(1)監査情報を含めて情報を取得するとき

Get-Acl  ファイルやフォルダのパス -Audit

(2)監査情報を表示するとき

(Get-Acl ファイルやフォルダのパス -Audit).Audit

(3)一度変数に代入してから情報を活用するとき

$変数名 = Get-Acl ファイルやフォルダのパス -Audit
$変数名.Audit

ファイル sample.txt のアクセス許可情報を監査設定情報も含めて取得し、$aclに代入。監査情報を表示。

アクセス許可の詳細

アクセス許可をさらに詳細に表示するには、Get-Aclで取得したオブジェクトの.Accessプロパティを活用します。アクセス権(FileSystemRights)、許可の種類(AccessControlType)、ユーザーアカウント(IdentityReference)などを表示します。

(1)直接表示するとき

( Get-Acl  ファイルまたはフォルダのパス ).Access

(2)一度変数に代入してから情報を活用するとき

$acl = Get-Acl  ファイルやフォルダのパス
$acl.Access

ファイルsample.txtのアクセス情報を表示。

表示フォーマット

Get-Aclで取得したオブジェクトをそのまま表示すると、Format-Tableで整形したのと同様の表示になります。Format-Listで整形したほうが見やすいので、前の例ではパイプラインを使ってFormat-Listで整形しました。

一方、Get-Aclで取得したオブジェクトの中でも、.Accessプロパティや.Auditプロパティを表示するときは、初期設定でFormat-Listで整形したように表示します。

条件に合ったファイル・フォルダを表示する

アクセス許可の条件を指定して、条件に合うファイルやフォルダを表示する例を紹介します。

たとえば、Everyoneに対してフルコントロールを設定しているファイルを、カレントディレクトリ以下から検索する例を紹介します。

(1)Get-ChildItem(省略形gci)コマンドレットで、カレントディレクトリ以下のファイル情報を取得し、変数itemsに保存します。itemsの内容は、Get-ChildItemが取得したファイル・フォルダ情報の配列となります。

$items = gci -Recurse

変数itemsに、カレントディレクトリ以下のファイル・フォルダ情報を取得。-Recurseはサブディレクトリも含めるオプションパラメータ。

(2)items配列変数の個々の情報(つまり1個1個のファイルやフォルダ)について、Get-Aclコマンドレットでアクセス許可情報を取得し、Everyoneにフルコントロールが設定されているかどうかを確認しつつ、表示します。配列変数の個々の情報の評価を繰り返すには、foreach構文を使います。

foreach ( $i in $items )
{
    $acl = Get-Acl $i.Fullname
    foreach ($a in $acl.Access)
    {
        if (($a.FileSystemRights -eq "FullControl") -and ($a.AccessControlType -eq "Allow") `
        -and ($a.IdentityReference -eq "Everyone"))
        {
            $i.Fullname
        }
    }
}

ここではforeachによるループ(繰り返し処理)が二重になっています。

外側のループは、Get-ChildItemで取得した1つ1つのファイルを評価するための繰り返しです。このループの中で取得した各ファイルの情報、変数aclも、複数のユーザーアカウントの情報が含まれている配列オブジェクトです。内側のループは、aclのアカウント情報を1つずつ評価し、フルコントロール(FullControl)、許可(Allow)、ユーザーアカウントがEveryoneのものを出力します。

カレントディレクトリ以下で、Everyoneにフルコントロールを許可しているファイル、フォルダのフルパスを表示。

コマンドラインから入力するには長いので、実際にはスクリプトファイルとして作成した方が現実的でしょう。

ファイルだけ、あるいはフォルダだけにたいして処理を行いたいときは、内側のループに入る前に、$i.PSIsContainerをチェックします。

パターン例

if ($i.PSIsConainger) { #フォルダに対してだけ操作
    foreach () {}   #内側のループ
}

パターン例

if (! $i.PSIsConainger) {   #ファイルに対してだけ操作
    foreach () {}   #内側のループ
}

また、このプログラムの二重ループの内側ブロックに書き加えれば、単に条件にあったファイルやフォルダを出力するだけでなく、そのファイルのアクセス許可を変更したり、移動したりといった操作も可能です。

foreach

上のプログラムで使ったforeachは、コマンドレットのForEach-Object(省略形foreach、%)とは異なりますので注意してください。ifやfor、whileと同様のステートメント(構文指示単語)です。

次回は、アクセス許可の設定をPowerShellで変更する方法を紹介します。