PowerShellでファイルのセキュリティ情報を取得する

ファイルのプロパティ画面のセキュリティタブの情報をPowerShellで取得する方法を以下に記します。
以下のキャプチャーは、ワードパットのセキュリティタブになります。

01.png

動作確認環境

PS C:\> (Get-WmiObject Win32_OperatingSystem).Caption
Microsoft Windows 10 Pro
PS C:\> ($PSVersionTable).PSVersion.toString()
5.1.17134.228

セキュリティタブ情報を取得する(その1)

セキュリティタブ情報を取得する場合、以下のような手順になります。
CSV化などをしたい場合は、「セキュリティタブ情報を取得する(その2)?」を参照してください。

ファイルのアクセス情報を取得する

  1. Get-Itemコマンドレットを使用し、対象ファイルを指定します。
    PS C:\> $f = Get-Item C:\windows\write.exe
  2. GetAccessControlメソッドを呼び出します。
    PS C:\> $a = $f.GetAccessControl()
  3. AccessToStringスクリプトプロパティを指定すると以下のようにセキュリティタブに表示されている情報が表示されます。
    PS C:\> $a.AccessToString
    上記コマンドを実行したときの出力です。
    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

上記の出力を確認してみます。

ディレクトリのアクセス情報を取得する

ディレクトリも上記同様の操作で情報を取得することができます。

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
03.png

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 = "";...
<省略>

AccessToStringDefinitionを見ると、スクリプトが設定されています。
このスクリプトは何が書かれているか確認してみます。
Get-Itemで指定したファイルはなんでもいいです。オブジェクトを受け取るために指定しただけです。

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で取得する例を以下に記します。
CSV化など簡単にできます。 以下の構文のスクリプトを実行すると、指定したファイル・ディレクトリのアクセス情報を取得できます。

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
04.png

以上、PowerShellでファイルやディレクトリのアクセス情報を取得する方法でした。



トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS