📁

PowerShell:ファイルSVに個人用フォルダ一括作成&クォータ設定

2021/04/21に公開

オンプレAD環境にあるWindowsSVで構築されたファイルSVに個人用フォルダを一括作成したかったので、PowerShellを書いてみた。

やりたいこと

CSVを読み込んで

  1. ADのユーザー名のフォルダ作成
  2. ユーザーのみのアクセス権付与
  3. クォータの設定

その他
・ADにユーザーがいるか判定
・フォルダ作成、クォータ変更、フォルダ削除をflagで判定

使い方

  1. 「import.csv」の2行目からいれていく
    ※1行目のヘッダーは必要

CSVのレイアウト

import.csv
flag,UserName
n,testuser01
c,testuser02
d,testuser03

flagで処理を判定

flag 説明
n フォルダ作成
c クォータ変更
d フォルダ削除

2.「Folder-Set.ps1」をメモ帳で開いて、作業ディレクトリを指定とクォータのサイズを指定
   
3.「import.csv」、「Folder-Set.ps1」を同じフォルダに置いて、ファイルSVで実行
 
4.フォルダ、アクセス権、クォータが設定されていればOK

事前準備

  1. 共有フォルダ化したいフォルダを作成
  2. 作成したフォルダのアクセス権で、「Users」等の不要なものを削除しておく。
    (AdministratorsとSYSTEMのみにしておけばokかな)
  3. Import-Module FileServerResourceManager するための機能追加
  4. Import-Module ActiveDirectoryするための機能追加

完成したスクリプト

Folder-Set.ps1
Import-Module FileServerResourceManager
Import-Module ActiveDirectory

#作業ディレクトリを指定(最後に[\]必須)
$workdir = "D:\test\"

#クォータのサイズを指定(○○MB、○○GBで指定)
$QuotaSize = 500MB

cd $workdir
    Import-Csv $PSScriptRoot\import.csv -Encoding Default | ForEach-Object{
    $user = $_.UserName
    $targetpath = $workdir + $user
    
    #パラメータで処理分岐
    $switchflag = $_.flag
        switch ( $switchflag ) {
            #フォルダ作成処理
            n {
                #コンソールのエラーを非表示にする
                $ErrorActionPreference = "silentlycontinue"

                #ユーザーがいるか判定。Get-ADUserでエラーだと「NULL」のまま。
                $UserJudg = $NULL
                $UserJudg = Get-ADUser -Identity $user

                #コンソールのエラーを再表示する
                 $ErrorActionPreference = "continue"

                if ( $UserJudg -eq $NULL ){
                    #エラー出力
                    Write-Host -NoNewline $user " はADにいません(n)"
                    Write-Output ""

                    } else {
                    #フォルダの存在判定
                    If(!(test-path $user))
                        {
                        #フォルダの作成
                        New-Item -Path $user -ItemType Directory | Out-Null
    
                        #アクセス権の付与(フルコントロール)
                        icacls $targetpath /grant ${user}:`(OI`)`(CI`)F /t /c /l /q | Out-Null
       
                        #クォータの設定(ハード制限クォータ)
                        New-FsrmQuota -Path $targetpath -Description "個人フォルダサイズ制限" -Size $QuotaSize | Out-Null

                    } else {
                       Write-Host -NoNewline $user " のフォルダはすでにあります(n)"
                       Write-Output ""
                   }
               }
            }

            #クォータの変更(ハード制限クォータ)
            c {
                If((test-path $user)){
                     Set-FsrmQuota -Path $targetpath -Description "個人フォルダサイズ制限" -Size $QuotaSize | Out-Null

                } else {
                    Write-Host -NoNewline $user " のフォルダはありません(c)"
                    Write-Output ""
                }
            }

            #フォルダ削除処理
            d {
                If((test-path $user)){
                    #フォルダの削除(確認あり)
                    Remove-Item -Path $user | Out-Null

                    #フォルダの削除(確認なし)
                    #Remove-Item -Path $user -Force -Recurse  | Out-Null

                } else {
                    Write-Host -NoNewline $user " のフォルダはありません(d)"
                    Write-Output ""
                }
            }
            #flagエラー
            default {
            Write-Host -NoNewline $user " のflagはありません(f)"
            Write-Output ""
             }
        }

参考:アクセス権の確認

アクセスの確認は、「icacls フォルダパス」で確認できる

icacls D:\test\* > access-access-list.txt

grep的なことをしたい場合は、

icacls D:\test\* | findstr "検索したい文字列*" > access-list.txt

Discussion