PowerShellでファイルのセキュリティ情報を取得する †ファイルのプロパティ画面のセキュリティタブの情報をPowerShellで取得する方法を以下に記します。 以下のキャプチャーは、ワードパットのセキュリティタブになります。 関連記事 †動作確認環境 †PS C:\> (Get-WmiObject Win32_OperatingSystem).Caption Microsoft Windows 10 Pro PS C:\> ($PSVersionTable).PSVersion.toString() 5.1.17134.228 セキュリティタブ情報を取得する(その1) †セキュリティタブ情報を取得する場合、以下のような手順になります。 ファイルのアクセス情報を取得する †
上記の出力を確認してみます。
ディレクトリのアクセス情報を取得する †ディレクトリも上記同様の操作で情報を取得することができます。 PS C:\> (Get-Item C:\Windows).GetAccessControl().AccessToString CREATOR OWNER Allow 268435456 NT AUTHORITY\SYSTEM Allow 268435456 NT AUTHORITY\SYSTEM Allow Modify, Synchronize BUILTIN\Administrators Allow 268435456 BUILTIN\Administrators Allow Modify, Synchronize BUILTIN\Users Allow -1610612736 BUILTIN\Users Allow ReadAndExecute, Synchronize NT SERVICE\TrustedInstaller Allow 268435456 NT SERVICE\TrustedInstaller Allow FullControl APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES Allow ReadAndExecute, Synchronize APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES Allow -1610612736 APPLICATION PACKAGE AUTHORITY\制限されたすべてのアプリケーション パッケージ Allow ReadAndExecute, Synchronize APPLICATION PACKAGE AUTHORITY\制限されたすべてのアプリケーション パッケージ Allow -1610612736 AccessToStringのスクリプトを調べてみる †AccessToStringには、実際にどのようなスクリプトが仕込まれているか確認してみます。 今回、以下のように AccessToString を使用しました。 PS C:\> $d = Get-Item C:\Windows\ PS C:\> $d.GetAccessControl() | Get-Member TypeName: System.Security.AccessControl.DirectorySecurity Name MemberType Definition ---- ---------- ---------- Access CodeProperty System.Security.AccessControl.AuthorizationRuleCollection Access{get=... Group CodeProperty System.String Group{get=GetGroup;} Owner CodeProperty System.String Owner{get=GetOwner;} Path CodeProperty System.String Path{get=GetPath;} Sddl CodeProperty System.String Sddl{get=GetSddl;} <省略> AccessToString ScriptProperty System.Object AccessToString {get=$toString = "";... <省略> AccessToStringのDefinitionを見ると、スクリプトが設定されています。 PS C:\> ((Get-Item C:\Windows\).GetAccessControl() | Get-Member | ? { $_.Name -eq "AccessToString" }).Definition System.Object AccessToString {get=$toString = ""; $first = $true; if ( ! $this.Access ) { return "" } foreach($ace in $this.Access) { if($first) { $first = $false; } else { $tostring += "`n"; } $toString += $ace.IdentityReference.ToString(); $toString += " "; $toString += $ace.AccessControlType.ToString(); $toString += " "; if($ace -is [System.Security.AccessControl.FileSystemAccessRule]) { $toString += $ace.FileSystemRights.ToString(); } elseif($ace -is [System.Security.AccessControl.RegistryAccessRule]) { $toString += $ace.RegistryRights.ToString(); } } return $toString;;} 上記の通り、スクリプトにより、アクセス情報を取得し表示しているのがスクリプトからわかります。 セキュリティタブ情報を取得する(その2) †GetAccessControl().Accessで取得する例を以下に記します。 PS C:\> (Get-Item "C:\Windows\write.exe").GetAccessControl().Access FileSystemRights : ReadAndExecute, Synchronize AccessControlType : Allow IdentityReference : NT AUTHORITY\SYSTEM IsInherited : False InheritanceFlags : None PropagationFlags : None FileSystemRights : ReadAndExecute, Synchronize AccessControlType : Allow IdentityReference : BUILTIN\Administrators IsInherited : False InheritanceFlags : None PropagationFlags : None <省略> 実際に必要そうな項目をSelect-Objectで指定した場合の出力です。 PS C:\> (Get-Item "C:\Windows\write.exe").GetAccessControl().Access | Select-Object IdentityReference, AccessControlType, FileSystemRights IdentityReference AccessControlType FileSystemRights ----------------- ----------------- ---------------- NT AUTHORITY\SYSTEM Allow ReadAndExecute, Synchronize BUILTIN\Administrators Allow ReadAndExecute, Synchronize BUILTIN\Users Allow ReadAndExecute, Synchronize NT SERVICE\TrustedInstaller Allow FullControl APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES Allow ReadAndExecute, Synchronize APPLICATION PACKAGE AUTHORITY\制限されたすべてのアプリケーション パッケージ Allow ReadAndExecute, Synchronize ここまで出力されれば、あとは以下のような感じでCSV出力が可能です。 PS C:\> (Get-Item "C:\Windows\write.exe").GetAccessControl().Access | Select-Object IdentityReference, AccessControlType, FileSystemRights | Export-Csv -Encoding default $HOME\Desktop\ace.csv 以上、PowerShellでファイルやディレクトリのアクセス情報を取得する方法でした。 |