Я новичок в PowerShell, но я читал руководства и немного практиковался. Моя цель - составить список всех пользователей во всех группах безопасности по указанному пути. Я нашел способ сделать это:
get-adgroup -Filter * -SearchBase "OU=Groups,DC=corp,DC=ourcompany,DC=Com" | %{Get-ADGroupMember $_.name} | ft name
Но проблема в том, что я не вижу названия группы. Все, что у меня есть, - это группа пользователей. Было бы неплохо, если бы кто-нибудь мог сказать мне, как отображать название группы до того, как все члены этой группы будут перечислены. Спасибо.
Gimme the codes!
полномочия, активируйте!
$Groups = Get-ADGroup -Properties * -Filter * -SearchBase "OU=Groups,DC=corp,DC=ourcompany,DC=Com"
Foreach($G In $Groups)
{
Write-Host $G.Name
Write-Host "-------------"
$G.Members
}
Дело в том, что просто не торопитесь и разбейте его на шаги. Я знаю, что с Powershell интересно попытаться уместить все, включая кухонную раковину, в единое целое, но это ни в коем случае не требуется.
Несколько примечаний:
Вам не нужно делать Get-ADGroupMember
если вы собираете свойство Members в начальном Get-ADGroup
Командлет. Преимущество этого заключается в том, что он вдвое сокращает количество обращений к AD, что должно ускорить выполнение сценария и облегчает нагрузку на контроллер домена.
$ G.Members отобразит всех членов группы $ G ... в Powershell 3. В Powershell 2 вам все равно может потребоваться поместить еще один объект Foreach внутри объекта Foreach для перечисления членов группы. (Эй, чувак, я слышал, ты любишь петли ...)
я использую Write-Host
здесь, что отвратительно. Вы никогда не должны использовать Write-Host
. Вместо этого вы должны создавать и выводить объекты, а не текст, но это была совершенно другая тема, и мне было лень делать это для этого ответа.
Вот гораздо лучшее решение. Это поместит все в 3 столбца csv с именем группы, именем пользователя и именем учетной записи sam. Когда в группе 400 пользователей, гораздо проще определить, в какой группе находится кто-то, так как вам не нужно прокручивать.
Import-Module ActiveDirectory
$Groups = (Get-AdGroup -filter * | Where {$_.name -like "**"} | select name -ExpandProperty name)
$Table = @()
$Record = @{
"Group Name" = ""
"Name" = ""
"Username" = ""
}
Foreach ($Group in $Groups) {
$Arrayofmembers = Get-ADGroupMember -identity $Group -recursive | select name,samaccountname
foreach ($Member in $Arrayofmembers) {
$Record."Group Name" = $Group
$Record."Name" = $Member.name
$Record."UserName" = $Member.samaccountname
$objRecord = New-Object PSObject -property $Record
$Table += $objrecord
}
}
$Table | export-csv "C:\temp\SecurityGroups.csv" -NoTypeInformation
Мне пришлось добавить .name
после $group
чтобы заставить это работать для меня.
$Arrayofmembers = Get-ADGroupMember -identity $Group.name -recursive | select name,samaccountname
Если вы когда-нибудь столкнетесь с Size Limit
проблема с группами, содержащими более 5000 участников, вы можете изменить одну строку следующим образом:
$Arrayofmembers = (Get-ADGroup $Group -Properties member).member | Get-ADUser -Properties *
Вот скрипт, который экспортирует все группы в OU в отдельный файл для каждой группы с именем и описанием группы. Если кто-то этого хочет ..
$groups = Get-ADGroup -filter * -SearchBase "OU=XXX, DC=XX,DC=XX"
ForEach ($g in $groups)
{
$path = "c:\scripts\" + $g.Name + ".csv"
Get-ADGroup -Identity $g.Name -Properties * | select name,description | Out-File $path -Append
$results = Get-ADGroupMember -Identity $g.Name -Recursive | Get-ADUser -Properties displayname, name
ForEach ($r in $results){
New-Object PSObject -Property @{
DisplayName = $r.displayname | Out-File $path -Append
}
}
}