Скрипт Powershell для возврата всех групп для списка пользователей из файла импорта

Этот сценарий немного отстает в том смысле, что ему нужно будет возвращать все группы, членом которых является пользователь. Я заставил скрипт работать, но он возвращает группы только для 1-го пользователя в файле импорта и дублирует те же группы для каждого дополнительного пользователя.

Пример того, каким будет ввод:

"NetworkID","DisplayName"
"jasonid",Jason
anotherid
"mikeid","Mens, Mike"

Я относительно новичок в powershell (версия 2 с модулем AD), поэтому буду признателен за любую помощь. Вот скрипт, который я создал:

$out = @()

Import-Csv "$env:userprofile\Desktop\ADUsers.txt" | SELECT NetworkID | ForEach { 
$NetworkIDs = $_

ForEach ($NetworkID in $NetworkIDs) 
    {

    ForEach ($group in $groups) 
        {
            $obj = New-Object -TypeName PSObject

            $obj | Add-Member -MemberType NoteProperty -Name UserName -Value $NetworkIDs.NetworkID
            $obj | Add-Member -MemberType NoteProperty -Name GroupName -Value $group.name

            $out += $obj
        }
    }
}

$out | Format-table -AutoSize
$out | Export-Csv -path $env:userprofile\Desktop\ADUsers.csv –NoTypeInformation 

Примером вывода будет:

"UserName","GroupName"
"jasonid","Domain Group 1"
"jasonid","Domain Group 2"
"jasonid","Domain Group 3"
"anotherid","Domain Group 1"
"anotherid","Domain Group 2"
"anotherid","Domain Group 3"
"mikeid","Domain Group 1"
"mikeid","Domain Group 2"
"mikeid","Domain Group 3"

Я на 100% уверен, что «jasonid» является членом всех трех групп, «anotherid» не является членом «Domain Group 1», а «mikeid» не является членом «Domain Group 3».




Ответы (1)


Это выглядит довольно сложно с таким количеством вложенных циклов ForEach. Попробуем упростить...

Это загрузит модуль ActiveDirectory, чтобы мы могли искать пользователей в AD. Затем он создает пустой массив так же, как и вы. Затем, когда он загружает CSV, он выбирает и расширяет свойство NetworkID и передает его по каналу. Причина, по которой я это сделал, заключается в том, что, находясь в канале, мы можем просто обращаться к строке напрямую, а не к объекту со свойством NetworkID (не требуется $_.NetworkID, только $_).

Затем я извлекаю информацию о пользователе из AD и запускаю ForEach для свойства пользователя MemberOf, добавляя запись для каждой группы, как вы это делали. Я сформировал New-Object немного по-другому, чтобы все свойства были там, чтобы начать вместо того, чтобы создавать объект, затем добавлять к нему свойство, а затем добавлять к нему другое свойство. Читается очень похоже, но проще.

Import-Module ActiveDirectory -ea sc
$out = @()

Import-Csv "$env:userprofile\Desktop\ADUsers.txt" | SELECT -Expand NetworkID | ForEach { 
    $User = Get-ADUser $_ -Prop MemberOf
    ForEach ($group in $User.MemberOf) {
        $obj = New-Object -TypeName PSObject -Property @{
            UserName = $User.samAccountName
            GroupName = $group  -replace "(CN=)(.+?)(,OU=.*)", "`$2"
        }
        $out += $obj
    }
}

$out | Format-table -AutoSize
$out | Export-Csv -path $env:userprofile\Desktop\ADUsers.csv –NoTypeInformation 

Итак, как и большинство других вещей, связанных с группой AD, на которые я отвечаю, у нас есть предостережение... Это не касается вложенных групп. Если вы хотите погрузиться во вложенные группы, все становится сложнее, и нам лучше всего создать функцию для этого. В качестве примера вложенных групп вы можете посмотреть на функцию GetNestedUsers в последнем блоке скрипта в моем ответе на этот вопрос.

person TheMadTechnician    schedule 02.05.2014
comment
Это ближе к тому, чего я надеялся достичь. После пары настроек я смог приблизить вывод к тому, что мне нужно, но я застрял с одной частью. Каков наилучший способ получить имя из имени группы? Вывод примерно такой: CN=Citrix Users,OU=Global,OU=Groups,DC=mycompany,DC=com, но мне нужно что-то вроде этого: Citrix Users - person Jason; 05.05.2014
comment
Это делается, но есть ли лучший способ? ИмяГруппы = $group.SubString(3,$group.IndexOf(,)-3) - person Jason; 05.05.2014
comment
Обновил ответ регулярным выражением, которое должно делать то, что вы хотите, и будет немного более гибким, если в имени группы или чего-то еще есть запятая. Извините за долгий ответ, болел пару дней. - person TheMadTechnician; 07.05.2014