我尝试使用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"}
单击其中一个按钮会使用友好名称填充列表框,但有没有更简单的方法将这些友好名称映射到可分辨的路径?
答案 0 :(得分: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
属性 - 其中包含友好名称 - 填充列表;因使用.Where()
而需要PSv4 +。
以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
}
})
注意:出于性能原因,上述内容仅适用于 smallish 哈希表;需要更多复杂的OU,需要更复杂的方法。
根据所选列表项获取完整的OU名称(假设.SelectedItems
返回先前添加到列表中的单个友好名称):
$ou = $ous[$WPFOU_List.SelectedItems]