0

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

Пример того, что вход будет:

"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» является членом всех 3-х групп, «anotherid «не является членом« Группы домена 1 », а« mikeid »не является членом« Domain Group 3 ».

ответ

0

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

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

Затем я извлекаю информацию пользователя из AD и запускаю ForEach в свойстве UserOf пользователя, добавляя запись для каждой группы так же, как вы. Я сформировал 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 Group я отвечаю у нас есть нюанс здесь ... Это не имеет дела с вложенными группами. Если вы хотите погрузиться в вложенные группы, тогда все начинает усложняться, и нам лучше создать функцию для этого. В качестве примера вложенных групп вы можете посмотреть функцию GetNestedUsers в последнем блоке сценария в моем ответе на this question.

+0

Это ближе к тому, чего я надеялся достичь. После нескольких ухищрений я смог получить выходный результат ближе к тому, что мне нужно, но я застрял с одной частью. Каков наилучший способ получить имя из GroupName? Результат выглядит примерно так: «CN = Citrix Users, OU = Global, OU = Groups, DC = mycompany, DC = com», но мне нужно что-то вроде этого: «Пользователи Citrix» – Jason

+0

Это делается, но есть ли лучше путь? GroupName = $ group.SubString (3, $ group.IndexOf (",") - 3) – Jason

+0

Обновлен ответ с регулярным выражением, которое должно делать то, что вы хотите, и будет немного более гибким, если группа или что-то имеет запятую во имя. Извините за медленный ответ, он был болен пару дней. – TheMadTechnician

Смежные вопросы