はじめに
前回テスト用のユーザを作成したので、今回はファイルサーバの移行用のデータを作成します。
※本記事は下記のファイルサーバ移行検証の一部です。
データ作成
テスト用のフォルダとテキストファイルを作成します。データ移行の範囲にNTFSアクセス権が含まれることがほとんどかと思うので、データ作成後にアクセス権も付与します。
フォルダ作成
以下のスクリプトで、フォルダを作成します。「E:\share」内に作成していますが、適宜PATHを変更してください。実行後、直下に10個のフォルダが作成され、さらにその配下に100個のフォルダが作成されます(合計1000個)。
# 共有フォルダのパス
$shareFolderPath = "E:\share"
# 10個のフォルダを作成するループ
for ($i = 1; $i -le 10; $i++) {
$folderName = "level1folder{0:d2}" -f $i
$folderPath = Join-Path -Path $shareFolderPath -ChildPath $folderName
New-Item -Path $folderPath -ItemType Directory -Force
Write-Host "Created folder: $folderPath"
}
# 10個のフォルダを作成するループ
for ($i = 1; $i -le 10; $i++) {
$level1FolderName = "level1folder{0:d2}" -f $i
$level1FolderPath = Join-Path -Path $shareFolderPath -ChildPath $level1FolderName
# 100個のサブフォルダを作成するループ
for ($j = 1; $j -le 100; $j++) {
$level2FolderName = "level2folder{0:d2}" -f $j
$level2FolderPath = Join-Path -Path $level1FolderPath -ChildPath $level2FolderName
New-Item -Path $level2FolderPath -ItemType Directory -Force
Write-Host "Created folder: $level2FolderPath"
}
}
ファイル作成
次に先ほど作成したフォルダの配下にファイルを作成します。作成するファイル数は、1から3個のうち、ランダムな個数が作成されます。
# 共有フォルダのパス
$shareFolderPath = "E:\share"
# ファイル名のインデックス
$fileIndex = 1
# 共有フォルダ内のすべてのフォルダに対して処理を行う関数
function CreateRandomFilesRecursively($folderPath) {
# フォルダ内のランダムな数のファイルを作成する
$fileCount = Get-Random -Minimum 1 -Maximum 3
for ($i = 1; $i -le $fileCount; $i++) {
$fileName = "test{0:d4}_{1:d4}.txt" -f $folderIndex, $fileIndex
$filePath = Join-Path -Path $folderPath -ChildPath $fileName
New-Item -Path $filePath -ItemType File -Force
Write-Host "Created file: $filePath"
$global:fileIndex++
}
# サブフォルダに対して再帰的に処理を行う
Get-ChildItem -Path $folderPath -Directory | ForEach-Object {
CreateRandomFilesRecursively $_.FullName
}
}
# 共有フォルダ内のすべてのフォルダに対して関数を呼び出す
CreateRandomFilesRecursively $shareFolderPath
アクセス権設定(AD環境用)
作成したフォルダとファイルにアクセス権を付与します。事前に作成しているfileuser01から50までのユーザに対して権限を付与します。また、アクセス権と付与されるユーザはランダムになるように設定します。ここまで入り組んだ設定をする必要はないのかもしれませんが、検証なので試しに設定してみました。
なお、「$domainUser = “jasm.ricecake24book.com\$userName”」というパラメータがある通り、ドメインユーザを指定しています。ドメイン環境ではない場合は末尾に紹介していますので、環境に応じて利用してください。
# 共有フォルダのパス
$shareFolderPath = "E:\share"
# ユーザーの数
$userCount = 50
# 権限の種類
$permissions = @("FullControl", "Modify", "ReadAndExecute", "Read", "Write")
# すべてのフォルダに対して処理を行うループ
for ($i = 1; $i -le 10; $i++) {
$level1FolderName = "level1folder{0:d2}" -f $i
$level1FolderPath = Join-Path -Path $shareFolderPath -ChildPath $level1FolderName
# ランダムなユーザーと権限を選択
$randomUsers = Get-Random -InputObject (1..$userCount) -Count (Get-Random -Minimum 1 -Maximum $userCount)
$randomPermissions = Get-Random -InputObject $permissions -Count (Get-Random -Minimum 1 -Maximum $permissions.Count)
# 権限を追加
$acl = Get-Acl -Path $level1FolderPath
foreach ($randomUser in $randomUsers) {
foreach ($randomPermission in $randomPermissions) {
$userName = "fileuser{0:d2}" -f $randomUser
$domainUser = "jasm.ricecake24book.com\$userName"
$ntAccount = New-Object System.Security.Principal.NTAccount($domainUser)
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule($ntAccount, $randomPermission, "Allow")
$acl.AddAccessRule($rule)
Write-Host "Granted $($randomPermission) permission to $($domainUser) for folder $($level1FolderPath)"
}
}
Set-Acl -Path $level1FolderPath -AclObject $acl
for ($j = 1; $j -le 100; $j++) {
$level2FolderName = "level2folder{0:d2}" -f $j
$level2FolderPath = Join-Path -Path $level1FolderPath -ChildPath $level2FolderName
# ランダムなユーザーと権限を選択
$randomUsers = Get-Random -InputObject (1..$userCount) -Count (Get-Random -Minimum 1 -Maximum $userCount)
$randomPermissions = Get-Random -InputObject $permissions -Count (Get-Random -Minimum 1 -Maximum $permissions.Count)
# 権限を追加
$acl = Get-Acl -Path $level2FolderPath
foreach ($randomUser in $randomUsers) {
foreach ($randomPermission in $randomPermissions) {
$userName = "fileuser{0:d2}" -f $randomUser
$domainUser = "jasm.ricecake24book.com\$userName"
$ntAccount = New-Object System.Security.Principal.NTAccount($domainUser)
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule($ntAccount, $randomPermission, "Allow")
$acl.AddAccessRule($rule)
Write-Host "Granted $($randomPermission) permission to $($domainUser) for folder $($level2FolderPath)"
}
}
Set-Acl -Path $level2FolderPath -AclObject $acl
# フォルダ内のファイルにもランダムなアクセス許可を追加する
$files = Get-ChildItem -Path $level2FolderPath -File
foreach ($file in $files) {
$randomUsers = Get-Random -InputObject (1..$userCount) -Count (Get-Random -Minimum 1 -Maximum $userCount)
$randomPermissions = Get-Random -InputObject $permissions -Count (Get-Random -Minimum 1 -Maximum $permissions.Count)
$acl = Get-Acl -Path $file.FullName
foreach ($randomUser in $randomUsers) {
foreach ($randomPermission in $randomPermissions) {
$userName = "fileuser{0:d2}" -f $randomUser
$domainUser = "jasm.ricecake24book.com\$userName"
$ntAccount = New-Object System.Security.Principal.NTAccount($domainUser)
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule($ntAccount, $randomPermission, "Allow")
$acl.AddAccessRule($rule)
Write-Host "Granted $($randomPermission) permission to $($domainUser) for file $($file.FullName)"
}
}
Set-Acl -Path $file.FullName -AclObject $acl
}
}
}
実行結果
実行結果の一部を紹介します。share配下に10個のフォルダを作成しています。

作成されたフォルダの配下に、さらに100個のフォルダを作成しています。

アクセス権もランダムに付与されています。

アクセス権設定(WORKGROUP環境用)
以下はWORKGROUP(AD環境ではない)用のスクリプトです。AD環境用と大差はないです。
# 共有フォルダのパス
$shareFolderPath = "E:\share"
# ユーザーの数
$userCount = 50
# 権限の種類
$permissions = @("FullControl", "Modify", "ReadAndExecute", "Read", "Write")
# すべてのフォルダに対して処理を行うループ
for ($i = 1; $i -le 10; $i++) {
$level1FolderName = "level1folder{0:d2}" -f $i
$level1FolderPath = Join-Path -Path $shareFolderPath -ChildPath $level1FolderName
# ランダムなユーザーと権限を選択
$randomUsers = Get-Random -InputObject (1..$userCount) -Count (Get-Random -Minimum 1 -Maximum $userCount)
$randomPermissions = Get-Random -InputObject $permissions -Count (Get-Random -Minimum 1 -Maximum $permissions.Count)
# 権限を追加
$acl = Get-Acl -Path $level1FolderPath
foreach ($randomUser in $randomUsers) {
foreach ($randomPermission in $randomPermissions) {
$permission = "fileuser{0:d2}" -f $randomUser
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule($permission, $randomPermission, "Allow")
$acl.AddAccessRule($rule)
Write-Host "Granted $($randomPermission) permission to $($permission) for folder $($level1FolderPath)"
}
}
Set-Acl -Path $level1FolderPath -AclObject $acl
for ($j = 1; $j -le 100; $j++) {
$level2FolderName = "level2folder{0:d2}" -f $j
$level2FolderPath = Join-Path -Path $level1FolderPath -ChildPath $level2FolderName
# ランダムなユーザーと権限を選択
$randomUsers = Get-Random -InputObject (1..$userCount) -Count (Get-Random -Minimum 1 -Maximum $userCount)
$randomPermissions = Get-Random -InputObject $permissions -Count (Get-Random -Minimum 1 -Maximum $permissions.Count)
# 権限を追加
$acl = Get-Acl -Path $level2FolderPath
foreach ($randomUser in $randomUsers) {
foreach ($randomPermission in $randomPermissions) {
$permission = "fileuser{0:d2}" -f $randomUser
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule($permission, $randomPermission, "Allow")
$acl.AddAccessRule($rule)
Write-Host "Granted $($randomPermission) permission to $($permission) for folder $($level2FolderPath)"
}
}
Set-Acl -Path $level2FolderPath -AclObject $acl
# フォルダ内のファイルにもランダムなアクセス許可を追加する
$files = Get-ChildItem -Path $level2FolderPath -File
foreach ($file in $files) {
$randomUsers = Get-Random -InputObject (1..$userCount) -Count (Get-Random -Minimum 1 -Maximum $userCount)
$randomPermissions = Get-Random -InputObject $permissions -Count (Get-Random -Minimum 1 -Maximum $permissions.Count)
$acl = Get-Acl -Path $file.FullName
foreach ($randomUser in $randomUsers) {
foreach ($randomPermission in $randomPermissions) {
$permission = "fileuser{0:d2}" -f $randomUser
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule($permission, $randomPermission, "Allow")
$acl.AddAccessRule($rule)
Write-Host "Granted $($randomPermission) permission to $($permission) for file $($file.FullName)"
}
}
Set-Acl -Path $file.FullName -AclObject $acl
}
}
}
以上でテスト用データ作成ができました。次はデータコピーを実施します。

