この記事は更新から24ヶ月以上経過しているため、最新の情報を別途確認することを推奨いたします。
はじめに
共通PCのキッティングを行う際に、用途に併せてディレクトリを作成することが多々あるかと思います。また、そのディレクトリは利用するユーザに合わせてアクセス権を付与するといったことも後々の作業として想定されます。1つや2つのフォルダであれば手作業でも良いですが、何十台も1台当たり10個以上、しかも階層ごとに権限を細かくしたいなどの要望があると手作業で作成は大変ですしミスが起こりやすいです。そこで本稿ではディレクトリ設定をPowerShellで実施する方法をご紹介します。
準備
今回はオンプレミスAD(A1)とそのADに参加しているサーバ(S1)を使用します。
事前準備としてA1には権限を割り当てる以下のユーザおよびユーザグループがあることとします
名前 | 種類 |
testuser | ユーザー |
testusers | セキュリティグループ |
つづいて、作成するフォルダのリストを作成します
CSVファイルに以下のフォーマットで記載してください
ファイル名:list.csv
A1:path
B1:permission
C1:authority
A2~の列:作成するフォルダの絶対パス
B2~の列:A列で指定したパスに権限を付与するユーザもしくはグループ(ドメイン\名前)※1
C2~の列:B列で指定したユーザもしくはグループに付与する権限※1,2
下の図のように途中に空白の行があっても問題ありません
※1:フォルダを作成するだけの場合は空白で問題ありません(5行目)
※2:権限の組み合わせ指定する為、CSVのシートでは組み合わせに対応する数字を記載します
今回のサンプルでは上記のC列に当たるauthorityは
1:変更権限(下位フォルダに継承有)
2:読み取り権限のみ(下位フォルダに継承有)
3:フルアクセス(下位フォルダに継承有)
としています。
ディレクトリを作成する
以下のスクリプトをS1で実行します(PowerShell)
ただし、list.csvの配置場所の指定が必要の為こちらは変更してください
function ACL_Full($user,$directory){
$user
$acl = Get-acl $directory
$Permission = ($user,'FullControl','ContainerInherit,ObjectInherit','None','Allow')
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $Permission
$acl.SetAccessRule($accessRule)
$acl | Set-Acl $directory
}
function ACL_RXWM ($user,$directory){
$user
$acl = Get-acl $directory
$Permission = ($user,'Read','ContainerInherit,ObjectInherit','None','Allow')
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $Permission
$acl.SetAccessRule($accessRule)
$Permission = ($user,'ReadAndExecute','ContainerInherit,ObjectInherit','None','Allow')
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $Permission
$acl.SetAccessRule($accessRule)
$Permission = ($user,'Write','ContainerInherit,ObjectInherit','None','Allow')
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $Permission
$acl.SetAccessRule($accessRule)
$Permission = ($user,'Modify','ContainerInherit,ObjectInherit','None','Allow')
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $Permission
$acl.SetAccessRule($accessRule)
$acl | Set-Acl $directory
}
function ACL_R ($user,$directory){
#$user='BUILTIN\'+$user
$user
$acl = Get-acl $directory
$Permission = ($user,'Read','ContainerInherit,ObjectInherit','None','Allow')
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $Permission
$acl.SetAccessRule($accessRule)
$acl | Set-Acl $directory
}
function makedirectory ($list){
if(Test-Path $list.path){}
else{mkdir $list.path}
}
function setpermission($list){
if($list.permission){
switch($list.authority){
1 {ACL_RXWM($list.permission)($list.path)}
2 {ACL_R($list.permission)($list.path)}
3 {ACL_Full($list.permission)($list.path)}
default{}
}
}
}
$list = Import-Csv "<listcsvの配置場所>\list.csv"
$i=0
while ($i -lt $list.length) {
$uselist=$list[$i]
if([string]::IsNullOrEmpty($uselist.path)){}
else{
if(Test-Path $uselist.path) {}
else {mkdir $uselist.path}
setpermission($uselist)
}
$i++
}
上記のスクリプトを実行すると
before
after
その他のディレクトリも作成されており、適切な権限が付与されていました。
まとめ
ディレクトリの作成をスクリプトで実施しました。
上記のスクリプトを修正することで権限割り当ても柔軟に実施可能です。
大量のディレクトリ構成を実施する際には是非活用してみてください
追伸
サンプルのスクリプトでは
function ACL_Full
等で各権限の設定を実施しています
この関数内の
$Permission = ($user,’FullControl’,’ContainerInherit,ObjectInherit’,’None’,’Allow’)
を上手く修正することで任意の権限や継承の有無なども調整可能です。
詳しくは以下の弊社ブログも参考ください
【PowerShell】フォルダーのアクセス権制御
また、権限の組み合わせを増やす場合はfunction ACL_Fullのような関数を追加し、
function setpermission
のswich文を追加することで権限の組み合わせは追加可能です