Làm thế nào để có được tất cả các nhóm mà người dùng là thành viên?


135

Get-ADGroupMemberLệnh ghép ngắn của PowerShell trả về các thành viên của một nhóm cụ thể. Có một cmdlet hoặc tài sản để có được tất cả các nhóm mà một người dùng cụ thể là thành viên của?


Tôi đã sửa lỗi của mình: Get-MembernênGet-ADGroupMember .


Câu hỏi không rõ ràng. Bạn có thể điều chỉnh lại nó hoặc thêm một ví dụ?
Mohit Chakraborty

1
Xem stackoverflow.com/questions/668321/ trên mạngtechnet.microsoft.com/en-us/l Library / dd315351.aspx . Bạn có chắc chắn Thành viên làm những gì bạn nghĩ nó làm?
tiago2014

@Mohit Chakraborty Bây giờ đã rõ ràng hơn?
Primoz

1
bạn có thể nhanh chóng sử dụng net user /domain username, kiểm tra các phương thức khác tại Get Groups trong đó người dùng là thành viên Sử dụng PowerShell
Mohamed

Câu trả lời:


282

Get-ADPrincipalgroupMembership sẽ làm điều này.

Get-ADPrincipalGroupMembership username | select name

name
----
Domain Users
Domain Computers
Workstation Admins
Company Users
Company Developers
AutomatedProcessingTeam

1
Điều này chỉ giúp tôi tránh sử dụng phương pháp phức tạp và dài dòng nhất để tìm ra phương pháp này. Được biết rằng powershell sẽ có một cái gì đó như thế này nhưng không thể tìm thấy nó ở bất cứ đâu. +1
Tim Alexander

7
Lưu ý rằng điều này phụ thuộc vào mô-đun ActiveDirectory có sẵn. Điều đó không nhất thiết phải hoạt động trên máy khách khi bạn đang chạy tập lệnh PowerShell hoặc trên máy khách tải xuống. Nếu bạn muốn làm điều đó, sử dụng giải pháp này .
Daniel.S

5
Ở trên đã cho tôi các lỗi ("Máy chủ không thể xử lý yêu cầu do lỗi nội bộ" - có lẽ chức năng không có sẵn trên máy chủ). get-aduser $username -Properties memberof | select -expand memberoflàm việc tốt mặc dù.
JohnLBevan 16/2/2015

5
Nếu bạn đang sử dụng máy trạm Windows 10 chứ không phải máy chủ, hãy cài đặt RSAT từ đây , sau đó nhập import-module activedirectoryvào dòng lệnh powershell, sau đó sẽ chạy.
James Toomey

3
Nếu mô-đun chưa được cài đặt: Cài đặt-WindowsFeature RSAT-AD-PowerShell
Preben Huybrechts

81

Một dòng, không có mô-đun cần thiết, sử dụng người dùng đã đăng nhập hiện tại:

(New-Object System.DirectoryServices.DirectorySearcher("(&(objectCategory=User)(samAccountName=$($env:username)))")).FindOne().GetDirectoryEntry().memberOf

Qudos cho bài viết vbs / powershell này: http://technet.microsoft.com/en-us/l Library / ff730963.aspx


5
Cảm ơn bạn, tôi đánh giá cao phiên bản không có mô-đun này. Tôi chỉ đơn giản là thay đổi biến từ $env:usernamesang $usernamevà thiết lập $username = "testuser"để dễ dàng thay thế biến cho các tra cứu người dùng khác.
dự án

Chỉ cần googled đường của tôi trở lại đây một lần nữa! Vẫn hữu ích trong các tình huống ngẫu nhiên khi các công cụ AD không có sẵn.
Nathan

43

Một thay thế ngắn gọn hơn cho một cái được đăng bởi Canoas, để có được tư cách thành viên nhóm cho người dùng hiện đang đăng nhập.

Tôi đã xem qua phương pháp này trong bài đăng trên blog này: http://www.travisrunyard.com/2013/03/26/auto-create-outlook-mapi-user-profiles/

([ADSISEARCHER]"samaccountname=$($env:USERNAME)").Findone().Properties.memberof

Một phiên bản thậm chí còn tốt hơn sử dụng biểu thức chính quy để loại bỏ guff LDAP và chỉ để lại tên nhóm:

([ADSISEARCHER]"samaccountname=$($env:USERNAME)").Findone().Properties.memberof -replace '^CN=([^,]+).+$','$1'

Thông tin chi tiết về cách sử dụng trình tăng tốc loại [ADSISEARCHER] có thể được tìm thấy trên blog của anh chàng kịch bản: http://blogs.technet.com/b/heyscriptingguy/archive/2010/08/24/use-the-powershell-adsisearcher-type -accelerator-to-search-active-library.aspx


1
Cả hai đều cho tôi lỗi: Ngoại lệ gọi "FindOne" với (0) đối số: "samaccountname = bộ lọc tìm kiếm không hợp lệ."
Dallas

Lạ thật .... Tôi vừa thử lại lần nữa, nhưng trên Windows 7 trong một môi trường hoàn toàn khác, và nó cũng hoạt động tốt ở đây.
Daniel.S

Tôi đã thử lại ngay bây giờ, vẫn trên Win 7, và nó hoạt động tốt. Có lẽ tôi đã mắc lỗi đánh máy khi lần đầu tiên thử nó. Cảm ơn bạn đã thêm thay thế để loại bỏ "guff" rừng.
Dallas

2
Hoạt động tuyệt vời, nối | Sort-Objectđể làm cho nó thậm chí dễ đọc hơn.
Martin Hollingsworth

31

Cách học cũ từ CMD:

net user mst999 /domain 

1
nó cũng hoạt động trên các máy khách mà không cần thêm công cụ quảng cáo
Rast

4
Thật không may - nếu tên nhóm của bạn dài (ví dụ> 21 ký tự) thì nó sẽ cắt bớt chúng ...
kiltannen

rằng một trong những cách khác nhau! Bravo
StayCool

24
(GET-ADUSER Identity USERNAME Properties MemberOf | Select-Object MemberOf).MemberOf

Cảm ơn! cái này hiệu quả chỉ có nhược điểm là giá trị trả về là một chuỗi.
shaiss

3
| get-adgroup sẽ xuất các đối tượng nhóm. Xuất sắc!
8DH

1
hoặc, sử dụng $ env: USERNAME thay vào đó để lấy tên người dùng của người dùng hiện đang đăng nhập
Dave Lucre

6

Nếu bạn không thể để Get-ADPrincipalgroupMembership hoạt động, bạn có thể thử đăng nhập với tư cách người dùng đó sau đó sử dụng.

$id = [Security.Principal.WindowsIdentity]::GetCurrent()
$groups = $id.Groups | foreach-object {$_.Translate([Security.Principal.NTAccount])}
$groups | select *

Bạn không cần phải đăng nhập với tư cách là người dùng nếu bạn sử dụng một cái gì đó như$id = [Security.Principal.WindowsIdentity]("username")
Bitcoin Murderous Maniac

1
Điều này rút ngắn độc đáo cho một lớp lót [System.Security.Principal.WindowsIdentity]::GetCurrent().Groups | % {$_.Translate([Security.Principal.NTAccount])}.
alx9r

5

Nhận thành viên nhóm cho người dùng:

$strUserName = "Primoz"
$strUser = get-qaduser -SamAccountName $strUserName
$strUser.memberof

Xem Nhận thành viên nhóm cho người dùng

Nhưng cũng xem các Lệnh PowerShell miễn phí của Quest cho Active Directory .

[ Chỉnh sửa : Lệnh Get-ADPrincipalgroupMembership được bao gồm trong Powershell kể từ v2 với Windows 2008 R2. Xem câu trả lời của kstrauss bên dưới.]


2
Trên thực tế, có một cách dễ dàng hơn với các lệnh ghép ngắn của Quest: Get-QADgroup -Contains Primoz
fenster

18
Đây không còn là câu trả lời hay nhất vì Get-ADPrincipalgroupMembership hiện được tích hợp vào PowerShell
Rob Cannon

1
Bỏ phiếu xuống vì sẽ tốt hơn nhiều nếu sử dụng Get-ADPrincipalgroupMembership. Tôi muốn hoàn tác downvote này, nhưng tôi không thể. Tôi sẽ chỉnh sửa câu trả lời để chỉ ra rằng tùy chọn tích hợp sẵn tồn tại.
Áp-ra-ham

4

Get-Memberlà một lệnh ghép ngắn để liệt kê các thành viên của .NET object. Điều này không có gì để làm với thành viên người dùng / nhóm. Bạn có thể có được thành viên nhóm người dùng hiện tại như vậy:

PS> [System.Security.Principal.WindowsIdentity]::GetCurrent().Groups | 
         Format-Table -auto

BinaryLength AccountDomainSid    Value
------------ ----------------    -----
          28 S-1-5-21-...        S-1-5-21-2229937839-1383249143-3977914998-513
          12                     S-1-1-0
          28 S-1-5-21-...        S-1-5-21-2229937839-1383249143-3977914998-1010
          28 S-1-5-21-...        S-1-5-21-2229937839-1383249143-3977914998-1003
          16                     S-1-5-32-545
...

Nếu bạn cần quyền truy cập vào thông tin nhóm của người dùng tùy ý thì đề xuất @tiagoinu về việc sử dụng các lệnh ghép ngắn Quest AD là cách tốt hơn để sử dụng.


4

Đầu tiên, nhập mô-đun kích hoạt:

import-module activedirectory

Sau đó ban hành lệnh này:

Get-ADGroupMember -Identity $group | foreach-object {
    Write-Host $_.SamAccountName
}

Điều này sẽ hiển thị các thành viên của nhóm được chỉ định.


OP yêu cầu ngược lại. Nhận tất cả các nhóm một người dùng được chỉ định là thành viên của.
8DH

4

Không cần kịch bản dài khi nó là một lớp lót đơn giản ..

Lệnh QUEST

(Get-QADUser -Identity john -IncludedProperties MemberOf | Select-Object MemberOf).MemberOf

Lệnh MS AD

(GET-ADUSER Identity john Properties MemberOf | Select-Object MemberOf).MemberOf

Tôi thấy cmd MS AD nhanh hơn nhưng một số người thích Quest hơn ..

Steve


4

Thành viên không phải là thành viên nhóm của người dùng. Nếu bạn muốn nhận danh sách các nhóm mà người dùng thuộc về hệ thống cục bộ, bạn có thể thực hiện bằng cách:

$query = "ASSOCIATORS OF {Win32_Account.Name='DemoUser1',Domain='DomainName'} WHERE ResultRole=GroupComponent ResultClass=Win32_Account"

Get-WMIObject -Query $query | Select Name

Trong truy vấn trên, thay thế DemoUser1 bằng tên người dùng bạn muốn và Tên miền bằng tên máy tính hoặc tên miền cục bộ của bạn.


Truy vấn này rất tốn thời gian và phản hồi rất chậm khi có nhiều người dùng và nhóm trong môi trường
randeepsp

Bất cứ ai đang chỉnh sửa câu trả lời, hãy chắc chắn rằng bạn chỉnh sửa nó đúng cách. Tôi đã đề nghị OP thay thế DemoUser1 bằng bất kỳ tên người dùng nào anh ta muốn. Và, bạn đã thay đổi hoàn toàn ý nghĩa đó.
rastaanth 28/03/2015

4

Sử dụng:

Get-ADPrincipalGroupMembership username | select name | export-CSV username.csv

Ống này xuất đầu ra của lệnh vào một tệp CSV .


4

Điều này sẽ cung cấp cho bạn các chi tiết cho người dùng hiện tại. Powershell không cần thiết.

whoami /groups


3

Nó chỉ là một dòng:

(get-aduser joe.bloggs -properties *).memberof

cuối của :)


Đường ống dẫn đến a select -expandproperty memberofsẽ làm cho đầu ra dễ đọc / hữu ích hơn một chút.
Ben Thul 7/07/2016

2

Tôi đã viết một hàm PowerShell có tên Get-ADPrincipalgroupMembershipRecursive. Nó chấp nhận DSN của tài khoản người dùng, máy tính, nhóm hoặc dịch vụ. Nó lấy danh sách ban đầu của các nhóm từ thuộc tính thành viên của tài khoản, sau đó kiểm tra đệ quy các thành viên của nhóm đó. Mã viết tắt là dưới đây. Mã nguồn đầy đủ với ý kiến ​​có thể được tìm thấy ở đây .

function Get-ADPrincipalGroupMembershipRecursive( ) {

    Param(
        [string] $dsn,
        [array]$groups = @()
    )

    $obj = Get-ADObject $dsn -Properties memberOf

    foreach( $groupDsn in $obj.memberOf ) {

        $tmpGrp = Get-ADObject $groupDsn -Properties memberOf

        if( ($groups | where { $_.DistinguishedName -eq $groupDsn }).Count -eq 0 ) {
            $groups +=  $tmpGrp           
            $groups = Get-ADPrincipalGroupMembershipRecursive $groupDsn $groups
        }
    }

    return $groups
}

# Simple Example of how to use the function
$username = Read-Host -Prompt "Enter a username"
$groups   = Get-ADPrincipalGroupMembershipRecursive (Get-ADUser $username).DistinguishedName
$groups | Sort-Object -Property name | Format-Table

2

Dưới đây hoạt động tốt:

get-aduser $username -Properties memberof | select -expand memberof

Nếu bạn có một danh sách người dùng:

$list = 'administrator','testuser1','testuser2'
$list | `
    %{  
        $user = $_; 
        get-aduser $user -Properties memberof | `
        select -expand memberof | `
        %{new-object PSObject -property @{User=$user;Group=$_;}} `
    }

1

Get-QADUser -SamAccountName Đăng nhậpID | % {$ _. Thành viênOf} | Get-QADgroup | chọn tên


1

Tôi không thể có được những điều sau đây để làm việc cho một người dùng cụ thể:

Get-ADPrincipalGroupMembership username

Nó đã ném một lỗi mà tôi không sẵn sàng để khắc phục sự cố.

Tuy nhiên, tôi đã đưa ra một giải pháp khác bằng cách sử dụng Get-ADUser. Tôi thích nó hơn một chút vì nếu bạn không biết tên tài khoản thì bạn có thể lấy nó dựa trên ký tự đại diện trên tên thật của người dùng. Chỉ cần điền PartOfUsersName và đi.

#Get the groups that list of users are the member of using a wildcard search

[string]$UserNameLike = "*PartOfUsersName*" #Use * for wildcards here
[array]$AccountNames = $(Get-ADUser -Filter {Name -like $UserNameLike}).SamAccountName

ForEach ($AccountName In $AccountNames) {
Write-Host "`nGETTING GROUPS FOR" $AccountName.ToUpper() ":"
(Get-ADUser -Identity $AccountName -Properties MemberOf|select MemberOf).MemberOf|
    Get-ADGroup|select Name|sort name
    }

Đạo cụ khổng lồ cho schmeckendeugler và 8DH đã đưa tôi đến giải pháp này. +1 cho cả hai bạn.


1

Trong khi có rất nhiều câu trả lời xuất sắc ở đây, có một câu mà cá nhân tôi đang tìm kiếm đã bị thiếu. Khi tôi đã tìm ra nó - tôi nghĩ rằng tôi nên đăng nó trong trường hợp tôi muốn tìm nó sau, hoặc nó thực sự có thể giúp đỡ người khác vào một lúc nào đó:

Get-ADPrincipalGroupMembership username | Format-Table -auto

Cách tiếp cận thứ hai để trình bày điều này là chỉ định các cột riêng lẻ mà bạn quan tâm, ví dụ:

Get-ADPrincipalGroupMembership username | select name, GroupScope, GroupCategory

Điều này cung cấp cho tất cả các nhóm AD tên người dùng thuộc về - nhưng cũng trình bày tất cả các thuộc tính mặc định của mỗi nhóm được định dạng độc đáo dưới dạng bảng.

Lợi ích chính mà điều này mang lại cho bạn là bạn có thể thấy trong nháy mắt đó là danh sách phân phối và nhóm bảo mật. Bạn có thể thấy rõ hơn trong nháy mắt là Universal, đó là DomainLocal & Global.
Tại sao bạn quan tâm đến bit cuối cùng này?

  • Nhóm chung là nhóm bảo mật hoặc phân phối có chứa người dùng, nhóm và máy tính từ bất kỳ miền nào trong khu rừng của nó với tư cách là thành viên. Bạn có thể cung cấp quyền và quyền của nhóm bảo mật toàn cầu đối với tài nguyên trong bất kỳ miền nào trong rừng.
  • Nhóm toàn cầu là một nhóm có thể được sử dụng trong miền riêng của mình, trong các máy chủ thành viên và tại các máy trạm của miền và trong các miền tin cậy. Trong tất cả các địa điểm đó, bạn có thể cung cấp quyền và quyền của nhóm toàn cầu và nhóm toàn cầu có thể trở thành thành viên của các nhóm địa phương. Tuy nhiên, một nhóm toàn cầu có thể chứa các tài khoản người dùng chỉ từ tên miền của chính nó.
  • Nhóm cục bộ miền là một nhóm bảo mật hoặc phân phối có thể chứa các nhóm phổ quát, các nhóm toàn cầu, các nhóm cục bộ miền khác từ tên miền của chính nó và các tài khoản từ bất kỳ miền nào trong rừng. Bạn có thể cấp cho các quyền và quyền của nhóm bảo mật cục bộ đối với các tài nguyên chỉ nằm trong cùng một miền nơi đặt nhóm cục bộ miền.

0
Import-Module ActiveDirectory
Get-ADUser -SearchBase "OU=Users,DC=domain,DC=local" -Filter * | foreach-object {
write-host "User:" $_.Name -foreground green
    Get-ADPrincipalGroupMembership $_.SamAccountName | foreach-object {
        write-host "Member Of:" $_.name
    }
}

Thay đổi giá trị của -SearchBase để phản ánh OU bạn cần liệt kê người dùng từ :)

Điều này sẽ liệt kê tất cả người dùng trong OU đó và cho bạn biết họ là thành viên của nhóm nào.



0
   Get-ADUser -Filter { memberOf -RecursiveMatch "CN=Administrators,CN=Builtin,DC=Fabrikam,DC=com" } -SearchBase "CN=Administrator,CN=Users,DC=Fabrikam,DC=com"  -SearchScope Base
                  ## NOTE: The above command will return the user object (Administrator in this case) if it finds a match recursively in memberOf attribute. 

0

Đây là cách đơn giản nhất để chỉ lấy tên:

Get-ADPrincipalGroupMembership "YourUserName"

# Returns distinguishedName : CN=users,OU=test,DC=SomeWhere GroupCategory : Security GroupScope : Global name : testGroup objectClass : group objectGUID : 2130ed49-24c4-4a17-88e6-dd4477d15a4c SamAccountName : testGroup SID : S-1-5-21-2114067515-1964795913-1973001494-71628

Thêm một câu lệnh chọn để cắt bớt phản hồi hoặc để đưa mọi người dùng vào OU mỗi nhóm mà họ là người dùng của:

foreach ($user in (get-aduser -SearchScope Subtree -SearchBase $oupath -filter * -Properties samaccountName, MemberOf | select samaccountName)){ Get-ADPrincipalGroupMembership $user.samaccountName | select name}


0

Để có được đệ quy, bạn có thể sử dụng:

<# 
    .SYNOPSIS   
        Get all the groups that a user is MemberOf.

    .DESCRIPTION
        This script retrieves all the groups that a user is MemberOf in a recursive way.

    .PARAMETER SamAccountName
        The name of the user you want to check #>

Param (
    [String]$SamAccountName = 'test',
    $DomainUsersGroup = 'CN=Domain Users,CN=Users,DC=domain,DC=net'
)


Function Get-ADMemberOf {
    Param (
        [Parameter(ValueFromPipeline)]
        [PSObject[]]$Group,
        [String]$DomainUsersGroup = 'CN=Domain Users,CN=Users,DC=grouphc,DC=net'
    )
    Process {
        foreach ($G in $Group) {
            $G | Get-ADGroup | Select -ExpandProperty Name
            Get-ADGroup $G -Properties MemberOf| Select-Object Memberof | ForEach-Object {
                Get-ADMemberOf $_.Memberof
            }
        }
    }
}


$Groups = Get-ADUser $SamAccountName -Properties MemberOf | Select-Object -ExpandProperty MemberOf
$Groups += $DomainUsersGroup
$Groups | Get-ADMemberOf | Select -Unique | Sort-Object

0

Hầu hết tất cả các giải pháp trên đều sử dụng ActiveDirecotry mô-đun có thể không có sẵn theo mặc định trong hầu hết các trường hợp.

Tôi đã sử dụng phương pháp dưới đây. Một chút gián tiếp, nhưng phục vụ mục đích của tôi.

Liệt kê tất cả các nhóm có sẵn

Get-WmiObject -Class Win32_Group

Và sau đó liệt kê các nhóm người dùng thuộc về

[System.Security.Principal.WindowsIdentity]::GetCurrent().Groups

So sánh sau đó có thể được thực hiện thông qua kiểm tra thông qua SIDs. Điều này làm việc cho người dùng đăng nhập. Xin hãy sửa tôi nếu tôi sai. Hoàn toàn mới đối với PowerShell, nhưng phải hoàn thành công việc này cho một cam kết công việc.


Nếu bạn đang kiểm tra người dùng đã là thành viên của nhóm Quản trị viên, hãy đảm bảo khởi động PowerShell bằng "Chạy với tư cách quản trị viên", nếu không các nhóm sẽ không được liệt kê chính xác cho lệnh thứ 2 ... mất khá nhiều thời gian để tìm ra cái này ra ... cửa sổ ...
Ruifeng Ma

0

Với định dạng đầu vào của người dùng và định dạng đầu ra ưa thích:

[CmdletBinding(SupportsShouldProcess=$True)] 
Param( 
    [Parameter(Mandatory = $True)] 
    [String]$UserName 
) 
Import-Module ActiveDirectory 
If ($UserName) { 
    $UserName = $UserName.ToUpper().Trim() 
    $Res = (Get-ADPrincipalGroupMembership $UserName | Measure-Object).Count 
    If ($Res -GT 0) { 
        Write-Output "`n" 
        Write-Output "$UserName AD Group Membership:" 
        Write-Output "===========================================================" 
        Get-ADPrincipalGroupMembership $UserName | Select-Object -Property Name, GroupScope, GroupCategory | Sort-Object -Property Name | FT -A 
    } 
}

0

Đặt cái này ở đây để tham khảo trong tương lai. Tôi đang ở giữa một cuộc di chuyển email. Tôi cần biết từng tài khoản người dùng và thành viên nhóm tương ứng, và tôi cũng cần biết từng nhóm và các thành viên tương ứng.

Tôi đang sử dụng khối mã bên dưới để xuất CSV cho mỗi thành viên nhóm của người dùng.

Get-ADUser -Filter * |`
  ForEach-Object { `
    $FileName = $_.SamAccountName + ".csv" ; `
    $FileName ; `
    Get-ADPrincipalGroupMembership $_ | `
      Select-Object -Property SamAccountName, name, GroupScope, GroupCategory | `
        Sort-Object -Property SamAccountName | `
          Export-Csv -Path $FileName -Encoding ASCII ; `
  }

Quá trình xuất khẩu cho các nhóm và các thành viên tương ứng của họ có một chút phức tạp, nhưng các công việc dưới đây. Tên tệp đầu ra bao gồm loại nhóm. Do đó, các nhóm phân phối email tôi cần là / nên là các nhóm Phân phối Toàn cầu và Toàn cầu. Tôi có thể chỉ cần xóa hoặc di chuyển các tệp TXT kết quả mà tôi không cần.

Get-ADGroup -Filter * | `
 Select-Object -Property Name, DistinguishedName, GroupScope, GroupCategory | `
  Sort-Object -Property GroupScope, GroupCategory, Name | `
   Export-Csv -Path ADGroupsNew.csv -Encoding ASCII

$MyCSV = Import-Csv -Path .\ADGroupsNew.csv -Encoding ASCII

$MyCSV | `
 ForEach-Object { `
  $FN = $_.GroupScope + ", " + $_.GroupCategory + ", " + $_.Name + ".txt" ; `
  $FN ; `
  Get-ADGroupMember -Identity $_.DistinguishedName | `
   Out-File -FilePath $FN -Encoding ASCII ; $FN=""; `
  }

0

Nghiên cứu tất cả các ý kiến ​​trình bày đã cho tôi một điểm khởi đầu (cảm ơn vì như vậy) nhưng để lại cho tôi một số vấn đề chưa được giải quyết. Kết quả ở đây là câu trả lời của tôi. Đoạn mã được cung cấp làm nhiều hơn một chút so với những gì được yêu cầu nhưng nó cung cấp thông tin gỡ lỗi hữu ích.

[array] $script:groupsdns = @()
function Get-ADPrincipalGroupMembershipRecursive() 
{
  Param( [string] $dn, [int] $level = 0, [array] $groups = @() )

  #if(($groupsdns | where { $_.DistinguishedName -eq $dn }).Count -ne 0 ) { return $groups } # dependency on next statement
  #$groupsdns += (Get-ADObject $dn -Properties MemberOf) # Get-ADObject cannot find an object with identity
  if ($script:groupsdns.Contains($dn)) { return $groups }
  $script:groupsdns += $dn
  $mo = $Null
  $mo = Get-ADObject $dn -Properties MemberOf # Get-ADObject cannot find an object with identity
  $group = ($dn + " (" + $level.ToString())
  if ($mo -eq $Null) { $group += "!" }
  $group += ")"
  $groups += $group
  foreach( $groupdn in $mo.MemberOf )
  {
    $groups = Get-ADPrincipalGroupMembershipRecursive -dn $groupdn -level ($level+1) -groups $groups
  }
  if ($level -le 0) 
  { 
    $primarygroupdn = (Get-ADUser -Identity $dn -Properties PrimaryGroup).PrimaryGroup 
    $groups = Get-ADPrincipalGroupMembershipRecursive -dn $primarygroupdn -level ($level+1) -groups $groups
  }
  return $groups
}
$adusergroups = Get-ADPrincipalGroupMembershipRecursive -dn $aduser.DistinguishedName
$adusergroups | ft -AutoSize | `
              Out-File -Width 512 Get-ADPrincipalGroupMembershipRecursive.txt #-Append #-Wrap # | Sort-Object -Property Name

Xin lỗi tôi quên làm rõ. Thực hiện việc này trước: $ aduserDistinguishedName = "CN = name, OU = ..." $ aduser = Get-ADUser -Identity $ aduserDistinguishedName -Properies *
ES44AC SD70MAC 28/11/18

0

Khi bạn không có đặc quyền để tham khảo các nhóm thành viên khác nhưng bạn có đặc quyền tham khảo các thành viên nhóm, bạn có thể làm như sau để tạo bản đồ mà người dùng có quyền truy cập vào nhóm nào.

$groups = get-adgroup -Filter * | sort name | select Name
$users = @{}
foreach($group in $groups) {
    $groupUsers = @()
    $groupUsers = Get-ADGroupMember -Identity $group.Name | Select-Object SamAccountName
    $groupUsers | % {
        if(!$users.ContainsKey($_.SamAccountName)){
            $users[$_.SamAccountName] = @()
        }
        ($users[$_.SamAccountName]) += ($group.Name)
    }
}
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.