同僚からの相談内容
社内のActiveDirectoryを運用している同僚からこんな相談を受けました。
- 総務部門にメールで社員の情報(メールアドレスなど)を聞いて、ADのユーザー情報に付与している。
- しかし、必須でない項目ということもあり、ついつい登録を忘れてしまうことがある。
- 忘れなくても、入力ミスなどで誤った情報が入力されている場合がある。
- そもそも総務から提供されている情報が誤っている場合もあり、その場合は再登録が必要。
- こんな単純作業もうしたくない。スクリプト組んで自動化してくれ。
どうやって自動化するか
現在は以下のような運用をしています。
AD担当者が__聞いて__、総務が__答えて__、AD担当者が__登録する__という
人間が介在する作業が多くある状態です。
それを以下のフローにしたいと思います。
このフローなら__人間が介在する作業は総務担当者のメールアドレス入力だけ__になります。
人力を最小限に抑えることが出来るので、__登録ミスが発生するリスクは最小限__になりそうです。
また、PowerShellをタスクスケジューラで組み込めば忘れずに作業してくれます。
実際の流れ
それでは、上記のフロー通りに自動化していこうと思います。
CSVファイルにメールアドレスを記入する
まず、総務担当者に以下のような感じでCSVを作成してもらいます。
A列はADのユーザー名、B列はメールアドレスです。
CSVの内容をADサーバーに登録するPowerShellを作成する
PowerShellスクリプトのコードは以下の通りです。
CSVファイル名や保存パス、ドメイン名などは各自の環境のものを入れてください。
このスクリプトファイルをWindowsサーバー上で日次で定期起動させれば自動化の完成です。
# ADユーザー名とUIDを読み込む
# CSV読み込んで、配列に保存。
$user_array = @()
$uid_array = @()
$file_name = '<CSVのファイル名>'
$folder_path = '<CSVが保存されているディレクトリ>'
$file_path = $folder_path + $file_name
# 読み込むファイルがS-JISの場合は、DefaultでOK
$csv = Import-Csv -encoding Default -Path $file_path
# 配列にぶち込む
foreach($line in $csv) {
$user_array += $line.AD_User
$uid_array += $line.mail
}
# メールを登録していく
for ($i=0; $i -lt $user_array.Length; $i++){
#AD上で実行したいコマンドを文字列に纏める
$cm1 = 'Set-ADUser -Identity '
$cm2 = $user_array[$i]
$cm3 = ' -Replace @{ mail = '
$cm4 = '"' + $uid_array[$i] + '" }'
$cm = $cm1 + $cm2 + $cm3 + $cm4 #AD上で実行したいコマンドの文字列
#Invoke-Command <ドメイン名> -ScriptBlockでADを遠隔実行できる。
#invoke-expressionで、文字列をコマンドとして実行する
#args[0]には$cmが引数として渡される
Invoke-Command <ドメイン名> -ScriptBlock {invoke-expression $args[0]} -ArgumentList $cm
}
今回はメールアドレスの入力にしていますが、
電話番号やWebページなど、色々な項目に対して変更することが可能です。