Liệt kê tất cả các nhóm và thành viên của họ với PowerShell trên Win2008r2


14

Tôi chưa quen với powershell, nhưng tôi đã đọc hướng dẫn và thực hành một chút. Mục tiêu của tôi là Liệt kê tất cả người dùng trong tất cả các Nhóm bảo mật theo đường dẫn được chỉ định. Tôi đã tìm ra cách để làm điều đó:

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

Nhưng vấn đề là tôi không thấy tên nhóm. Tất cả tôi nhận được là một loạt người dùng. Sẽ thật tuyệt nếu ai đó có thể cho tôi biết cách hiển thị tên nhóm trước khi tất cả các thành viên của nhóm này được liệt kê. Cảm ơn.


2
Nếu bạn chơi xung quanh với việc thay đổi sau cơ sở tìm kiếm % { "GroupName: $($_.Name)"; "==========" ; Get-ADGroupMember $_ } | ft namethì bạn cũng có thể nhận được những gì bạn đang theo đuổi. Câu trả lời của Ryan vẫn tốt hơn, nhưng đó là một dòng duy nhất nếu bạn muốn.
TheCleaner

Cảm ơn bạn TheCleaner. Giống như tôi đã nói tôi mới làm quen với PS, nhưng những ví dụ này thực sự giúp ích cho sự hiểu biết.
Alec T

Ví dụ của bạn cũng hoạt động rất tốt!
Alec T

Câu trả lời:


26

Gimme the codes! quyền hạn, kích hoạt!

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

Vấn đề là, chỉ cần dành thời gian của bạn và chia nó thành các bước. Tôi biết rằng thật thú vị khi cố gắng để mọi thứ và bồn rửa trong nhà bếp phù hợp với một lớp lót với Powershell, nhưng không có nghĩa là bắt buộc.

Một vài lưu ý:

  • Bạn không cần phải làm Get-ADGroupMembernếu bạn thu thập tài sản Thành viên trong Get-ADGroupCmdlet ban đầu . Điểm hay của việc này là nó giảm một nửa số lượng cuộc gọi bạn phải thực hiện với AD, điều này sẽ giúp tập lệnh của bạn chạy nhanh hơn và giảm bớt gánh nặng cho bộ điều khiển miền.

  • $ G.Members sẽ hiển thị tất cả các thành viên của nhóm $ G ... trong Powershell 3. Trong Powershell 2, bạn vẫn có thể cần phải đưa một Foreach khác vào Foreach ở đó để liệt kê thông qua các thành viên của nhóm. ( Yo dawg, tôi nghe thấy bạn như vòng lặp ... )

  • Tôi sử dụng Write-Hostở đây, đó là tổng. Bạn không bao giờ nên thực sự sử dụng Write-Host. Thay vào đó, bạn nên xây dựng và xuất ra các đối tượng, không phải văn bản, nhưng đó là một chủ đề hoàn toàn khác và tôi đã quá lười biếng để làm điều đó cho câu trả lời này.


10

Đây là một giải pháp tốt hơn nhiều. Điều này sẽ đặt mọi thứ trong một csv 3 cột với tên nhóm, tên người dùng và tên tài khoản sam. Dễ dàng hơn nhiều để tìm ra ai đó thuộc nhóm nào khi có 400 người dùng trong một nhóm mà bạn không phải cuộn.

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

Có thể thêm 400 người dùng trong một nhóm và bắt dữ liệu từ tệp csv hoặc xlsx?
Kiquenet

xin lỗi vì sự thiếu hiểu biết của tôi, nhưng mã của bạn là gì?
ScottC

xin lỗi vì nhận xét của tôi về độ trễ nhưng powershell là ngôn ngữ
Riley Carney

1

Tôi đã phải thêm .namesau $groupđể thực hiện công việc này cho tôi.

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

0

Nếu bạn từng gặp phải Size Limitvấn đề với các nhóm chứa hơn 5000 thành viên, bạn có thể thay đổi một dòng như sau:

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

0

Dưới đây là tập lệnh xuất tất cả các nhóm trong OU sang tệp riêng biệt cho mỗi nhóm với tên và mô tả nhóm. Nếu ai đó muốn điều đó ..

$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
  }
}   
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.