【Windows】ファイルサーバ移行検証_テスト用データ作成

PowerShell

はじめに

前回テスト用のユーザを作成したので、今回はファイルサーバの移行用のデータを作成します。

※本記事は下記のファイルサーバ移行検証の一部です。

データ作成

テスト用のフォルダとテキストファイルを作成します。データ移行の範囲に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
        }
    }
}

以上でテスト用データ作成ができました。次はデータコピーを実施します。

AD環境の場合

WORKGROUP環境の場合