我正在尝试获取 UID 列表(NIS 属性)。问题是 UID 顺序不对。我想定义一个范围并检查是否存在具有该 UID 的帐户,如果存在,则获取范围内使用的最后一个 UID。我可以使用以下代码,但循环遍历范围需要花费大量时间(对于此示例,范围非常小)。我想知道是否有其他方法可以以更好的性能完成相同的任务。
[int32[]] $array= 50000..100000
$initArray = @()
foreach ($arr in $array){
$acct = (Get-ADUser -Filter (uidnumber -eq $arr) -Properties uidNumber) | select name, uidnumber
$initArray += $acct.uidnumber
}
$initArray | Select -Last 1
这样我就可以得到最后使用的 UID,但如果范围是 300000 到 900000,那么 foreach 循环将花费大量时间来获取最后一个 UID。如能得到任何帮助,我将不胜感激。
PS版本:2.0
答案1
感谢您的信息。我使用了一种根据脚本中定义的最小值和最大值过滤 UID 号码的方法。因此,代码大致如下。
$min = 3000000
$max = 9000000
$res = (Get-ADUser -Filter * -Properties uidnumber | where_object {($_.uidnumber ge $min) -and ($_.uidnumber le $max)}).uidnumber
$uid = ($res |Measure -Maximum).Maximum
if ($uid -eq $null){
$uid = $min
} else {
$uid++
}
答案2
对于如此多的用户,单个获取会很慢。这uidNumber
是一个索引属性,因此您可以在 LDAP 查询中利用该索引。我会像这样逐步完成它。
for ($x=100000; $x -ge 50000; $x=$x -10000) {
$x
$q = get-aduser -filter { uidNumber -gt $x } -prop uidNumber,Name
if ($q) {
$q | sort-object -prop uidNumber | select-object -last 1
break
}
}