1

我正在尝试使用 GUI 创建一个脚本,该脚本将允许我为我的组织创建用户帐户并将用户帐户分配给各种 OU。我的问题是我想在列表框中显示一个简单的名称,并将选择映射到 OU 的正确专有名称,但要做到这一点,我必须手动重新分配变量,如下所示:

$OU = WPFOU_List.SelectedItems

$WPFHR_Staff.Add_Click({
   $WPFOU_List.Items.Clear()
   $WPFOU_List.Items.Add("Oregon")
   $WPFOU_List.Items.Add("Colorado")
   $WPFOU_List.Items.Add("California")
})

$WPFSales_Staff.Add_Click({
   $WPFOU_List.Items.Clear()
   $WPFOU_List.Items.Add("Portland")
   $WPFOU_List.Items.Add("Denver")
   $WPFOU_List.Items.Add("Los Angeles")
})


if ($OU = "Oregon")
{$OU = "ou=oregon,ou=hr,dc=my,dc=org,dc=com"}
elseif ($OU = "Colorado")
{$OU = "ou=colorado,ou=hr,dc=my,dc=org,dc=com"}
elseif ($OU = "California")
{$OU = "ou=california,ou=hr,dc=my,dc=org,dc=com"}
elseif ($OU = "Portland")
{$OU = "ou=portland,ou=sales,dc=my,dc=org,dc=com"}
elseif ($OU = "Denver")
{$OU = "ou=denver,ou=sales,dc=my,dc=org,dc=com"}
elseif ($OU = "Los Angeles")
{$OU = "ou=la,ou=sales,dc=my,dc=org,dc=com"}

单击任一按钮会使用友好名称填充列表框,但是否有更简单的方法将这些友好名称映射到可分辨路径?

4

1 回答 1

2

使用有序哈希表(PSv3+) 来定义您的友好名称及其关联的 OU:

$ous = [ordered] @{
  Oregon        = "ou=oregon,ou=hr,dc=my,dc=org,dc=com"
  Colorado      = "ou=colorado,ou=hr,dc=my,dc=org,dc=com"
  # ...
  'Los Angeles' = "ou=la,ou=sales,dc=my,dc=org,dc=com"
}

hr然后,您可以按部门(和,在您的情况下)枚举和过滤它,sales并使用每个条目的.Key属性(包含友好名称)来填充列表;需要 PSv4+,因为使用.Where().

使用hr为例:

$WPFHR_Staff.Add_Click({
   $WPFOU_List.Items.Clear()
   # Note that in order to enumerate hashtables you must use .GetEnumerator()
   foreach ($ouEntry in $ous.GetEnumerator().Where({ $_.Value -match ',ou=hr,' })) {
     $WPFOU_List.Items.Add($ouEntry.Key) # .Key is the friendly name
   }
})

注意:出于性能原因,上述方法仅适用于小型哈希表;对于大量 OU,需要更复杂的方法。


根据选定的列表项获取完整的 OU 名称(假设.SelectedItems返回之前添加到列表中的单个友好名称):

$ou = $ous[$WPFOU_List.SelectedItems]
于 2018-03-05T22:01:33.030 回答