2017-03-13 32 views
0

ユーザー名の一覧を確認し、ユーザーのフルネームと一部の属性設定をADから表示するスクリプトを作成しようとしています。基本的には、私はちょうど数字であるユーザー名のリストが送られており、管理者は各ユーザー名のフルネームを知りたいと思っています。彼らはまた彼らが働く部門を望むことを知りたい。ユーザー名の一覧表示

以下は私が作成したスクリプトですが動作しません。

$csv = Import-Csv "C:\temp\users.csv" 

foreach ($user in $csv) { 
    $name = $user.myid 
    Get-ADUser -Filter {EmployeeID -eq $name} -Properties * | 
     Get-ADUser -Division $user.Programme 
} | Export-Csv "C:\Temp\Results.csv" 

答えて

0

疑問がある場合は、documentationをお読みください。 Get-ADUserにはパラメータ-Divisionがありません。出力ファイルに必要なプロパティーをselectにする必要があります。また、foreach loops don't pass output into the pipeline。あなたはExport-Csvに直接出力を渡したい場合は、ForEach-Objectループを必要とする:

Import-Csv 'C:\temp\users.csv' | 
    ForEach-Object { 
     $name = $_.myid 
     Get-ADUser -Filter "EmployeeID -eq $name" -Properties * 
    } | 
    Select-Object SamAccountName, DisplayName, Division | 
    Export-Csv 'C:\Temp\Results.csv' -NoType 

そうでなければ、あなたが変数に出力を収集する必要があります。

$users = foreach ($user in $csv) { 
    $name = $user.myid 
    Get-ADUser -Filter "EmployeeID -eq $name" -Properties * 
} 
$users | Export-Csv 'C:\Temp\Results.csv' -NoType 

またはsubexpressionでループを実行します。

$(foreach ($user in $csv) { 
    $name = $user.myid 
    Get-ADUser -Filter "EmployeeID -eq $name" -Properties * 
}) | Export-Csv 'C:\Temp\Results.csv' -NoType 
1

だから私はあなたのcsvファイルにあなたが探している必要があるIDを含むmyidという名前の列があると仮定して作業しています。その場合、ここでいくつかの変更を加える必要があります。 2番目のget-aduserを削除する必要があります。これは実際に何もしていないため、get-aduserコマンドレットでは-divisionスイッチを使用できません。結果をいくつかの設定に制限する必要がある場合は-propertiesスイッチと配管を以下のように選択します。自分のADアカウントに「従業員」と「部門」のプロパティが設定されていないユーザーは、自分の経験ではまれであるが、アカウントを作成する際にはポリシーの問題としてユーザーが行っている場合は、うまくいくはずです。スクリプト内のget-aduser行をこれに置き換えると、EmployeeIDプロパティを持つユーザーのアカウントがスプレッドシートのプロパティと一致し、そのユーザーのフルネーム、部門、および従業員IDがCSVファイルに出力されます。

Get-ADUser -Filter {EmployeeID -eq $name} -Properties "displayname","division","employeeid" | Select-Object "employeeid","displayname","division" 
+0

ありがとう、私はそのプロパティについては気づいていませんでした。私は情報が必要なので、私は部門を落としましたextensionAttributeにもあります。 HRから送られたCSVファイルを見てSamAccountNameに基づいてやりました。書式設定は全面的に行われ、表示名と拡張属性を取得できました。 HRの役割が新しいAD統合システムの役割を果たすとき、私はそれを愛しています。 –

0

これは、シナリオに合わせて、データの収集/列挙とCSVファイルの作成に対応できる汎用コード構造です。職場でも似たような使い方をしています。いくつかのエラー処理が含まれています。あなたが望む最後のものは、CSVファイルの不正確な結果です。

# Create an array from a data source: 
$dataArray = import-csv "C:\temp\users.csv" 

# Create an array to store results of foreach loop: 
$arrayOfHashtables = @() 

# Loop the data array, doing additional work to create our custom data for the CSV file: 
foreach($item in $dataArray) 
{ 
    try 
    { 
     $ADObject = Get-ADUser -Filter { EmployeeID -eq $item.MyID } -Properties DisplayName,Division -ErrorAction Stop 
    } 
    catch 
    { 
     Write-Output "$($item.MyID): Error looking up this ID. Error was $($Error[0].Exception.Message)" 
    } 

    if($ADObject) 
    { 
     # Create a hashtable to store information about a single item: 
     $hashTable = [ordered]@{ 
      EmployeeID=$item.myID 
      DisplayName=$ADObject.DisplayName 
     } 

     # Add the hashtable into the results array: 
     $arrayOfHashtables += (New-Object -TypeName PSObject -Property $hashTable) 
    } 
    else 
    { 
     Write-Output "$($item.MyID): No result found for this ID." 
    } 
} 

# If the results array was populated, export it: 
if($arrayOfHashtables.Count -gt 0) 
{ 
    $arrayOfHashtables | Export-CSV -Path "C:\Temp\Results.csv" -Confirm:$false -NoTypeInformation 
} 

他のところで述べたように、divisionはADオブジェクトのプロパティではないため、このデータを別の場所で参照する必要があります。 foreachループの中で別の行のPowerShellでこれを行うことができる場合、ハッシュテーブルオブジェクトにこれを次のように追加することができます。

$hashTable = [ordered]@{ 
    EmployeeID=$item.myID 
    DisplayName=$ADObject.DisplayName 
    Division=$DivisionFromOtherSource 
} 
+0

ループ内の配列への追加は、各追加操作が配列をサイズ変更して再作成し、既存のすべての要素をコピーするため、パフォーマンスが低下するようにバインドされます。この方法を使用することはお勧めできません。 –

+0

ありがとうございます - それは知っておくと便利です。しかし、このコード構造の複数のインスタンスを~200のWindowsサーバー、550のVM、および30,000ユーザーのADに対して実行すると、レポートデータを照合するために使用される4GB、2vCPUのWindowsサーバーでパフォーマンスの問題は顕著になりません(また、サーバー)。この基本的な構造を使用する主な理由は、PowerShellの初心者が理解して簡単に適用できるためです。再びありがとう。 – Robin

+0

おおまかな見積もりをしてください: '$ a = 1..10000 | %{$ _} 'vs' $ a = @(); 1.10000 | %{$ a + = $ _} 'は0.3秒対4.1秒です。 –

関連する問題