【问题标题】:How to look for Active Directory group name from csv in PowerShell?如何在 PowerShell 中从 csv 中查找 Active Directory 组名称?
【发布时间】:2020-01-28 20:12:03
【问题描述】:

如果我有.csv

ClientCode,GroupCode
1234,ABC
1234,DEF
1235,ABC 
1236,ABC

我想得到一个以ClientCode为键的哈希表,值是所有带有ClientCode的AD组,例如:

ClientCode GroupCode      
---------- ---------      
1234       ClientGroup_InAD_1234, some_other_client_1234    
1235       ClientGroup_InAD_1235, some_other_client_in_AD_1235
1236       ClientGroup_InAD_1236

我该怎么做?

基本上,我在 Active Directory 中有客户端组,每个客户端都有一个与 csv 中的“ClientCode”相同的代码。例如,我可能有一个名为“Bob”的客户,我为其分配了一个代码“1234”。因此,AD 中 Bob 的组将是“Bob_1234”。本质上,我希望能够搜索其中包含 ClientCode 的任何组。所以我想搜索所有具有“1234”的广告组。这将返回“Bob_1234”,并且 AD 中的任何组的名称中也包含“1234”。

到目前为止我已经尝试过:

$clientTable = @{}

foreach($rec in $csv_data) {
    $groups = @(get-adgroup -Filter "name -like '*$($rec.clientcode)_*'")
    write-host "Found $($groups.count) group(s) for: $($rec.clientcode)"
    $clientTable[$ClientCode] = @($groups)
}

$clientTable

但我没有得到我想要的输出

【问题讨论】:

  • clientcide 是否总是组名的最后一位,并且总是以_ 开头?

标签: powershell active-directory


【解决方案1】:

您可以像这样使用循环。您需要在要通过过滤器查找的名称的开头使用 * 进行搜索。

foreach($rec in $csv) { 
    $clientCode = "*_$($rec.ClientCode)"
    if (!($clientTable.ContainsKey($clientCode))) {
        $names = Get-ADGroup -Filter 'Name -like $clientCode' | select Name
        $clientTable[$clientCode] = $names -join ","
    }
}

这还将检查任何已检查的客户端 ID 并忽略它们。

【讨论】:

    【解决方案2】:

    如果您希望使用 ClientCode 值作为键名填充哈希表,您可以执行以下操作:

    $clientTable = @{}
    
    foreach($rec in $csv_data){
        $groups = @(Get-ADGroup -Filter "Name -like '*_$($rec.ClientCode)'" | Select -Expand Name)
        write-host "Found $($groups.count) group(s) for: $($rec.ClientCode)"
        $clientTable[$rec.ClientCode] = $groups
    
    }
    
    $clientTable
    

    请记住,哈希表中的每个值都是一个组名数组。如果你想要一个带有逗号分隔名称的字符串,你可以改用$clientTable[$rec.ClientCode] = $groups -join ","

    【讨论】:

    • 如果您多次列出相同的 ID,它不会覆盖以前迭代中的组吗?
    • 是的。但由于他只查询一列 (ClientCode),它将继续返回相同的重复结果。如果查询已经添加到哈希表中,更好的代码会跳过查询。不知何故 GroupCode 必须考虑,但它不在他的示例代码中。
    • 对于这个例子来说,重复的 ClientCode 条目很奇怪。我确信这是不存在的原因。
    【解决方案3】:

    在检索组之前,您需要对 CSV 中的 ClientCode 进行重复数据删除。 像下面这样的东西应该这样做(假设 ClientCode 前面总是有一个下划线,如您的示例中所示的_1234

    $csv = Import-Csv -Path 'ClientGroupCodes.csv'
    
    $clientTable = @{}
    
    $csv | Select-Object -ExpandProperty ClientCode -Unique | ForEach-Object {
        # $_ is a single clientcode in each iteration (string)
    
        # get an array of goup names
        $groups = @(Get-ADGroup -Filter "Name -like '*_$_'" | Select-Object -ExpandProperty Name)
        Write-Host "Found $($groups.Count) group(s) for code : '$_'"
        $clientTable[$_] = $groups -join ', '
    }
    
    $clientTable
    

    【讨论】:

      猜你喜欢
      • 2020-06-28
      • 1970-01-01
      • 1970-01-01
      • 2015-09-26
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-29
      相关资源
      最近更新 更多