👥
Active Directory:CSV読み込んでユーザーのOU・所属グループを異動
オンプレAD環境で人事異動処理(OUの移動と所属グループの変更)を楽にするためにCSVを読み込んで異動処理をするPowerShellを書いてみた。
前提条件
- ドメインコントローラーにコンソールかリモートデスクトップでログオンして操作する
- 管理者の PC から操作する場合は、Active Directory モジュールが使えること
- 移動対象OU配下内に同一名のOUが存在しないこと
- 退職者用のOUがあること
スクリプトの内容
- 移動情報が記載されたCSVの読み込み
- 対象ユーザーがいるか判定
- 移動先OUがあるか判定
- 移動先OUが「del」の場合は、退職者用のOUに移動、ユーザー無効化、所属グループ削除
- 正常なら、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
関連スクリプト
Discussion