none
ADに追加したユーザーの確認 RRS feed

  • 質問

  • こんにちは。

    現在、以下のことをPowerShellスクリプトを使用し実現しようとしています。

    ・スクリプトで作成したADユーザーが、正常に作成できていることを確認する。

    考えている流れは以下の通りです。

    ・Import-csvコマンドでcsvからパラメーターを読みこみ、New-ADUserコマンドでADにユーザーを作成する。

    1.csvファイルからユーザー情報を読み出し、配列(A)に格納する。

    2.Get-ADUserコマンドでユーザー情報を取り出し、配列(B)に格納する。

    3.Compare-Objectコマンドで配列(A)と配列(B)を比較する。

    4.配列(A)の情報が全て配列(B)に含まれるかどうかを確認する。

    配列(A)の情報が全て配列(B)に含まれていれば、ADユーザーの作成が正常に完了している、という認識です。

    (ADユーザーの作成が失敗する原因は、すでにAD上に同じ名前または同じユーザーログオン名が使用されている場合としています)

    具体的なコマンドやパラメーター、また他に良い方法があればご教示いただきたいです。よろしくお願いします。

    2017年10月12日 13:21

すべての返信

  • > ・Import-csvコマンドでcsvからパラメーターを読みこみ、New-ADUserコマンドでADにユーザーを作成する。

    この時点で正常に作成されなかったユーザーリストを作ってしまうのが手っ取り早い気もします。

    CSVがどのような形式か不明ですので、UserNameという列名でユーザー名を定義しているものと仮定して、エラーが発生して作成できなかったユーザーのリストを生成するサンプルを書いてみました。

    Import-Csv list.csv | foreach {
        New-ADUser $_.UserName -ErrorVariable +adErrors
    }
    
    $errorUsers = $adErrors | foreach {
        $_.ErrorRecord.TargetObject
    }

    なお、事後に検証を行う場合だと、ご提示の手順では、AD上に同名ユーザーが存在しているため失敗したケースを検知できないように思いますが、いかがでしょうか?

    (CSV上のユーザー一覧(配列A)は、登録の成否にかかわらず、必ずAD上の全ユーザー一覧(配列B)内に存在するはず)

    2017年10月12日 16:01
    モデレータ
  • やきです。

    すでにユーザが作成されてしまっており、これからうまく行ったのか
    確認をしたいという要件と認識しました。

    1.csvファイルからユーザー情報を読み出し、配列Aに格納する。
    2.配列Aのユーザを検索し、配列Bに格納する。検索できなければ、配列Bにその旨を結果に追加。
    3.配列Aと配列Bの各要素が一致するか確認。しないならその旨を結果に追加。
    4.配列BのWhenCreatedを確認。作成開始日時よりも古いなら、同名のユーザがすでに作られていた。結果にその旨追加。

    でいかがでしょうか。

    配列Aに含まれる情報が何か書かれていないので、仮にcn,sn,GivenNameと仮定し、
    CSVの列名にもそれが使用されているとします。
    されていなかったらimport-csvのあと、ADの属性名と一致するように列名を変えて格納した配列を使います。

    $csvpath = "C:\temp\t.csv" # CSVファイルの場所
    $CreateTime = Get-Date "2017/10/16 10:00" # 作成を開始した日時
    
    # インポート
    $CSV = Import-CSV $CSVPath
    
    # ADに登録したプロパティと結果確認用の列を含む配列(のテンプレート)
    $ADPropList = @("cn","sn","GivenName","whenCreated") # ADに問い合わせたい属性
    $CheckPropList = @("sn","GivenName") # CSVと比較したい属性
    
    $Template = New-Object PSObject | Select ($ADPropList + "Error")
    
    # CSVにあるユーザを検索
    $ResultList = @()
    $ResultList = Foreach($c in $CSV)
    {
    	$cn = $c.cn
    	$template.cn     = $cn
    	$template.Error  = ""
    	
    	try
    	{
    		# 検索&取得
    		$sample = Get-ADUser $cn -Property $ADPropList
    		foreach($p in $ADPropList)
    		{
    			# テンプレートに格納
    			$template.$p   = $sample.$p
    		}
    		
    		# CSVと一致確認
    		foreach($p in $CheckPropList)
    		{	
    			# csvのカラムが空の時、$nullとの比較にさせる
    			if([String]::isNullOrEmpty($c.$p))
    			{
    				$c.$p = $null
    			}
    			if($sample.$p -ne $c.$p)
    			{
    				# 取得した内容とCSV不一致の場合
    				$template.Error += "$p が不一致;"
    				# write-host "$cn :$p 比較: $($sample.$p) -ne $($c.$p)" -ForegroundColor Red
    			}
    		}
    		
    		# タイムスタンプ確認
    		if( $sample.whenCreated -lt $CreateTime)
    		{
    			$template.Error += "$(get-date $sample.whenCreated -format 'yyyy/MM/dd HH:mm:ss') にて作成済みだったユーザ"
    			# write-host "$cn : すでに作成済みだったユーザ" -ForegroundColor Red
    		}
    		
    	}
    	catch
    	{
    		# エラーの場合
    		foreach($p in $ADPropList)
    		{
    			# テンプレートにはNULLを入れる
    			$template.$p   = $Null
    		}
    		$template.cn     = $cn  # cn は必須
    		$template.Error = "$_" # エラーの内容を入れる
    	}
    	
    	$Template.PSObject.Copy()
    }
    $Template = $Null
    
    # 結果表示(グリッドビュー)
    $ResultList | Out-GridView
    

    2017年10月16日 7:59