PowerShellで複数のcsvファイルを読み込み、ADユーザのOU移動と無効化を行う

やりたいこと

  • 退職したADユーザーのOUを一括で移動
  • 退職したADユーザーを無効化
  • csvを読み込ませ、バッチでガツンと処理したい

インプット

  • csv形式で以下のようなログファイルが日次で出力されている
  • ファイル名は「ADlog.日付」
更新区分 ID 名前
1(新規)/2(変更)/3(削除) user001 テスト太郎

それでは順を追ってスクリプト作成の経緯を以下に記します。
※実際の環境から固有名詞などを書き換えているので、
 どこかタイポがあったらすみません。

まずはログファイルを1つのファイルにまとめる

  • カレントディレクトリの「logs」フォルダ内にログファイルが大量に吐き出されている想定
Get-Content .\logs\ADlog* > output.csv

まとまったcsvファイルを読み込む

Get-Content .\logs\ADlog* > output.csv
Import-Csv .\output.csv -Header 'FLG','ID','NAME'

更新区分が削除のものを抽出

$DelFLG = 3

Get-Content .\logs\ADlog* > output.csv
Import-Csv .\output.csv -Header 'FLG','ID','NAME' |  Where-Object {$_.FLG -eq $DelFLG }

Foreachで無効化・OU移動

$DelFLG = 3
$TargetOU = "OU=削除,DC=TESTAD,DC=local"

Get-Content .\logs\ADlog* > output.csv
Import-Csv .\output.csv -Header 'FLG','ID','NAME' |  Where-Object {$_.FLG -eq $DelFLG } | ForEach-Object {
    #無効化
    Set-ADUser -Identity $_.ID -Enabled $false

    #OU移動
    $UserDN = (Get-ADUser -Identity $_.ID).distinguishedName
    Move-ADObject -Identity $UserDN -TargetPath $TargetOU
}

ここまででだいたい実装できたものの、以下の懸念

  • 既に存在しないIDに対しての処理って気持ち悪くね?

既存ユーザー有無確認

以下をそのまま使わせてもらいました!
PowershellでActiveDirectoryのユーザーを管理する

$DelFLG = 3
$TargetOU = "OU=削除,DC=TESTAD,DC=local"

Get-Content .\logs\ADlog* > output.csv
Import-Csv .\output.csv -Header 'FLG','ID','NAME' |  Where-Object {$_.FLG -eq $DelFLG } | ForEach-Object {
    $existUser = $NULL
    $existUser = Get-ADUser -Identity $_.ID
    if ($existUser -eq $NULL)
        {
        #処理なし
        }
    else{
        #無効化
        Set-ADUser -Identity $_.ID -Enabled $false

        #OU移動
        $UserDN = (Get-ADUser -Identity $_.ID).distinguishedName
        Move-ADObject -Identity $UserDN -TargetPath $TargetOU
        }
}

もう一声!

  • デバッグ中、コンソールに出力される例外が多いと見づらくね?

完成

$DelFLG = 3
$TargetOU = "OU=削除,DC=TESTAD,DC=local"

Get-Content .\logs\ADlog* > output.csv
Import-Csv .\output.csv -Header 'FLG','ID','NAME' |  Where-Object {$_.FLG -eq $DelFLG } | ForEach-Object {
    # コンソールのエラーを非表示にする
    $ErrorActionPreference = "silentlycontinue"

    $existUser = $NULL
    $existUser = Get-ADUser -Identity $_.ID

    # コンソールのエラーを再表示する
    $ErrorActionPreference = "continue"

    if ($existUser -eq $NULL)
        {
        #処理なし
        }
    else{
        #無効化
        Set-ADUser -Identity $_.ID -Enabled $false

        #OU移動
        $UserDN = (Get-ADUser -Identity $_.ID).distinguishedName
        Move-ADObject -Identity $UserDN -TargetPath $TargetOU
        }
}

参考

PowerShell 関連~PowerShell でテキストデータを CSV として読み込んでデータベースっぽく操作するメモ~
move users to a new OU, getting information from .csv file.
PowershellでActiveDirectoryのユーザーを管理する
PowerShellコンソールエラーを非表示にする方法

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.