👥
Active Directory:CSV読み込んでユーザーのOU、所属グループを移動
オンプレAD環境で人事異動処理(OUの移動と所属グループの変更)を楽にするためにCSVを読み込んで異動処理をするPowerShellを書いてみた。
前提条件
- ドメインコントローラーにコンソールかリモートデスクトップでログオンして操作する
- 管理者の PC から操作する場合は、Active Directory モジュールが使えること
- 移動対象OU配下内に同一名のOUが存在しないこと
- 「del」のOUがあること
スクリプトの内容
- 移動情報が記載されたCSVの読み込み
- 対象ユーザーがいるか判定
- 移動先OUがあるか判定
- 移動先OUが「del」の場合は、「del」に異動、ユーザー無効化、所属グループ削除
- 正常なら、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
Import-Module ActiveDirectory
# 読み込むファイルを指定
$CSVFile = "AD_UserMove.csv"
# 移動処理させたいOUを指定
# 例:"OU=User,DC=test,DC=com"
$SearchOU = "OU=〇〇,DC=〇〇,DC=〇〇"
# CSVの読み込み(Shift_JIS)
Import-Csv $CSVFile -Encoding Default | ForEach-Object {
# エラー判定用にデータ取得
# コンソールのエラーを非表示にする
$ErrorActionPreference = "silentlycontinue"
# ユーザーがいるか判定
# Get-ADUserでエラーだと「NULL」のまま
$UserJudg = $NULL
$TargetUser = $_.SamAccountName
$UserJudg = Get-ADUser -Identity $TargetUser
# SearchOU配下に異動先OUがあるか判定
# Get-ADOrganizationalUnitでエラーだと「NULL」のまま
$OUJudg = $NULL
$TargetOU = $_.TargetOU
$OUJudg = Get-ADOrganizationalUnit -Filter 'Name -like $TargetOU' -SearchBase $SearchOU -SearchScope Subtree
# SearchOU配下に追加するGroupがあるか判定
# Get-ADGroupでエラーだと「NULL」のまま
$GroupJudg = $NULL
$TargetGroup = $_.TargetGroup
$GroupJudg = Get-ADGroup -Filter 'Name -like $TargetGroup' -SearchBase $SearchOU -SearchScope Subtree
# コンソールのエラーを再表示する
$ErrorActionPreference = "continue"
# ユーザーがいるか判定
if ($UserJudg -eq $NULL)
{
# エラー出力
Write-Host -NoNewline $TargetUser " はいません"
Write-Output ""
}
else
{
# SearchOU配下に異動先OUがあるか判定
if($OUJudg -eq $NULL)
{
# 異動しない場合(TargetOUが空白の場合)はエラーなし
if($TargetOU -ne "")
{
# TargetOUの打ち間違いエラー出力
Write-Host -NoNewline $TargetUser " の異動先OU 「" $TargetOU "」はありません"
Write-Output ""
}
}
# 異動先が同じOUのとき
elseif($TargetOU -eq $_.UserOU)
{
Write-Host -NoNewline $TargetUser " の異動先OUが同じです"
Write-Output ""
}
# 移動先が「del」のとき
elseif($TargetOU -eq "del")
{
# ユーザー無効化
Set-ADUser -Identity $TargetUser -Enabled $false
# OU移動
Move-ADObject -Identity $UserJudg.DistinguishedName -TargetPath $OUJudg.DistinguishedName
# グループ削除
Remove-ADGroupMember -Identity $_.DelGroup -Members $TargetUser -Confirm:$false
}
else
{
# OU移動
Move-ADObject -Identity $UserJudg.DistinguishedName -TargetPath $OUJudg.DistinguishedName
# グループ削除
Remove-ADGroupMember -Identity $_.DelGroup -Members $TargetUser -Confirm:$false
# Groupがあるか判定
if ($GroupJudg -eq $NULL)
{
# TargetGroupが空白の場合はエラーなし
if($TargetOU -ne "")
{
# エラー出力
Write-Host -NoNewline $TargetUser " の追加Gruop 「" $TargetGroup "」はありません"
Write-Output ""
}
}
else
{
# グループ追加
Add-ADGroupMember -Identity $TargetGroup -Members $TargetUser
}
}
}
}
課題
- 所属グループの削除と追加が1つずつしかできない
- 移動処理させたいOU配下に同一名のOUがあるとエラーになってしまうが、判定していない
参考:AD_UserMove.ps1を実行するbat
powershell -ExecutionPolicy RemoteSigned -File AD_UserMove.ps1 > errorlog.txt 2>&1
exit /b
関連スクリプト
Discussion