Вопрос или проблема
Я относительно новичок в PowerShell, и у меня есть два выражения в командной строке:
get-adgroupmember <имя группы> | select-object name,samaccountname
Чтобы получить таблицу с двумя столбцами: реальным именем человека и его именем пользователя.
get-adgroupmember <имя группы> | get-adprincipalgroupmembership | select-object name
Чтобы получить список групп, к которым принадлежит каждый пользователь в указанной группе.
Я хотел бы комбинировать эти два выражения, чтобы получить реальное имя пользователя + имя пользователя, а затем группы, к которым они принадлежат для каждого пользователя, например:
name samaccountname memberof
---- -------------- --------
joe bloggs jbloggs group1
group2
groupq
bob laithwaite blaithwaite group2
groupm
groupp
groupq
или, возможно, так:
joe bloggs jbloggs
group1
group2
groupq
bob laithwaite blaithwaite
group2
groupm
groupp
groupq
Существует ли простой способ это сделать? Я не слишком озабочен тем, чтобы это было красиво.
Если нет простого способа, может кто-то подсказать, как я могу сделать это сложным способом? Если есть только сложный способ, то хотя бы работающий ответ был бы хорош, но я предпочел бы иметь подсказки, с чего начать, чтобы увидеть, смогу ли я сделать что-то сам. В конце концов, я все еще учусь.
Мой первоначальный поиск в Google нашел https://gallery.technet.microsoft.com/scriptcenter/Powershell-Get-users-who-b0420fe1, но я не смог заставить его работать в командной строке, заменив переменные фиксированными строками. Это именно то, что я в конечном итоге хочу достичь, но только с 2 группами, однако в первый раз я хочу начать с чего-то вроде приведенного выше вывода.
Я также нашел Как я могу сгенерировать список групп безопасности, к которым принадлежат набор пользователей? в процессе написания этого вопроса, но это просто, похоже, выдает подобный список тому, который я создал во втором выражении командной строки, то есть том, который использует get-adprincipalgroupmembership.
В вашем посте вы не указали, откуда берется ваш список пользователей. Похоже, вы получаете пользователей одной группы и смотрите, к каким еще группам они принадлежат. Это в основном не имеет значения для решения, так что я предположу, что у вас есть список $users
и продолжу оттуда.
Что вы хотите сделать, так это объединить свойства из двух команд в один выходной поток. Это можно сделать, используя Вычисляемые свойства следующим образом…
$Users | %{Select DisplayName,SamAccountName,@{N="Groups";E={(Get-ADuser $_.SamAccountName -Properties memberof).memberof}}}
Вы также можете использовать подход, подобный этому:
Get-ADGroupMember $GroupName | %{Get-ADUser $_.SamAccountName -Properties memberof | Select Name, SamAccountName, memberof}
Вы можете попробовать вот так, это даст вам список пользователей со всеми группами, к которым они принадлежат:
$users = get-content \\filepath.txt
foreach($u in $users){
$report += Get-Aduser $u -properties memberof| Get-ADGroup |select-object @{N="GroupName";E={$_.samaccountname}},@{N="username";E={$u}}
}
$report | Export-csv \\filepath.csv
Ответ или решение
Вопрос о том, как с помощью PowerShell вывести список пользователей, их имена и группы, к которым они принадлежат, весьма актуален для специалистов в области информационных технологий. Давайте разберем все шаги, необходимые для достижения этой цели.
Введение
PowerShell предоставляет мощные инструменты для взаимодействия с Active Directory (AD). Для решения вашей задачи необходимо использовать комбинацию командлетов, которые позволят нам получить информацию о членстве пользователей в группах в формате, удобном для анализа.
Шаги для решения
1. Получение членов группы
Сначала вам нужно использовать командлет Get-ADGroupMember
, чтобы получить пользователей из указанной группы. Предположим, что вы хотите получить пользователей из группы под названием GroupName
:
$groupName = "GroupName"
$members = Get-ADGroupMember -Identity $groupName
2. Получение групп для каждого пользователя
Далее, мы будем получать информацию о группах, в которых состоит каждый пользователь. Мы можем использовать Get-ADUser
для извлечения свойства MemberOf
:
$report = @()
foreach ($member in $members) {
$user = Get-ADUser -Identity $member.SamAccountName -Properties MemberOf
$groups = $user.MemberOf | ForEach-Object { $_ -replace 'CN=([^,]+),.*', '$1' } # Извлечение имени группы
foreach ($group in $groups) {
$report += [PSCustomObject]@{
Name = $user.Name
SamAccountName = $user.SamAccountName
GroupName = $group
}
}
}
3. Форматирование и вывод результата
Завершающим шагом будет форматирование результатов. Используем встроенные возможности PowerShell для отображения:
$report | Format-Table -AutoSize
Это создаст таблицу, показывающую имена пользователей, их учетные записи и соответствующие группы.
Итоговый скрипт
Вот объединенный пример всего описанного выше:
# Укажите имя группы
$groupName = "GroupName"
# Получаем членов группы
$members = Get-ADGroupMember -Identity $groupName
$report = @()
foreach ($member in $members) {
$user = Get-ADUser -Identity $member.SamAccountName -Properties MemberOf
$groups = $user.MemberOf | ForEach-Object { $_ -replace 'CN=([^,]+),.*', '$1' }
foreach ($group in $groups) {
$report += [PSCustomObject]@{
Name = $user.Name
SamAccountName = $user.SamAccountName
GroupName = $group
}
}
}
# Вывод результата
$report | Format-Table -AutoSize
Заключение
С помощью данного скрипта вы сможете выводить полную информацию о пользователях и их группах в удобном формате. С комбинацией Get-ADGroupMember
и Get-ADUser
, а также построением объектов в PowerShell, вы получите необходимый результат.
Если необходимо внести изменения или улучшения, этот скрипт легко модифицируется под ваши нужды. Надеюсь, информация была полезной и поможет вам в вашей работе с PowerShell и Active Directory.