ディレクトリ設定をスクリプトで実施しよう

はじめに

共通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文を追加することで権限の組み合わせは追加可能です

いいね (この記事が参考になった人の数:1)
(↑参考になった場合はハートマークを押して評価お願いします)
読み込み中...

注意事項・免責事項

※技術情報につきましては投稿日時点の情報となります。投稿日以降に仕様等が変更されていることがありますのでご了承ください。

※公式な技術情報の紹介の他、当社による検証結果および経験に基づく独自の見解が含まれている場合がございます。

※これらの技術情報によって被ったいかなる損害についても、当社は一切責任を負わないものといたします。十分な確認・検証の上、ご活用お願いたします。

※当サイトはマイクロソフト社によるサポートページではございません。パーソルプロセス&テクノロジー株式会社が運営しているサイトのため、マイクロソフト社によるサポートを希望される方は適切な問い合わせ先にご確認ください。
 【重要】マイクロソフト社のサポートをお求めの方は、問い合わせ窓口をご確認ください