2014-10-07 2 views
0

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

$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 
    } 
} 

ответ

0

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

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

В этом случае вопрос заключается в том, что вы пропустили цикл 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 имеет "Уникально" параметр:

$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) 
+0

Спасибо! оба работали с разбивкой! – Tombomb

+0

Кроме того, рассмотрите возможность установки средств администрирования удаленного сервера, затем вы можете импортировать модуль ActiveDirectory и начать работу. Я тоже ИТ-парень, и я использую его каждый день. Ссылки: [Ссылка для скачивания] (http://www.microsoft.com/en-us/download/details.aspx?id=7887) [Информационная ссылка] (http://technet.microsoft.com/en-us /library/ee449475%28v=WS.10%29.aspx) –

+0

@Matt, мой PowerShell 2.0 не показывает такого требования 'Get-Help Select -Full', равно как и в документации 3.0: [Technet] (http://technet.microsoft.com/en-us/library/hh849895(v=wps.620).aspx). –

0

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

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

Однако вы могли бы иметь как $adminnames и $admin быть массивами. Сначала ваш dsquery вернется и массив DistinguishedName. Чтобы ваша логика работала, вам нужно было бы пройти через каждый, чтобы -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)" 
Смежные вопросы