雑記+備忘録

OS中心の技術情報と趣味について(最近は主に将棋)。備忘録なのでここに書かれたことを試すのは自己責任でお願いします。

PowerShellで共有フォルダ作成、アクセス権設定(後編)

フォルダを作成、共有フォルダにし、NTFSアクセス権で初期状態で付与されている「Users」に対する権限を削除、 適切なドメイングループに「更新」の権限を与える

の、適切なドメイングループに「更新」の権限を与える部分です。

<後半 適切なドメイングループに「更新」の権限を与える>

##### 変数
# 対象フォルダパス
$nW_path = "C:\share3"

# 権限対象ユーザーもしくはグループ
$strUorG = "HOGE\Group01"

# 権限種別
$objFSR = [System.Security.AccessControl.FileSystemRights]::Modify

# 子フォルダや子オブジェクトへの継承
$objIF = ([System.Security.AccessControl.InheritanceFlags]::ObjectInherit `
   -bor [System.Security.AccessControl.InheritanceFlags]::ContainerInherit)

# 継承の別要素
$objPF = [System.Security.AccessControl.PropagationFlags]::None

# 許可もしくは拒否
$objACT = [System.Security.AccessControl.AccessControlType]::Allow


# 権限オブジェクトの生成
$objPM = ($strUorG, $objFSR, $objIF, $objPF, $objACT)

$objAccessRule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule $objPM


# 現在のフォルダアクセス権を取得
$objACL = Get-Acl $nW_path

# 権限オブジェクトをフォルダアクセス権オブジェクトへセット
$objACL.SetAccessRule($objAccessRule)

# 変更されたフォルダアクセス権オブジェクトを実フォルダへセット
$objACL | Set-Acl $nW_path


5. 「更新」の権限付与
幹となる枠組みとしては、
 (1) 権限対象ユーザーもしくはグループ
 (2) 権限種別
 (3) 子フォルダや子オブジェクトへの継承
 (4) 継承の別要素
 (5) 許可もしくは拒否
の5個の要素(引数)を持つ権限オブジェクトを
フォルダアクセス権オブジェクトへセットし、
実フォルダへ反映させる、となります。

(1)についてはユーザーもしくはグループを文字列の型で指定すればよいですが、
(2)~(5)はそれぞれ適切な型のオブジェクトとして指定する必要があります。

参考URL(ありがとうございます)
PowerShellでファイルやフォルダのアクセス権を設定する - YOMON8.NET

(2)権限種別
「System.Security.AccessControl.FileSystemRights」型です。
「Modify」はGUIで設定する「更新」の権限にあたります。
他の一覧については以下の記事にまとまっています。(ありがとうございます)
Windows ACE の AccessMask(マスク)ビットフラグの対応関係 - Qiita
内部ではビット列のようなので、ビット和(-bor)等をうまく使って複数の権限を組み合わせられます。
上記記事の内容ですが、以下に引用します。

ListDirectory                  :        1  =                      1  =  0x00000001  ~  2^ 0
ReadData                       :        1  =                      1  =  0x00000001  ~  2^ 0
WriteData                      :        2  =                     10  =  0x00000002  ~  2^ 1
CreateFiles                    :        2  =                     10  =  0x00000002  ~  2^ 1
CreateDirectories              :        4  =                    100  =  0x00000004  ~  2^ 2
AppendData                     :        4  =                    100  =  0x00000004  ~  2^ 2
ReadExtendedAttributes         :        8  =                   1000  =  0x00000008  ~  2^ 3
WriteExtendedAttributes        :       16  =                  10000  =  0x00000010  ~  2^ 4
Traverse                       :       32  =                 100000  =  0x00000020  ~  2^ 5
ExecuteFile                    :       32  =                 100000  =  0x00000020  ~  2^ 5
DeleteSubdirectoriesAndFiles   :       64  =                1000000  =  0x00000040  ~  2^ 6
ReadAttributes                 :      128  =               10000000  =  0x00000080  ~  2^ 7
WriteAttributes                :      256  =              100000000  =  0x00000100  ~  2^ 8
Write                          :      278  =              100010110  =  0x00000116  ~  2^ 8
Delete                         :    65536  =      10000000000000000  =  0x00010000  ~  2^16
ReadPermissions                :   131072  =     100000000000000000  =  0x00020000  ~  2^17
Read                           :   131209  =     100000000010001001  =  0x00020089  ~  2^17
ReadAndExecute                 :   131241  =     100000000010101001  =  0x000200A9  ~  2^17
Modify                         :   197055  =     110000000110111111  =  0x000301BF  ~  2^17
ChangePermissions              :   262144  =    1000000000000000000  =  0x00040000  ~  2^18
TakeOwnership                  :   524288  =   10000000000000000000  =  0x00080000  ~  2^19
Synchronize                    :  1048576  =  100000000000000000000  =  0x00100000  ~  2^20
FullControl                    :  2032127  =  111110000000111111111  =  0x001F01FF  ~  2^20

「System.Security.AccessControl.FileSystemRights」型の詳細な説明記事です。
FileSystemRights 列挙型 (System.Security.AccessControl)

(3) 子フォルダや子オブジェクトへの継承
「System.Security.AccessControl.InheritanceFlags」型です。
GUIで一般的な「このフォルダー、サブフォルダーおよびファイル」を実現するには
「ObjectInherit」と「ContainerInherit」を「-bor」でビット和にする必要があります。
「System.Security.AccessControl.InheritanceFlags」型の詳細な説明記事です。
InheritanceFlags 列挙型 (System.Security.AccessControl)

(4) 継承の別要素
「System.Security.AccessControl.PropagationFlags」型です。
(3)で継承を行ったときに必要な要素です。今一つ「None」でOKなロジックを理解できていません。
「System.Security.AccessControl.InheritanceFlags」型の詳細な説明記事です。
PropagationFlags 列挙型 (System.Security.AccessControl)

(5) 許可もしくは拒否
「System.Security.AccessControl.AccessControlType」型です。
これは簡単、アクセス権の「許可」もしくは「拒否」です。
「System.Security.AccessControl.AccessControlType」型の詳細な説明記事です。
AccessControlType 列挙型 (System.Security.AccessControl)


以上です。この5個でワンセットとなり、
複数のグループやユーザーを割り当てる場合は、1つずつセットを作成、
割り当てていきます。