👥

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

2021/03/15に公開

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

前提条件

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

スクリプトの内容

  1. 移動情報が記載されたCSVの読み込み
  2. 対象ユーザーがいるか判定
  3. 移動先OUがあるか判定
  4. 移動先OUが「del」の場合は、「del」に異動、ユーザー無効化、所属グループ削除
  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
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

関連スクリプト

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

Discussion