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)"