我有一个以CSV格式存储的ObjectGUID列表(其中有49个),我正在输出一个CSV,其中包含以下格式的所有组的所有成员的列表:“ LastName,FirstName”,“ AD Group名称” 我可以正常工作(大多数时候;有时我会从Add-Content cmdlt收到IOException错误),但是它非常慢(8000个成员大约需要30分钟)。我没有使用Powershell的丰富经验,但是我觉得有一种更好/更有效的方法可以做到这一点。关于如何提高效率的任何想法?
注意:我使用“ -Server”开关,因为实际上我必须在几个不同的域中运行此脚本,因此,我粘贴的代码在原始代码中重复了两次,使用了不同的CSV输入,并且不同的域传递给“ -Server”开关。
#read in CSV of ObjectGUIDs
$guids = Import-CSV .\ObjectGUIDs.csv
#loop through each AD group
foreach($group in $guids) {
$group_name = Get-ADObject -identity $group.objectGUID -server myDomain
$group_name = $group_name.Name
#get list of users in current group
$users = get-adgroupmember -server myDomain -identity
$group.ObjectGUID | where {$_.objectclass -eq 'user'}
#loop through each user of the current group
foreach ($user in $users) {
#get display name of current user
$display_name = get-aduser -identity $user.objectGUID -server
myDomain -properties DisplayName
#build the current row
$row = ('"' + $display_name.DisplayName + '"' + ',' + '"' +
$group_name + '"')
add-content -path "C:\Path\to\output.csv" -value $row
}
}
如上所述,这通常可行,但需要很长时间。
答案 0 :(得分:0)
在[PSCustomObject]
中收集数据并仅使用一次Export-Csv
应该会更有效率。
## Q:\Test\2018\12\27\SO_53946702.ps1
$guids = Import-CSV .\ObjectGUIDs.csv
$CsvFile = "C:\Path\to\output.csv"
$Server = myDomain
$CsvData = foreach($group in $guids) {
$GroupName = (Get-ADObject -identity $group.objectGUID -server $Server).Name
#get list of users in current group
$users = Get-ADgroupMember -Server $Server -Identity $group.ObjectGUID |
Where-Object ObjectClass -eq 'user'
foreach ($user in $users) {
[PSCustomObject]@{
DisplayName = (Get-ADuser -Identity $user.objectGUID -server $Server -Properties DisplayName).DisplayName
GroupName = $GroupName
}
}
}
$CsvData | Export-Csv $CsvFile -NoTypeInformation