📁

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

に公開

オンプレ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
<#
.SYNOPSIS
    CSVのフラグ(n/c/d)に基づき、個人フォルダの作成(権限・クォータ設定含む)・変更・削除を行う。
#>
Import-Module FileServerResourceManager
Import-Module ActiveDirectory

# 【重要】変数の定義(末尾の \ は不要。Join-Pathで安全に結合するため)
$BaseDir   = "D:\test"
$CSVPath   = Join-Path $PSScriptRoot "import.csv"
$QuotaSize = 500MB
$csvData = Import-Csv $CSVPath -Encoding Default

foreach ($row in $csvData) {
    $flag = $row.flag.ToLower().Trim()
    $user = $row.UserName.Trim()
    
    # 処理対象の完全な絶対パスを生成
    $targetPath = Join-Path $BaseDir $user

    try {
        switch ($flag) {
            # ==========================================
            # 新規作成 (n)
            # ==========================================
            "n" {
                Write-Host "処理中(n): $user ..." -NoNewline

                # 1. ユーザー存在確認(厳格な例外処理)
                try {
                    $null = Get-ADUser -Identity $user -ErrorAction Stop
                } catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException] {
                    Write-Host " [失敗]" -ForegroundColor Red
                    Write-Error "  └ AD上にユーザーが存在しません。"
                    continue
                }

                # 2. フォルダ存在確認
                if (Test-Path -LiteralPath $targetPath) {
                    Write-Host " [スキップ] フォルダが既に存在します。" -ForegroundColor DarkGray
                    continue
                }

                # 3. フォルダツリーの一括作成
                # サブフォルダのパスを生成
                $downloadPath = Join-Path $targetPath "download"
                
                # -Force を付与することで、親フォルダ($targetPath)ごと一気に作成する
                New-Item -Path $downloadPath -ItemType Directory -ErrorAction Stop | Out-Null

                # 4. アクセス権の設定 (icacls)
                # 設定対象は親フォルダ($targetPath)のまま。downloadにも自動継承される。
		icacls $targetpath /grant ${user}:`(OI`)`(CI`)F /t /c /l /q | Out-Null

                # 親フォルダおよび配下すべての所有権をユーザー本人に変更する
                icacls $targetPath /setowner $user /T /C /L /Q | Out-Null

                # 5. クォータ設定
                New-FsrmQuota -Path $targetPath -Description "個人フォルダサイズ制限" -Size $QuotaSize -ErrorAction Stop | Out-Null

                Write-Host " [作成完了]" -ForegroundColor Green
            }

            # ==========================================
            # クォータ変更 (c)
            # ==========================================
            "c" {
                Write-Host "処理中(c): $user ..." -NoNewline
                if (Test-Path -LiteralPath $targetPath) {
                    Set-FsrmQuota -Path $targetPath -Description "個人フォルダサイズ制限" -Size $QuotaSize -ErrorAction Stop | Out-Null
                    Write-Host " [変更完了]" -ForegroundColor Green
                } else {
                    Write-Host " [失敗] フォルダが存在しません。" -ForegroundColor Yellow
                }
            }

            # ==========================================
            # フォルダ削除 (d)
            # ==========================================
            "d" {
                Write-Host "処理中(d): $user ..." -NoNewline
                if (Test-Path -LiteralPath $targetPath) {
                    # ※注意: Confirm:$false を外すとプロンプトで止まるため、自動化時はForceとRecurseが必須
                    Remove-Item -LiteralPath $targetPath -Force -Recurse -Confirm:$false -ErrorAction Stop
                    
                    # 削除したのにFSRMクォータ情報だけが残るのを防ぐため、クォータも削除
                    try { Remove-FsrmQuota -Path $targetPath -ErrorAction Stop } catch { }

                    Write-Host " [削除完了]" -ForegroundColor Green
                } else {
                    Write-Host " [失敗] フォルダが存在しません。" -ForegroundColor Yellow
                }
            }

            default {
                Write-Warning "未定義のフラグです: '$flag' (ユーザー: $user)"
            }
        }
    } catch {
        Write-Host " [エラー発生]" -ForegroundColor Red
        Write-Error "詳細: $($_.Exception.Message)"
    }
}

参考:アクセス権の確認

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

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

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

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

Discussion