Список усіх груп та їх членів з PowerShell на Win2008r2


14

Я новачок у powerhell, але я читав посібники та трохи практикувався. Моя мета - перерахувати всіх користувачів у всіх групах безпеки за вказаним шляхом. Я знайшов спосіб це зробити:

 get-adgroup -Filter * -SearchBase "OU=Groups,DC=corp,DC=ourcompany,DC=Com"  | %{Get-ADGroupMember $_.name} | ft name

Але проблема в тому, що я не бачу назви групи. Я отримую лише купу користувачів. Було б добре, якби хтось міг сказати мені, як відобразити назву групи, перш ніж всі члени цієї групи потраплять до списку. Спасибі.


2
Якщо ви розігруєтесь зі зміною після бази пошуку, % { "GroupName: $($_.Name)"; "==========" ; Get-ADGroupMember $_ } | ft nameтоді ви можете отримати те, що вам потрібно. Відповідь Райана все-таки краща, але це єдиний рядок, якщо ви цього хочете.
TheCleaner

Дякую TheCleaner. Як я вже сказав, я новачок у PS, але ці приклади дуже допомагають зрозуміти.
Алек Т

Ваш приклад також чудово працює!
Алек Т

Відповіді:


26

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команді Cmdlet. Хороша річ у тому, що вона вдвічі зменшує кількість дзвінків, які ви повинні здійснити до AD, що повинно зробити ваш сценарій швидшим, і це полегшить навантаження на контролер домену.

  • $ G.Members відобразить усіх членів групи $ G ... у Powershell 3. У Powershell 2 вам може знадобитися ще один Foreach всередині Foreach, щоб перерахувати його через членів групи. ( Йо дауг, я чув, як ти любиш петлі ... )

  • Я використовую Write-Hostтут, що є валовим. Вам ніколи не слід користуватися Write-Host. Натомість ви повинні будувати та виводити об’єкти, а не текст, але це була зовсім інша тема, і я був ледачий, щоб зробити це для цієї відповіді.


10

Ось набагато краще рішення. Це помістить усе в 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

Можливо, можливо додати 400 користувачів у групу та витягнути дані з файлу csv чи xlsx?
Кікенет

Вибачте за моє невігластво, але, в якому язиці ваш код?
ScottC

вибачте за мої коментарі запізнення, але повноваження було мовою
Райлі Керні

1

Я повинен був додати .nameпісля того, як $groupзробити цю роботу для мене.

$Arrayofmembers = Get-ADGroupMember -identity $Group.name -recursive | select name,samaccountname

0

Якщо ви коли-небудь зіткнетеся з Size Limitпроблемою з групами, що містять понад 5000 членів, ви можете змінити один рядок наступним чином:

$Arrayofmembers = (Get-ADGroup $Group -Properties member).member | Get-ADUser -Properties *

0

Ось сценарії, які експортують усі групи в ОУ в окремий файл для кожної групи з назвою групи та описом. Якщо хтось хоче цього ..

$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
  }
}   
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.