やりたいこと
- 退職した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移動
- OUの移動はDN(distinguishedName)で指定しないといけないので、どうやってMove-ADObjectに渡そうか悩んでいたら、同じ悩みを持つ同士を発見。
move users to a new OU, getting information from .csv file.
$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コンソールエラーを非表示にする方法