アクセス権の設定を PowerShell で行いたい！


みなさん、こんにちは。
Windows OS にて、GUI 上の操作から、特定のフォルダーにアクセス権をしたい時、
同じような設定を他にある多数のフォルダーや他ユーザーに対しても行いたい...という思いはございませんでしょうか。

今回は、GUI 上で設定した値を PowerShell で確認し、設定を行うコマンドについて参考までに紹介します。


#早く結果が知りたい人へ
```
$変数A = Get-Acl<アクセス権の変更を行うパス> -Audit
$変数B= New-Object System.Security.AccessControl.FileSystemAccessRule(< <アクセス権を付与するユーザー名>, <付与するアクセス権>, "ContainerInherit, ObjectInherit", "None", <許可の設定または拒否の設定>)
$変数A.AddAccessRule($変数B)
Set-Acl <アクセス権の変更を行うパス> -AclObject $変数A
```

#解説が知りたい人へ
今回は、デスクトップ環境上に、GUI でアクセス権を設定するフォルダーを以下の様に作成します。
階層 : C:\ACLfromGUI\ACLfromGUI_001

そして、上記で設定したアクセス権を以下の階層にも同じアクセス権を設定したいとします。
階層 : C:\ACLfromCUI\ACLfromCUI_001

GUI と CUI 部分の名前が違います。

設定したいアクセス権は、以下のようなものとします。
![79C9CBAD-F059-469E-91AE-0D5E8398C811.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2305598/39df850a-249b-c182-e2ea-426600f5f62d.jpeg)


上記の GUI で設定したいアクセス権を、 PowerShell 上から確認すると以下の様になります。

```
Get-Acl "C:\ACLfromGUI\ACLfromGUI_001" -Audit | Format-Table -AutoSize -Wrap
Path           Owner                  Access
----           -----                  ------
ACLfromGUI_001 BUILTIN\Administrators DESKTOP-35D38NA\ACL_TEST_User Allow  Read, Synchronize
                                      BUILTIN\Administrators Allow  FullControl
                                      NT AUTHORITY\SYSTEM Allow  FullControl
                                      BUILTIN\Users Allow  ReadAndExecute, Synchronize
                                      NT AUTHORITY\Authenticated Users Allow  Modify, Synchronize
                                      NT AUTHORITY\Authenticated Users Allow  -536805376
```

ACL_TEST_User には、Read, Synchronize が Allow で付いていますね。
後は、このアクセス権限を Set-ACL でつけてあげます。

流れとしては以下のような感じです。
1. アクセス権を設定したい対象フォルダ―の現在の ACL の設定を取得し、変数 ( GENZAI ) に格納する
2. 追加付与したい ACL の設定を他変数 ( KOREKARA ) に格納する。
3. Set-ACL コマンドで設定する。

よって、以下のコマンドの流れになります。

```
現在の、C:\ACLfromCUI\ACLfromCUI_001 フォルダーの ACL の設定を監査設定を含めて取得し、GENZAI に格納
$GENZAI = Get-Acl "C:\ACLfromCUI\ACLfromCUI_001" -Audit
```

```
GENZAI 変数に格納されている ACL に KOREKARA 変数に入っている ACL の設定内容を格納
$GENZAI.AddAccessRule($KOREKARA)
```

```
KOREKARA の変数に追加付与したい ACL の設定を格納
$KOREKARA = New-Object System.Security.AccessControl.FileSystemAccessRule("DESKTOP-35D38NA\ACL_TEST_User", "Read, Synchronize", "ContainerInherit, ObjectInherit", "None", "Allow")
$GENZAI.AddAccessRule($KOREKARA)
```
注意 : 上記の ACL の "Read , Synchronize" の権限設定は GUI から設定した内容を PowerShell で表示し、把握した。

```
Set-ACL でアクセス権を付与したい先 ( C:\ACLfromCUI\ACLfromCUI_001 ) に GENZAI に格納したアクセス権を追加
Set-Acl “C:\ACLfromCUI\ACLfromCUI_001” -AclObject $GENZAI
```

さあ、GUI で設定した内容と CUI で設定した内容を比較してみましょう。

##GUI で設定した内容
![6D54F856-30B1-48DE-961D-A291DB71DD40.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2305598/6b8f8133-a1cd-b46e-9245-e5cb6b2b7925.jpeg)


##CUI で設定した内容
![9B2B62A8-126B-465E-9DD8-468F0849B0BD.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2305598/c0d0818f-2b70-8589-c982-8073aeca23ab.jpeg)


よって、もし読者の皆様がお使いになる際は、それぞれ以下の様に値を書き直すと良いと思います。

```
$GENZAI = Get-Acl <アクセス権付与したいフォルダーのパス> -Audit
$KOREKARA = New-Object System.Security.AccessControl.FileSystemAccessRule(<アクセス権付与の対象ユーザー名>, <付与するアクセス権の内容>, "ContainerInherit, ObjectInherit", "None", <許可 or 拒否>)
$GENZAI.AddAccessRule($KOREKARA)
Set-Acl <アクセス権付与したいフォルダーのパス> -AclObject $GENZAI
```

今回使用した cmdlet などは以下の公開情報をご参考下さい。

Set-ACL について
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/set-acl?view=powershell-7.2

Get-ACL について
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/get-acl?view=powershell-7.2

FileSystemSecurity.RemoveAccessRule(FileSystemAccessRule) メソッド
https://docs.microsoft.com/ja-jp/dotnet/api/system.security.accesscontrol.filesystemsecurity.removeaccessrule?view=net-6.0