Powershell - вывод большой группы в ImportExcel - PullRequest
0 голосов
/ 25 марта 2020

Моя цель - узнать, какие члены указанного c OU также имеют членство в группе AD более высокого уровня. Группа AD более высокого уровня насчитывает более 7500 членов. Следующий скрипт я перенял из других источников. Он быстрый и дает мне ожидаемые результаты, он запускается всего за несколько секунд.

Вот моя проблема, если я передам результаты в файл .txt, они в порядке. Если я перенаправлю их в популярный модуль ImportExcel, он даст мне запись для каждого члена группы AD. У тех, кто не находится в целевом подразделении, есть пробелы, остальные заселены. Так что у меня осталась электронная таблица, содержащая более 7500 строк с разбросанными по ней данными. Что я здесь не так делаю?


$OUpath = 'OU=ourOU,OU=Users,OU=OurDept,DC=ourdc'
$GroupMembers = Get-ADGroup "MyGroup" -Properties Member |
    Select-Object -Expand Member


$out = Get-ADUser -Filter * -SearchBase $OUpath -Property Name, DisplayName, CanonicalName | ForEach-Object {
    $n = [pscustomobject]@{
        Name = $_.Name
        DisplayName = $_.DisplayName
        CanonicalName = $_.CanonicalName
        IsInGroup = $false
    }

    if ($GroupMembers -contains "OU=ourOU") {
        $n.IsInGroup = $true
    }
    $n
}

$out | Export-Excel

Ответы [ 2 ]

0 голосов
/ 26 марта 2020

@ thepip3r, поэтому мне пришлось внести некоторые изменения. Я перешел на Get-AdGroup под заголовками Get-ADGroupMember на 5000. Когда я вчера тестировал ваш скрипт, я использовал меньшую группу. Чтобы компенсировать использование Get-AdGroup, я сопоставляю на DistinguishedName. Я добавил несколько групп и обернул их в ForEach. В трех из этих групп более 5 тысяч пользователей. Все это работает в моей среде менее 30 секунд. Не стесняйтесь вносить предложения.

#Where Excel file is to be saved
$xlSourcefile = "c:\mypath\filename.xlsx"

#The list of groups you want to check an OU's memebership against
$groups = @(
    "MyGroup1"
    "MyGroup2"
    "MyGroup3"
    "MyGroup4"
    "MyGroup5" 
)


Foreach ($group in $groups) {

#The OU whoose members you want to check against the groups
$OUpath = 'OU=ourOU,OU=Users,OU=OurDept,DC=ourdc'

#Using ADGroup because of 5K memebership limit on Get-ADGroupMember
$GroupMembers = Get-ADGroup "$group" -Properties Member | Select-Object -Expand Member

$out = Get-ADUser -Filter * -SearchBase $OUpath -Property Name, GivenName, Surname, DistinguishedName | Sort-Object | ForEach-Object {
    $n = [pscustomobject]@{
        DistinguishedName = $_.DistinguishedName
        Name = $_.Name
        FirstName = $_.GivenName 
        LastName = $_.Surname        
        IsInGroup = $false
    }

    if ($GroupMembers -contains $_.DistinguishedName) {
        $n.IsInGroup = $true
    }
    $n
}

    $out | Export-Excel $xlSourcefile -WorksheetName "$group" -AutoSize -AutoFilter 
}
0 голосов
/ 25 марта 2020

Вот как я бы это сделал:

    #Get Our Users
$OUpath = 'OUDN'
$GroupMembers = Get-ADGroupMember "GroupName" | Select-Object -Expand Name

#Get Group Members
$out = Get-ADUser -Filter * -SearchBase $OUpath -Property Name, DisplayName | ForEach-Object {
    $n = [pscustomobject]@{
        Name = $_.Name
        DisplayName = $_.DisplayName
        IsInGroup = $false
    }

    if ($GroupMembers -contains $_.Name) {
        $n.IsInGroup = $true
    }
    $n
}

$out

$out | Export-Excel

Сначала выведите членов группы в массив. Затем получите всех пользователей в своем подразделении, посмотрите, не входят ли они в группу (через оператор -contains), и выведите их членские связи по своему усмотрению.

Назначив вывод l oop $ $, вы можете проверить результаты в памяти перед экспортом в Excel, чтобы убедиться, что информация в нужном вам формате.

РЕДАКТИРОВАТЬ: я только что изменил код, где я думал, что это нужно изменить, но не было случая, чтобы я мог с ним столкнуться, поэтому стрелял с бедра. Я просто создал условия, где я мог проверить то, что вы смотрели, чтобы проверить этот код. Модификации, чтобы он работал (см. Выше):

  • Удалены -Properties из Get-ADGroupMember - у него нет одного
  • Я изначально изменил -Property на -Properties при Get -ADUser, но, по-видимому, он отлично работает либо с

Ключом здесь является то, чтобы убедиться, что сравниваются значения пользователей, которые являются членами целевой группы, используемой для сравнения (в данном случае, Name) по отношению к эквивалентному значению пользовательских объектов из рассматриваемого подразделения, поэтому оператор -contains сопоставит яблоки с яблоками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...