ファイル共有のアクセス許可を取得する

おなかがすいた。

Windows7に入ってるレベルのPowerShellでファイル共有のアクセス許可を取得してくるスクリプト
ちょっときたないけどメモに残しておこうと思います。

これ、NTFSアクセス許可ではなく"ファイル共有アクセス許可"を取りに行く目的のスクリプトで、あまりネットで事例を見かけなくて苦労した。

ポイントは"Get-WmiObject win32_LogicalShareSecuritySetting"でファイル共有のセキュリティ設定をとってくるところ。
LogicalShareSecuritySettingで取れない管理共有とかは結果に出てこない。

$shares = Get-WmiObject win32_Share 
$result= @()
foreach ($Share in $Shares){
    
    $ShareSecuritySetting =  Get-WmiObject win32_LogicalShareSecuritySetting  `
        -Filter ("Name='"+$Share.Name+"'") 
        
    if(!($ShareSecuritySetting)){
        continue
    }
    $acls = $ShareSecuritySetting.GetSecurityDescriptor().Descriptor.DACL
    
    foreach($ACL in $ACLS){
        $Obj = @{}
        
        $obj["共有名"] = $Share.Name
        $obj["パス"]   = $Share.Path
    
        $User = $ACL.Trustee.Name
        if(!($user)){$user = $ACL.Trustee.SID}

        $Domain = $ACL.Trustee.Domain
        switch($ACL.AccessMask)
        {
            2032127 {$Perm = "Full Control"}
            1245631 {$Perm = "Change"}
            1179817 {$Perm = "Read"}
        }
        $Obj["アカウント"] = "$Domain\$user"
        $Obj["パーミッション"] = "$Perm"
        
        $result += New-Object PSObject -Property $Obj
    }
}
$result  | Format-List
 

実行するとこんな感じ。

(前略)
アカウント     : lasty\bounoki
パーミッション : Full Control
共有名         : test_share1
パス           : R:\test_share1

アカウント     : lasty\bounoki
パーミッション : Full Control
共有名         : test_share2
パス           : R:\test_share2

アカウント     : BUILTIN\Administrators
パーミッション : Full Control
共有名         : test_share2
パス           : R:\test_share2

アカウント     : lasty\motie
パーミッション : Change
共有名         : test_share2
パス           : R:\test_share2

参考にしたのはこちらのサイト。
http://www.waynezim.com/2014/03/powershell-file-sharing-permissions-report/