Powershell / dsquery Потяните список пользователей в массиве групп, составьте массив с уникальными пользователями

Мне было поручено убедиться, что все администраторы имеют правильные разрешения. У нас есть несколько групп администраторов, поэтому я хотел бы использовать powershell и dsquery, чтобы вытащить всех пользователей из этих групп и поместить их в массив. Пользователь может входить в более чем одну группу администраторов, поэтому я хочу только одного из каждого пользователя. Затем я бы использовал dsget, чтобы получить больше информации обо всех пользователях и вывести ее на css. Я застрял на том факте, что я не могу получить - содержит право работать. После того, как у меня есть этот список пользователей, публика должна быть впереди.

$admingroups = @("Group 1","Group 2","Group 3","Group 4")
$adminnames = @()

foreach ($adming in $admingroups) { 
  $admin = (&dsquery group -samid $adming -limit 0 | dsget group -members -expand)
  if ($adminnames -contains $admin) {
    write-host "Dupes"
  }Else{
    $adminnames += $admin
  }
}

2 ответа

Решение

Итак, вы хотите узнать, для каких администраторских групп они находятся?

Но ваш основной вопрос (поправьте меня, если я ошибаюсь):
Учитывая, что вы запрашиваете общий список пользователей-администраторов, запрашивая каждую группу администраторов, у вас могут быть дубликаты, так как же удалить эти дубликаты?

В этом случае проблема в том, что вы пропускаете цикл ForEach:

$AdminGroups = @("Group 1","Group 2","Group 3","Group 4")
$AdminNames = @()

ForEach ($Group in $AdminGroups) {
    $AdminsInGroup = @( dsquery group -samid $Group -limit 0 | dsget group -members -expand )

    ForEach( $Admin in $AdminsInGroup ) {
        if( $AdminNames -contains $Admin ) {
            Write-Host "Dupes"
        } else {
            $AdminNames += $Admin
        }
    }
}

В качестве альтернативы, Select-Object имеет параметр -unique:

$AdminGroups = @("Group 1","Group 2","Group 3","Group 4")
$AdminNames = @()

ForEach ($Group in $AdminGroups) {
    $AdminsInGroup = @( dsquery group -samid $Group -limit 0 | dsget group -members -expand )

    $AdminNames += $AdminsInGroup
}

$AdminNames = @( $AdminNames | Select -Unique )

Я продолжаю смотреть на твою логику и не могу указать пальцем на то, что я считаю абсолютно неправильным. В основном это было ваше имя $admin, -contains должен проверять, является ли элемент частью массива. От about_Cararison_Operators

Описание: оператор сдерживания. Сообщает, включает ли коллекция эталонных значений одно тестовое значение

Однако вы могли бы иметь оба $adminnames а также $admin быть массивами. Сначала твой dsquery вернется и массив DistinguishedName"S. Для того, чтобы ваша логика работала, вам пришлось бы перебирать каждый из них, чтобы -contains делай то, что ожидаешь тоже.

Вы должны использовать dsquery за эту информацию? Некоторые из встроенных командлетов справятся с этим легко.

$groups = @("group 1","group 2")
$groups | ForEach-Object{Get-ADGroupMember -Identity $_} | Sort-Object -Unique | Select -ExpandProperty DistinguishedName

Если вы хотите использовать dsquery до сих пор я бы все еще использовать Sort-Object,

foreach ($adming in $admingroups) { 
     $adminnames += (&dsquery group -samid $adming -limit 0 | dsget group -members -expand)
}
$adminnames | Sort-Object -Unique 

Если вы хотели узнать о дубликатах, похожих на те, которые у вас уже есть, вы можете просто сравнить их.

$uniqueAdminNames = $adminnames | Sort-Object -Unique
Write-Host "Ignored $($adminnames.Count - $uniqueAdminNames.Count) duplicate(s)"
Другие вопросы по тегам