【Windows】ファイルサーバ移行検証_AD環境ではない(WORKGROUP)場合でのアクセス権インポート

PowerShell

はじめに

本記事ではNTFSアクセス権をインポートする方法を紹介します。前回の記事でアクセス権をエクスポートしたので、今回はエクスポートされたファイルを使用してインポートする方法を紹介します。

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

構成

既存ファイルサーバ(データのコピー元
ホスト名:filesv-win-01
IPアドレス:172.16.1.137
OS:WindowsServer 2022

新規ファイルサーバ(データのコピー先)
ホスト名:filesv-win-02
IPアドレス:172.16.1.138
OS:WindowsServer 2022

活用できる場面

タイトルの通りですが、ADが存在しない環境下に構築されたファイルサーバの移行に活用できると考えます。AD環境であればNTFSアクセス権ごとデーターコピーできますが、WORKGROUPではアクセス権のコピーはできません。(同じ名前のユーザーを双方の環境に作成しても、コピー先では「不明なアカウント」となります。

AD環境でもないのに、多くのアクセス権を移行する必要がある場面に出会う可能性は少ないと思いますが、やるとなった場合を想定して動作検証用としてまとめてみました。

インポート用のスクリプト

以下のスクリプトを実行することで、アクセス権を設定します。インポートするCSVは「$data = Import-Csv -Path “C:\work\imort-data.csv”」で指定しています。インポートするCSVファイルを「imort-data.csv」という名前に変更する必要があります。

# CSVファイルからデータをインポートする
$data = Import-Csv -Path "C:\work\imort-data.csv"

# 各行のデータを処理し、対応するフォルダまたはファイルのアクセス権を変更する
foreach ($row in $data) {
    $folder = $row.Folder  # フォルダのパス
    $fileName = $row.FileName  # ファイル名
    $identityReference = $row.IdentityReference  # アクセス権を適用するユーザーまたはグループ
    $fileSystemRights = $row.FileSystemRights  # ファイルシステムの権限
    $accessControlType = $row.AccessControlType  # アクセス許可のタイプ

    # IdentityReference が CREATOR OWNER の場合はスキップする
    if ($identityReference -eq "CREATOR OWNER") {
        Write-Host "Skipping CREATOR OWNER permission for $($folder)"
        continue
    }

    # ファイル名が空の場合はフォルダに対するアクセス権の変更と解釈
    if ([string]::IsNullOrEmpty($fileName)) {
        $path = $folder
    } else {
        $path = Join-Path -Path $folder -ChildPath $fileName
    }

    # 対応するフォルダまたはファイルのACLを取得する
    $acl = Get-Acl -Path $path

    # 新しいアクセス許可ルールを作成する
    $rule = New-Object System.Security.AccessControl.FileSystemAccessRule(
        $identityReference,        # ユーザーまたはグループ
        $fileSystemRights,         # ファイルシステムの権限
        $accessControlType         # アクセス許可のタイプ
    )

    # ACLにアクセス許可ルールを追加する
    $acl.SetAccessRule($rule)

    # 対応するフォルダまたはファイルのACLを設定する
    Set-Acl -Path $path -AclObject $acl
}

なお、インポートする場合はデフォルトで設定されているものはインポートしないことをお勧めします。

できる限りのアクセス権をエクスポートできるようにしてますが、特殊なアクセス権まで含めると、まったく同じアクセス権をエクスポートできていないようです。そのままインポートしてしまうと、本来同じ設定であるはずが、余計な設定が入ることがあります。(差分となっている設定は、問題なくインポートできます)

実際の現場で使えるのかという観点について

検証を通してスクリプトを何度も試しましたが、エクスポート時のCSV生成にある程度の時間を要しました。実際の現場での作業を想定すると、アクセス権なしの状態でデータコピーした後に、最終的なアクセス権をエクスポート、インポートを実行するとなれば、相応の時間が想定されます。

あくまでもアクセス権の移行を検討する際の参考程度にとどめていただいた方がよろしいかと思います。

最後に既存ファイルサーバのホスト名やIPアドレスを変更する場合は変更します。