📁
PowerShell:ファイルSVに個人用フォルダ一括作成&クォータ設定
オンプレAD環境にあるWindowsSVで構築されたファイルSVに個人用フォルダを一括作成したかったので、PowerShellを書いてみた。
やりたいこと
CSVを読み込んで
- ADのユーザー名のフォルダ作成
- ユーザーのみのアクセス権付与
- クォータの設定
その他
・ADにユーザーがいるか判定
・フォルダ作成、クォータ変更、フォルダ削除をflagで判定
使い方
- 「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
事前準備
- 共有フォルダ化したいフォルダを作成
- 作成したフォルダのアクセス権で、「Users」等の不要なものを削除しておく。
(AdministratorsとSYSTEMのみにしておけばokかな) - Import-Module FileServerResourceManager するための機能追加
- 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