2012-02-11 4 views
0

PowershellでADにフィードするaprox 1000行(従業員)のHRからCSVファイルを取得しました。 これはうまくいきますが、これを正しく実行しているかどうかは少し不明です。私は一度に属性1を設定していますimport-CSVからADをクリーニングする - 行ごとに処理する方法または機能 - 改善コード

  • これは私の主な関心事です。私は "変更"を何らかの配列/ hasthable/objectに入れ、スクリプトの最後に一度に行うべきですか?しかし、どのように? "New-Object"?

  • 機能を使用する必要がありますか?しかし、どのようにして値を返すことができますか(そして関数の結果に基づいて続けますか)?

すべてのプログラミングのヒントは、訂正が大いに評価されます。私は知っている人のこのすばらしいコミュニティを本当に理解するので、私にそれを持たせてください。あなたは時間があればこれは私のコードです..私はこれより良いを行うことができますどのよう

を教えてください:

Add-PSSnapin Microsoft.Exchange.Management.PowerShell.Admin -ErrorAction silentlycontinue 
Add-PSSnapin quest.activeroles.admanagement -ErrorAction silentlycontinue 

$file = "\Scripts\employees.csv"  # Location of the input file 
$file2 = "\Scripts\employees2.csv"  # Temp file 
$logfile = "\Scripts\logfile.txt" # log file 
remove-item $logfile -Force -ErrorAction SilentlyContinue 

Get-Content $file | Out-File -Encoding UTF8 $file2       # Convert to UTF8 (we don't touch the original inputfile) 
$ListEmployees = Import-Csv $file2 -Delimiter ";"       # Import the file to CSV 

foreach ($ListEmployee in $ListEmployees) { 
$ListDisplayName = $ListEmployee.firstname + " " + $ListEmployee.lastname 

if($ADemployee = Get-QADUser -displayname $ListDisplayName -IncludedProperties employeeid) 
{ 
    ## CHECK NAME 
    if($($ADEmployee.displayname) -eq $($ListDisplayName)) 
    { 
     echo "MATCH: $($ADEmployee.displayname)" 
    } 

    ## CHECK COMPANY 
    if($($ADEmployee.company) -ne $($ListEmployee.company)) 
    { 
     echo "  CHANGE - Company: '$($ADEmployee.company)' to '$($ListEmployee.company)'" 
     Set-QADUser -identity $($ADEmployee.samaccountname) -Company $($ListEmployee.company) -WhatIf 
    } 
    else 
    { 
     echo "  OK  - Company  : no change '$($ListEmployee.company)'" 
    } 

    ## CHECK OFFICE 
    if($($ADEmployee.office) -ne $($ListEmployee.office)) 
    { 
     echo "  CHANGE - Office '$($ADEmployee.office)' to '$($ListEmployee.office)'" 
     Set-QADUser -identity $($ADEmployee.samaccountname) -Office $($ListEmployee.Office) -WhatIf 
    } 
    else 
    { 
     echo "  OK  - Office  : no change '$($ListEmployee.office)'" 
    } 

    ## CHECK MOBILE 
    if($listemployee.mobile -match '\S') 
    { 
     if($($ADEmployee.mobile) -ne $($ListEmployee.mobile)) 
     { 
      echo "  CHANGE - Mobile : '$($ADEmployee.mobile)' to '$($ListEmployee.mobile)'" 
      Set-QADUser -identity $($ADEmployee.samaccountname) -Mobile $($ListEmployee.mobile) -WhatIf 
     } 
     else 
     { 
      echo "  OK  - Mobile  : no change '$($ListEmployee.mobile)'" 
     } 
    } 

    ## CHECK EMPLOYEEID 
    if($($ADEmployee.employeeid) -ne $($ListEmployee.employeeid)) 
    { 
     echo "  CHANGE - EmployeeID: '$($ADEmployee.employeeid)' to '$($ListEmployee.employeeid)'" 
     Set-QADUser -identity $($ADEmployee.samaccountname) -ObjectAttributes @{employeeID = $($ListEmployee.employeeid)} -WhatIf 

    } 
    else 
    { 
     echo "  OK  - EmployeeID : no change '$($ListEmployee.employeeid)'" 
    } 
    $match++ 
} 
else 
{ 
    if($EXContact = Get-Contact $ListDisplayName -ErrorAction SilentlyContinue) 
    { 
     echo "MATCH CONTACT: $ListDisplayName (contact)" 

     ## CHECK MOBILE 
     if($listemployee.mobile -match '\S') 
     { 
      if($($EXContact.Mobilephone) -ne $($ListEmployee.mobile)) 
      { 
       echo "  CHANGE - Mobile : '$($EXContact.Mobilephone)' to '$($ListEmployee.mobile)'" 
      } 
      else 
      { 
       echo "  OK  - Mobile ; No change ($($ListEmployee.mobile))" 
      } 
     } 

     ## CHECK COMPANY 
     if($($EXContact.company) -ne $($ListEmployee.company)) 
     { 
      echo "  CHANGE - Company: '$($EXContact.company)' to '$($ListEmployee.company)'" 
     } 
     else 
     { 
      echo "  OK  - Company : No change($($ListEmployee.company))" 
     } 

     ## CHECK OFFICE 
     if($($EXContact.office) -ne $($ListEmployee.office)) 
     { 
      echo "  CHANGE - Office '$($EXContact.office)' to '$($ListEmployee.office)'" 
     } 
     else 
     { 
      echo "  OK  - Office : No Change($($ListEmployee.office))" 
     }  
     $contactmatch++ 
    } 
    else 
    { 
     echo "$ListDisplayName" | Out-File $logfile -Append 
     echo "NO MATCH: $ListDisplayName" 
     $nomatch++ 
    } 
} 
$i++ 
} 
echo " " 
echo "List contains $i accounts" 
echo "Accounts: $match matches" 
echo "Contacts: $contactmatch" 
echo "No Match: $nomatch" 

そして、これがcr * pだと思うなら、教えてください!私はむしろ礼儀正しくするために静かに留まるよりも、あなたからそれを聞いてみたい!私はこれに "かなり"新しいので、私はそれに値するので、私はそれに値するので、

+1

ヒント - 部分表現を使いすぎています。 '$(expression)'という構文は、二重引用符で囲まれた変数$($ variable.property) "で変数のプロパティにアクセスしようとしているような場合にのみ必要です。プロパティにアクセスしているだけの場合は、それを使う必要はありません。たとえば、 '$ ADEmployee.office -eq $ ListEmployee.office'を実行するだけです。 –

+0

ありがとう、アンディ!私がそれを全部使っているのは、出力をエコーし​​ているときに直接使うことができないように思えるからです。これは正しい仮定ですか? – Sune

+1

これはオフィスのプロパティ 'Write-Host $ ADEmployee.Office'の値を出力します。しかし、テキストを追加したい場合は、 'Write-Host" Office:$($ ADEmployee.Office) "の部分式を使用するか、文字列フォーマット' Write-Host( "Office:{0 } "-f $ ADEmployee.Office)'。しかし、プロパティにアクセスしていない場合は、この 'Write-Host 'Office:$ ADEmployee" 'を実行するだけで、PowerShellはオブジェクトに対して' ToString'メソッドを呼び出して、必要なデータを返すことができます。 –

答えて

1

は私の意見です:

1)私は本当に問題@mjolinorポイントが重要であり、あなたがアイデンティティの属性のいずれかを使用していない場合は、トラブルを(私は人間のチェックを必要とする意味)を満たすだろうと思いますMicrosoft(samAccountName、userPrincipalNameまたはbetter objectGuid、objectSid ...)をキーとしてActive Directory内のユーザーを検索するように修正されました。

可能であれば、複数の属性の先頭にフィルタを作成することができます。 CSVが別のLDAPディレクトリから取得された場合、おそらくスキーマに一意のIDを組み込むことができます(この場合は、Active DirectoryへのMicrosoft Services for UNIX 3.5(MSFU3.5)スキーマ拡張を参照してください)。

2)Active DirectoryでCSVエントリの1つを見つけたら、各属性をチェックし、ADのものとCSVのものをそれぞれ1つずつ置き換えます。

私のアドバイスは、あなたのCSVとADエントリの間の差異をすべてチェックすることです。実際、1つの相違点について、私はそれらを1つのコマンドですべて変更します。 Set-QADUserがどのように書かれているのかわかりませんが、低レベルの層ではすべての属性の置換をワンショット(LDAP_REPLACE、または単一のADSIコミット)にすることができます

3)PowerShell V2 、W2K8)Active Directoryモジュールはマイクロソフトから提供されています。

+1

完璧な世界では、すべての従業員は雇用の条件として自分のドメインSIDに合致するように合法的に自分の名前を変更する必要がありますが、あなたはそのことに気づかないでしょう。人事部および経理部門では、社員の名前と内部的に割り当てられた従業員番号が使用されるため、AD ID参照を使用するように変更することはありません。追加/変更/削除要求で姓、名、従業員IDの両方を使用するようにすれば十分です。 3人すべてが間違っているとすれば、おそらく悪いSIDやGUIDを入れてしまったでしょう。 – mjolinor

+0

私はなぜADでユーザを探すためのフィルタを提案するのかと思っています。 – JPBlanc

+0

他の答えのコメントにも同じことが提案されました。 – mjolinor

2

あなたの身元の参照として表示名を使用しています。アイデンティティの参照として、それは揮発性であり、潜在的に曖昧なものであり、メンテナンススクリプトを動かすのに悪い選択肢に思えます。ここで

+1

合意。必要なのは、雇用者のための保証された一意の識別子です。そのため、スクリプトは間違ったアカウントを更新しません。 –

+0

私は思っています。私は、厳密で手動による監督の下で "employeeID"を追加し、その後すべての追加を "employeeID"に基づいて行うことを考えています。よく聞こえる? – Sune

+1

それは良いですが、ADはそれが一意であることを保証するものではありません。新しいアカウントを追加するときは、新しいアカウントに付与する前にemployeeidが割り当てられていないことを確認する必要があります。 – mjolinor

関連する問題