Get-ChildItem
指定したパス以下のファイルやフォルダーを一覧・検索するPowerShellコマンドレット。-Recurseで再帰的に列挙でき、-Filterや-LiteralPath、LastWriteTimeによる絞り込みと組み合わせて使う。
Get-ChildItemコマンドレット
Get-Acl
ファイルやフォルダーのセキュリティ記述子を取得し、既定でDACLのアクセス制御エントリ一覧(Accessプロパティ)を返すコマンドレット。SDDL形式でも取得できる。
Get-Aclコマンドレット
PowerShell
オブジェクトパイプラインとエラー処理機構を持つ、Microsoftが最も堅牢で最新のWindows自動化に推奨するコマンドラインシェル兼スクリプト言語。
Measure-Object
パイプラインを流れるオブジェクトの件数・合計・平均・最大・最小を集計するPowerShellのコマンドレット。
走査漏れリスク
アクセス拒否やパス長超過などにより、対象がファイルサーバー棚卸しの列挙・集計結果から漏れてしまうリスク。数えられなかった場所は「ゼロ」ではなく「不明」として扱う必要がある。
調査漏れ
MAX_PATH(パス長260文字)制限
Windows APIのパス長上限が260文字であるという制限。レジストリのLongPathsEnabledとアプリ側のlongPathAware宣言の両方が揃わない限り多くのWin32関数に適用され、超えるパスでは列挙が失敗することがある。
LastAccessTime(最終アクセス日時)
ファイルが最後に読まれた日時を示すプロパティ。NTFSでは性能上の理由から更新が既定で無効化・システム管理されている環境が多く、実際に読まれていても更新されないことがある。
最終アクセス日時
古いファイル(未使用ファイル)の判定
ファイルサーバーの棚卸しで、長期間更新・利用されていないファイルを一覧化し、削除候補の材料にする作業。
LastWriteTime(最終更新日時)
ファイルの内容が最後に変更された日時を示すプロパティ。ファイルサーバー棚卸しにおける「古いファイル」判定の基準として推奨される。
最終更新日時
fsutil
NTFSボリュームの低レベルな照会・設定を行うコマンドラインツール。ファイルのエクステント照会、8.3短縮名の設定、USNジャーナル操作、リパースポイント照会など多数のサブコマンドを持つ。
Get-FileHash
ファイルのハッシュ値(既定SHA256)を計算し、配布物やバックアップ、重複候補の内容が同一かを確認できるPowerShellのコマンドレット。
セキュリティ記述子
ファイルやフォルダーごとに付く、所有者・DACL・SACLをまとめて保持する構造。Get-Aclが取得するのはこれである。
DACL(随意アクセス制御リスト)
誰に何を許可・拒否するかを列挙する、セキュリティ記述子内のアクセス制御リスト。Get-AclのAccessプロパティで見えるのはこの中身である。
ACE(アクセス制御エントリ)
DACLの1行に相当するエントリで、IdentityReference(誰が)・FileSystemRights(何ができるか)・AccessControlType(許可/拒否)・IsInherited(継承か直接付与か)を持つ。
icacls
DACLの表示・変更を行うコマンドラインツール。/saveでACLをファイルへ保存し/restoreで復元でき、/grant・/remove・/resetなどのオプションを持つ。
Set-Acl
取得したセキュリティ記述子をモデルとして対象のACLを変更するコマンドレット。-WhatIf/-Confirmに対応する。
Set-Aclコマンドレット
ACLの棚卸し・レポート化
誰がどこに何の権限を持っているかを一覧化し、CSVなどの台帳にまとめる調査作業。
ACLの変更作業
棚卸しと部門確認を経たうえで行う、フォルダー・ファイルのアクセス許可(DACL)の変更作業。
隔離→観察→削除の運用
削除の前に対象ファイルを日付入りの隔離フォルダーへ元の階層を保ったまま移し、台帳に記録して一定期間観察してから削除する運用手順。
隔離ワークフロー
移動時のアクセス許可継承
オブジェクトは移動先の親フォルダーから既定でアクセス許可を継承するが、唯一の例外が同じボリューム内の別フォルダーへの移動で、この場合だけ元のアクセス許可がそのまま保持される。
Move-Itemの権限継承
UNCパス
\\サーバー名\共有名\...の形式で共有フォルダーの実体を指す、Windowsのユニバーサル命名規則によるパス表記。
\\サーバー名\共有名
エラー1219(ERROR_SESSION_CREDENTIAL_CONFLICT)
同じログオンセッションから同じサーバーへ異なるユーザー名で複数の接続を張ろうとしたときに返る、by design(仕様)のエラー。
PowerShellはGet-ChildItemでファイルサーバーの項目を再帰的に列挙できる
PowerShellはMeasure-Objectでファイルサイズなどを集計できる
容量調査ではGet-ChildItemで再帰的にファイルを列挙してから、その結果をMeasure-Objectで合計する
-ErrorAction SilentlyContinueで列挙を継続すると、アクセス拒否されたフォルダーの中身は集計・列挙から漏れる
260文字(MAX_PATH)を超えるパスでは、ツールによって列挙が失敗し走査結果に欠けが生じることがある
NTFSでは最終アクセス日時の更新が既定で無効化・システム管理されている環境が多く、実際に読まれていても更新されないため、古いファイル判定の基準には使うべきでない
最後に内容が変更された日時であるLastWriteTimeを、古いファイル判定の基準として使う
古いファイルの一覧化は、Get-ChildItemで対象ファイルを再帰列挙したうえでLastWriteTimeによる絞り込みを行うため、Get-ChildItemによる列挙を前提とする
最終アクセス日時の更新の有効/無効は、fsutil behaviorのdisablelastaccessパラメーターとレジストリ値NtfsDisableLastAccessUpdateで制御される
PowerShellはGet-FileHashで重複ファイルの候補をハッシュ値の一致で抽出できる
ファイル・フォルダーのセキュリティ記述子はGet-Aclコマンドレットで取得・確認できる
DACLは、ファイル・フォルダーごとに付くセキュリティ記述子の中に保持される
ACE(アクセス制御エントリ)はDACLの中に1行ずつ並ぶ
DACLはicaclsコマンドで表示・変更できる
DACLはGet-Aclで取得したセキュリティ記述子を編集し、Set-Aclで適用することでも変更できる
Get-Aclは結果がオブジェクトなのでフィルタ・CSV化が容易で、調査・レポート用途の第一候補になる
icaclsは/saveでバックアップを取り/restoreで戻せるため、定型的な権限変更の第一候補になる
ルールをコードで組み立てる必要がある複雑な条件付き変更にはSet-Aclを使う
同じボリューム内の移動ではアクセス許可が継承されず元のまま残る例外があるため、隔離後にicacls /resetで継承既定へ戻す運用が必要になる
隔離先を元と同じボリュームにする(記事が勧める構成)場合、隔離作業はアクセス許可が継承されず元のまま残るという例外を踏まえて設計する必要がある(別ボリュームへ移す場合は移動先の継承をそのまま受けるため、この考慮は不要)
UNCパス越しに同じサーバーへ複数のユーザー名で接続しようとすると、2つ目の接続がエラー1219(ERROR_SESSION_CREDENTIAL_CONFLICT)で失敗する
大規模走査でUNCパス越しにGet-ChildItemを再帰実行すると、ファイル1つごとのメタデータ取得がネットワーク往復になり所要時間が桁で変わるため、可能ならファイルサーバー上またはPowerShell Remotingでの実行が推奨される
隔離後の権限が想定どおりかは、移動後に数件をGet-Aclで確認することで検証できる