How to look for Active Directory group name from csv in PowerShell?

心已入冬 提交于 2020-02-04 01:33:10

问题


If I have a .csv:

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

and I want to get a hashtable with ClientCode as key, and values to be all AD groups with ClientCode in it, for example:

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

How do I go about this?

Essentially, I have client groups in Active Directory and each client has a code which is the same as the 'ClientCode' in the csv. For example, I might have a client called 'Bob' which I have assigned a code '1234' to it. Therefore, the Group for Bob in the AD would be 'Bob_1234'. Essentially I want to be able to search for whatever groups have ClientCode in them. So i want to search for the all the AD groups that have '1234'. This would return 'Bob_1234' and whatever group in the AD also has '1234' in its name.

So far I have tried:

$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

but I'm not getting my desired output


回答1:


You can use the loop like this. You will need to search with a * at the beginning of the name you are looking to find via the Filter.

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

This will also check for any client IDs that have already been checked and ignore those.




回答2:


If you want a hash table populated with the ClientCode value as the key name, you can do the following:

$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

Keep in mind here that each value in the hash table is an array of group names. If you want a single string with comma-delimited names, you can do $clientTable[$rec.ClientCode] = $groups -join "," instead.




回答3:


You will need to de-duplicate the ClientCodes in the CSV before retrieving the groups. Something like below should do it (assuming the ClientCode is always preceded by an underscore like in _1234 as shown in your examples)

$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


来源:https://stackoverflow.com/questions/59956304/how-to-look-for-active-directory-group-name-from-csv-in-powershell

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!