搜索包含活动目录用户的powershell数组

时间:2014-10-20 09:02:15

标签: arrays powershell active-directory

我在尝试查找包含Active Directory用户的数组中项目的索引号时遇到问题。
我按如下方式创建数组:

$outarray = @()  
$outarray = get-aduser -Filter * -Properties LastLogon | select "Name","SAMAccountName","LastLogon" | sort samaccountname

现在我有一个数组中的用户,我可以使用标准变量查询来证明它

$outarray[0]  
$outarray[1]  

完全按照我的期望返回。

BUT

我完全无法在数组中搜索nameSAMAccountName的索引,因为它们是数组的属性。

$index = [array]::IndexOf($outarray.samaccountname, "testuser")  
仅当testuser是数组中的第一个用户时,

才返回-1(未找到)或0。 我在数组中找不到任何其他用户索引。

获取索引后的目标是使用它来更新lastlogon的属性。如果我手动执行此操作 e.g。

$outarray[123].lastlogon = 12345678

我能做到这一点的唯一方法是最初手动构建数组,一次一个条目而不是直接填充

foreach ($user in $outArray) 
    {
        $myobj = @()
        $myobj = "" | Select "Name","SAMAccountName","LastLogon"

        #fill the object
        $myobj.Name = $user.name
        $myobj.SAMAccountName = $user.samaccountname 
        $myobj.LastLogon = $user.LastLogon

        #Add the object to the array
        $userarray += $myobj
    }
$userarray[[array]::IndexOf($userarray.samaccountname, "testuser")].LastLogon = 12345678

然后搜索工作。我认为这与属性类型有关,但在这个阶段我完全超出了我的深度。

在此先感谢您的帮助,我不是PowerShell阵列的专家,他们让我很困惑! :)

1 个答案:

答案 0 :(得分:1)

我认为你以错误的方式看待这个问题。而不是找到特定项目的索引,然后通过索引访问该项目,您可以通过过滤数组来为要更新的项目执行PoSh方式,如下所示:

$userarray | ? {
  $_.SamAccountName -eq 'testuser'
} | % {
  $_.LastLogon = 12345678
}

或者像这样:

$acct = $userarray | ? { $_.SamAccountName -eq 'testuser' } | select -First 1
$acct.LastLogon = 12345678