👥

Active Directory:CSV読み込んでユーザーのOU・所属グループを異動

に公開
2026/03/13

オンプレAD環境で人事異動処理(OUの移動と所属グループの変更)を楽にするためにCSVを読み込んで異動処理をするPowerShellを書いてみた。

前提条件

  • ドメインコントローラーにコンソールかリモートデスクトップでログオンして操作する
  • 管理者の PC から操作する場合は、Active Directory モジュールが使えること
  • 移動対象OU配下内に同一名のOUが存在しないこと
  • 退職者用のOUがあること

スクリプトの内容

  1. 移動情報が記載されたCSVの読み込み
  2. 対象ユーザーがいるか判定
  3. 移動先OUがあるか判定
  4. 移動先OUが「del」の場合は、退職者用のOUに移動、ユーザー無効化、所属グループ削除
  5. 正常なら、OUの移動、現所属グループ削除、移動後の所属グループ追加

読み込むCSVのレイアウト

文字コードは、Shift_JIS

AD_UserMove.csv
"SamAccountName","DisplayName","UserOU","DelGroup","TargetOU","TargetGroup"
"test-user01","テストユーザー01","testOU01","sec-test01","testou02","sec-test02"

レイアウトの説明

項目 説明 備考
SamAccountName アカウント名 対象ユーザー
DisplayName 表示名 参考情報
UserOU 現在のOU 関連スクリプトで取得したDistinguishedName列
DelGroup 削除したい所属グループ グループ名のみ
TargetOU 移動先のOU OU名のみ
TargetGroup 新規に所属させる所属グループ グループ名のみ

※CSVを作るための基礎情報は、関連スクリプトを参照

完成したスクリプト

AD_UserMove.ps1
<#
.SYNOPSIS
    人事異動CSVに基づく、ADユーザーの属性変更・移動・無効化処理
#>
Import-Module ActiveDirectory

$CSVFile = "AD_UserMove.csv"
# 環境に合わせて以下の変数を書き換えてください
$SearchOU = "OU=〇〇,DC=〇〇,DC=〇〇"
# ※退職者を移動させる専用のOUがあればここに指定(なければ無効化のみ行う)
$DisabledOU = "OU=退職者,DC=〇〇,DC=〇〇" 

# CSVの読み込み
$csvData = Import-Csv $CSVFile -Encoding Default

foreach ($row in $csvData) {
    $TargetUser  = $row.SamAccountName
    $TargetOU    = $row.TargetOU
    $DelGroup    = $row.DelGroup
    $TargetGroup = $row.TargetGroup

    try {
        # 1. ユーザーの存在確認 (-ErrorAction Stop により、見つからない場合は即Catchへ飛ぶ)
        $UserObj = Get-ADUser -Identity $TargetUser -ErrorAction Stop

        # ==========================================
        # ルートA: 退職・アカウント無効化処理 (del)
        # ==========================================
        if ($TargetOU -eq "del") {
            # アカウント無効化
            Set-ADUser -Identity $UserObj -Enabled $false -ErrorAction Stop
            Write-Host "[成功] $($TargetUser): アカウントを無効化しました。" -ForegroundColor Cyan

            # ※退職者用OUへ移動
            Move-ADObject -Identity $UserObj.DistinguishedName -TargetPath $DisabledOU -ErrorAction Stop

            # グループ削除(指定がある場合のみ)
            if (-not [string]::IsNullOrWhiteSpace($DelGroup)) {
                Remove-ADGroupMember -Identity $DelGroup -Members $UserObj -Confirm:$false -ErrorAction Stop
                Write-Host "  └ グループ削除完了: $DelGroup"
            }
            continue # このユーザーの処理はここで完了し、次のユーザーへ
        }

        # ==========================================
        # ルートB: 異動処理 (OU移動・グループ付替)
        # ==========================================
        
        # B-1: OU移動
        if (-not [string]::IsNullOrWhiteSpace($TargetOU) -and $TargetOU -ne $row.UserOU) {
            # -like ではなく -eq (完全一致) を使用
            $OUObj = Get-ADOrganizationalUnit -Filter "Name -eq '$TargetOU'" -SearchBase $SearchOU -SearchScope Subtree
            
            # 同名OUの複数ヒットや存在未確認に対するフェイルセーフ
            if ($null -eq $OUObj) { throw "異動先OU '$TargetOU' が存在しません。" }
            if ($OUObj.Count -gt 1) { throw "異動先OU '$TargetOU' が複数存在し、特定できません。DNで指定する必要があります。" }

            Move-ADObject -Identity $UserObj.DistinguishedName -TargetPath $OUObj.DistinguishedName -ErrorAction Stop
            Write-Host "[成功] $($TargetUser): OU '$TargetOU' へ移動しました。" -ForegroundColor Green
        } else {
            Write-Host "[スキップ] $($TargetUser): OUの移動はありません。" -ForegroundColor DarkGray
        }

        # B-2: グループ削除
        if (-not [string]::IsNullOrWhiteSpace($DelGroup)) {
            Remove-ADGroupMember -Identity $DelGroup -Members $UserObj -Confirm:$false -ErrorAction Stop
            Write-Host "  └ グループ削除完了: $DelGroup" -ForegroundColor Yellow
        }

        # B-3: グループ追加
        if (-not [string]::IsNullOrWhiteSpace($TargetGroup)) {
            $GroupObj = Get-ADGroup -Filter "Name -eq '$TargetGroup'" -SearchBase $SearchOU -SearchScope Subtree
            if ($null -eq $GroupObj) { throw "追加グループ '$TargetGroup' が存在しません。" }

            Add-ADGroupMember -Identity $GroupObj -Members $UserObj -ErrorAction Stop
            Write-Host "  └ グループ追加完了: $TargetGroup" -ForegroundColor Yellow
        }

    } catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException] {
        Write-Error "[エラー] $($TargetUser) はAD上に存在しません。"
    } catch {
        # 予期せぬエラー(権限不足、グループが見つからない等)
        Write-Error "[エラー] $($TargetUser) の処理中に問題発生: $($_.Exception.Message)"
    }
}

課題

  • 所属グループの削除と追加が1つずつしかできない

参考:AD_UserMove.ps1を実行するbat

powershell -ExecutionPolicy RemoteSigned -File AD_UserMove.ps1 >> errorlog.txt 2>&1
exit /b

関連スクリプト

https://zenn.dev/8chikuwa3/articles/9d4d23db5117ca
https://zenn.dev/8chikuwa3/articles/dad9b6372f2985

Discussion