Powershell-从数组获取值 - Where-Object

时间:2014-07-31 06:47:25

标签: arrays powershell foreach

我得到了创建一个脚本的工作,该脚本来自部门编号(在AD中)所有用户及其相关计算机(管理者属性)。

我设法让所有用户 - 以及所有具有Managed By属性集的AD计算机的数组 - 现在我必须找到每个正确的计算机(意味着用户名(从AD用户获得))匹配一个(或更多)完整AD计算机摘录的计算机。

我现在尝试了这个:

$test = $user.samaccountname
$computer +=($ManagedBy | Where-Object {$_.ManagedBy -like "*"$test"*"})

变量的简短说明:

$ ManagedBy包含:

@{ManagedBy=CN=weibo1,OU=Users,OU=Managed,DC=asia,DC=ourComp,DC=com; Name=computer1}
@{ManagedBy=CN=kimyo1,OU=Users,OU=Managed,DC=asia,DC=ourComp,DC=com; Name=computer2} 

$ test包含所需部门中的所有用户名:

putzifa1
fischch1
jonesem1

我真的不知道,也无法在网上找到任何好的解决方案(我有一些想法,比如foreach,然后一直是if或者什么,但我想性能不会起作用).. .. $ ManagedBy包含大约4000个条目,另一个大约350个

非常感谢你!

1 个答案:

答案 0 :(得分:0)

你这样做太复杂了。 managedBy属性包含用户的专有名称,因此您需要做的就是获取一个列表,其中包含来自给定部门的用户的可分辨名称,然后筛选该列表中包含的managedBy值的计算机对象

假设部门编号存储在适当的属性(department)中,应该这样做:

$dept = ...

$users = Get-ADUser -Filter 'department -eq "$dept"' |
         select -Expand DistinguishedName

Get-ADComputer -Filter * -Properties * | ? {
  $users -contains $_.ManagedBy
} | select -Expand Name

或类似的东西,如果你需要computername和相关的用户名:

$dept = ...

$users = @{}
Get-ADUser -Filter 'department -eq "$dept"' | % {
  $users[$_.DistinguishedName] = $_.SamAccountName
}

Get-ADComputer -Filter * -Properties * | ? {
  $users.Keys -contains $_.ManagedBy
} | select @{n='Computer';e={$_.Name}}, @{n='User';e={$users[$_.ManagedBy]}}

语句$user = @{}创建一个空hashtable,随后用distinguishedName / sAMAccountName对($users[$_.DistinguishedName] = $_.SamAccountName)填充。创建哈希表而不是简单列表的目的是允许您通过存储在计算机managedBy属性中的可分辨名称查找帐户名。