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 ファイルやフォルダのパス
Get-Aclコマンドレットで得られる情報は、基本的にファイルやフォルダのプロパティの[セキュリティ]タブで表示・設定する情報です。
監査情報の取得
既定の設定では監査に関する設定情報を取得しません。監査の設定情報も取得するときは、-Auditスイッチパラメータを指定してください。また、取得した監査情報を表示するには、オブジェクトの.Auditプロパティを使用します。
(1)監査情報を含めて情報を取得するとき
Get-Acl ファイルやフォルダのパス -Audit
(2)監査情報を表示するとき
(Get-Acl ファイルやフォルダのパス -Audit).Audit
(3)一度変数に代入してから情報を活用するとき
$変数名 = Get-Acl ファイルやフォルダのパス -Audit
$変数名.Audit
アクセス許可の詳細
アクセス許可をさらに詳細に表示するには、Get-Aclで取得したオブジェクトの.Accessプロパティを活用します。アクセス権(FileSystemRights)、許可の種類(AccessControlType)、ユーザーアカウント(IdentityReference)などを表示します。
(1)直接表示するとき
( Get-Acl ファイルまたはフォルダのパス ).Access
(2)一度変数に代入してから情報を活用するとき
$acl = Get-Acl ファイルやフォルダのパス
$acl.Access
表示フォーマット
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
(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のものを出力します。
コマンドラインから入力するには長いので、実際にはスクリプトファイルとして作成した方が現実的でしょう。
ファイルだけ、あるいはフォルダだけにたいして処理を行いたいときは、内側のループに入る前に、$i.PSIsContainerをチェックします。
パターン例
if ($i.PSIsConainger) { #フォルダに対してだけ操作
foreach () {} #内側のループ
}
パターン例
if (! $i.PSIsConainger) { #ファイルに対してだけ操作
foreach () {} #内側のループ
}
また、このプログラムの二重ループの内側ブロックに書き加えれば、単に条件にあったファイルやフォルダを出力するだけでなく、そのファイルのアクセス許可を変更したり、移動したりといった操作も可能です。
foreach
上のプログラムで使ったforeachは、コマンドレットのForEach-Object(省略形foreach、%)とは異なりますので注意してください。ifやfor、whileと同様のステートメント(構文指示単語)です。
次回は、アクセス許可の設定をPowerShellで変更する方法を紹介します。