จะรับกลุ่มทั้งหมดที่ผู้ใช้เป็นสมาชิกได้อย่างไร?


140

Get-ADGroupMembercmdlet ของ PowerShell ส่งคืนสมาชิกของกลุ่มเฉพาะ มี cmdlet หรือคุณสมบัติเพื่อรับกลุ่มทั้งหมดที่ผู้ใช้เฉพาะเป็นสมาชิกหรือไม่?


ฉันคงผิดพลาดของฉัน: ควรจะเป็นGet-MemberGet-ADGroupMember


1
ดูstackoverflow.com/questions/668321/...และtechnet.microsoft.com/en-us/library/dd315351.aspx แน่ใจหรือว่า Get-Member ทำในสิ่งที่คุณคิด?
tiago2014

1
คุณสามารถใช้ได้อย่างรวดเร็วnet user /domain usernameตรวจสอบวิธีการอื่น ๆ ที่Get Groups ซึ่งผู้ใช้เป็นสมาชิกโดยใช้ PowerShell
Mohamed

คำตอบ:


287

Get-ADPrincipalGroupMembership จะดำเนินการนี้

Get-ADPrincipalGroupMembership username | select name

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

1
สิ่งนี้ช่วยฉันจากการใช้วิธีการที่ซับซ้อนและยืดยาวที่สุดในการค้นหาสิ่งนี้ รู้ว่า powershell จะมีอะไรแบบนี้ แต่หาที่ไหนไม่ได้ +1
Tim Alexander

8
โปรดทราบว่าขึ้นอยู่กับโมดูล ActiveDirectory ที่พร้อมใช้งาน สิ่งนี้ไม่จำเป็นต้องทำงานบนเครื่องไคลเอนต์ที่คุณกำลังเรียกใช้สคริปต์ PowerShell หรือบนไคลเอนต์ระดับล่าง หากคุณต้องการทำเช่นนั้นให้ใช้วิธีนี้
Daniel.S

5
ข้างต้นทำให้ฉันมีข้อผิดพลาด ("เซิร์ฟเวอร์ไม่สามารถดำเนินการตามคำขอได้เนื่องจากเกิดข้อผิดพลาดภายใน" - น่าจะไม่มีฟังก์ชันการทำงานบนเซิร์ฟเวอร์) get-aduser $username -Properties memberof | select -expand memberofทำงานได้ดีแม้ว่า
JohnLBevan

5
หากคุณใช้เวิร์กสเตชัน Windows 10 แทนที่จะเป็นเซิร์ฟเวอร์ให้ติดตั้ง RSAT จากที่นี่จากนั้นพิมพ์import-module activedirectoryบนบรรทัดคำสั่ง powershell จากนั้นสิ่งนี้ควรทำงาน
James Toomey

3
หากไม่ได้ติดตั้งโมดูล: Install-WindowsFeature RSAT-AD-PowerShell
Preben Huybrechts

88

บรรทัดเดียวไม่จำเป็นต้องใช้โมดูลใช้ผู้ใช้ที่เข้าสู่ระบบปัจจุบัน:

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

คำถามสำหรับบทความ vbs / powershell นี้: http://technet.microsoft.com/en-us/library/ff730963.aspx


5
ขอบคุณฉันขอขอบคุณรุ่นที่ไม่มีโมดูลนี้ ฉันเพิ่งเปลี่ยนตัวแปรจาก$env:usernameเป็น$usernameและตั้งค่าด้วย$username = "testuser"เพื่อทำการแทนที่ตัวแปรสำหรับการค้นหาผู้ใช้อื่น ๆ ได้อย่างง่ายดาย
projectdp

เพิ่งกลับมาที่นี่อีกครั้ง! ยังคงมีประโยชน์ในสถานการณ์สุ่มที่ไม่มีเครื่องมือ AD
Nathan

46

ทางเลือกที่กระชับกว่าที่ Canoas โพสต์เพื่อรับการเป็นสมาชิกกลุ่มสำหรับผู้ใช้ที่เข้าสู่ระบบในปัจจุบัน

ฉันเจอวิธีนี้ในบล็อกโพสต์นี้: http://www.travisrunyard.com/2013/03/26/auto-create-outlook-mapi-user-profiles/

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

เวอร์ชันที่ดียิ่งขึ้นซึ่งใช้ regex เพื่อดึง LDAP guff และออกจากชื่อกลุ่มเท่านั้น:

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

สามารถดูรายละเอียดเพิ่มเติมเกี่ยวกับการใช้ตัวเร่งประเภท [ADSISEARCHER] ได้ในบล็อกคนเขียนสคริปต์: http://blogs.technet.com/b/heyscriptingguy/archive/2010/08/24/use-the-powershell-adsisearcher-type -accelerator-to-search-active-directory.aspx


1
ทั้งสองข้อนี้ทำให้ฉันเกิดข้อผิดพลาด: ข้อยกเว้นการเรียก "FindOne" ด้วยอาร์กิวเมนต์ "0": "ตัวกรอง samaccountname = ไม่ถูกต้อง"
Dallas

แปลก .... ฉันเพิ่งทดสอบอีกครั้ง แต่ใน Windows 7 มีสภาพแวดล้อมที่แตกต่างไปจากเดิมอย่างสิ้นเชิงและมันก็ทำงานได้ดีเช่นกัน
Daniel.S

ฉันลองอีกครั้งในตอนนี้ยังคงใช้ Win 7 และทำงานได้ดี บางทีฉันอาจพิมพ์ผิดเมื่อลองครั้งแรก ขอขอบคุณที่เพิ่มการแทนที่เพื่อขจัด "guff" ในป่า
Dallas

3
ใช้งานได้ดีต่อท้าย| Sort-Objectเพื่อให้อ่านง่ายยิ่งขึ้น
Martin Hollingsworth

33

ทางโรงเรียนเก่าจาก CMD:

net user mst999 /domain 

1
มันยังทำงานบนเครื่องไคลเอนต์ที่ไม่มีเครื่องมือ AD เพิ่มเติม
Rast

7
น่าเสียดาย - ถ้าชื่อกลุ่มของคุณยาว (เช่น> 21 ตัวอักษร) มันจะตัดทอน ...
kiltannen

ที่เต้นทุกทาง! Bravo
StayCool

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

ขอบคุณ! สิ่งนี้ได้ผล ข้อเสียเพียงอย่างเดียวคือค่าที่ส่งคืนเป็นสตริง
shaiss

3
| get-adgroup จะส่งออกวัตถุกลุ่ม ยอดเยี่ยม!
8DH

1
หรือใช้ $ env: USERNAME แทนเพื่อคว้าชื่อผู้ใช้ที่เข้าสู่ระบบในปัจจุบัน
Dave Lucre

10

หากคุณไม่สามารถรับ Get-ADPrincipalGroupMembership ให้ทำงานได้คุณสามารถลองเข้าสู่ระบบในฐานะผู้ใช้รายนั้นจากนั้นใช้

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

คุณไม่จำเป็นต้องเข้าสู่ระบบในฐานะผู้ใช้หากคุณใช้บางอย่างเช่น$id = [Security.Principal.WindowsIdentity]("username")
Bitcoin Murderous Maniac

1
สิ่งนี้สั้นลงอย่างมากให้เหลือเพียงซับ[System.Security.Principal.WindowsIdentity]::GetCurrent().Groups | % {$_.Translate([Security.Principal.NTAccount])}เดียว
alx9r

5

รับสมาชิกกลุ่มสำหรับผู้ใช้:

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

โปรดดูรับการเป็นสมาชิกกลุ่มสำหรับผู้ใช้

แต่ยังเห็นเควสฟรี PowerShell คำสั่งสำหรับ Active Directory

[ แก้ไข : คำสั่งGet-ADPrincipalGroupMembershipรวมอยู่ใน Powershell ตั้งแต่เวอร์ชัน 2 พร้อมกับ Windows 2008 R2 ดูคำตอบของ kstrauss ด้านล่าง]


2
จริงๆแล้วมีวิธีที่ง่ายกว่าด้วย Quest cmdlets: Get-QADGroup -Contains Primoz
fenster

18
นี่ไม่ใช่คำตอบที่ดีที่สุดอีกต่อไปเนื่องจากตอนนี้ Get-ADPrincipalGroupMembership ถูกสร้างขึ้นใน PowerShell
Rob Cannon

1
โหวตลงเพราะใช้ Get-ADPrincipalGroupMembership จะดีกว่ามาก ฉันต้องการยกเลิกการลงคะแนนนี้ แต่ไม่สามารถทำได้ ฉันจะแก้ไขคำตอบเพื่อชี้ให้เห็นว่าตัวเลือกในตัวมีอยู่แล้ว
อับราฮัม

5

ควรให้รายละเอียดสำหรับผู้ใช้ปัจจุบัน ไม่จำเป็นต้องใช้ Powershell

whoami /groups


4

Get-Memberเป็น cmdlet objectสำหรับรายชื่อสมาชิกของสุทธิ สิ่งนี้ไม่เกี่ยวข้องกับการเป็นสมาชิกของผู้ใช้ / กลุ่ม คุณสามารถรับสมาชิกกลุ่มของผู้ใช้ปัจจุบันได้ดังนี้:

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
...

หากคุณต้องการเข้าถึงข้อมูลกลุ่มผู้ใช้ตามอำเภอใจคำแนะนำ @tiagoinu ในการใช้ cmdlets Quest AD เป็นวิธีที่ดีกว่า


4

ก่อนอื่นให้นำเข้าโมดูลไดเร็กทอรีการทำงาน:

import-module activedirectory

จากนั้นออกคำสั่งนี้:

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

ซึ่งจะแสดงสมาชิกของกลุ่มที่ระบุ


OP ขอตรงกันข้าม รับกลุ่มทั้งหมดที่ผู้ใช้ที่ระบุเป็นสมาชิก
8DH

4

ไม่ต้องสคริปยาวเมื่อเป็นซับง่ายๆ ..

คำสั่ง QUEST

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

คำสั่ง MS AD

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

ฉันพบว่า MS AD cmd เร็วกว่า แต่บางคนชอบ Quest ดีกว่า ..

สตีฟ


4

Get-Member ไม่ได้มีไว้สำหรับการเป็นสมาชิกกลุ่มของผู้ใช้ หากคุณต้องการรับรายชื่อกลุ่มที่ผู้ใช้อยู่ในระบบโลคัลคุณสามารถทำได้โดย:

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

Get-WMIObject -Query $query | Select Name

ในข้อความค้นหาด้านบนให้แทนที่ DemoUser1 ด้วยชื่อผู้ใช้ที่คุณต้องการและ DomainName ด้วยชื่อคอมพิวเตอร์หรือชื่อโดเมนของคุณ


ข้อความค้นหานี้ใช้เวลานานมากและตอบสนองช้ามากเมื่อมีผู้ใช้และกลุ่มหลายคนในสภาพแวดล้อม
Randeepsp

ใครก็ตามที่กำลังแก้ไขคำตอบโปรดตรวจสอบว่าคุณแก้ไขถูกวิธี ฉันแนะนำให้ OP แทนที่ DemoUser1 ด้วยชื่อผู้ใช้ที่เขาต้องการ และคุณเปลี่ยนความหมายนั้นโดยสิ้นเชิง
ravikanth

4

ใช้:

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

ท่อนี้ผลลัพธ์ของคำสั่งเป็นCSVไฟล์


3

ฉันเขียนฟังก์ชัน PowerShell ชื่อ Get-ADPrincipalGroupMembershipRecursive ยอมรับ DSN ของบัญชีผู้ใช้คอมพิวเตอร์กลุ่มหรือบริการ จะดึงรายการเริ่มต้นของกลุ่มจากแอตทริบิวต์ memberOf ของบัญชีจากนั้นตรวจสอบการเป็นสมาชิกของกลุ่มเหล่านั้นซ้ำ รหัสย่ออยู่ด้านล่าง เต็มรหัสที่มากับความคิดเห็นสามารถพบได้ที่นี่

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

3

มันเป็นเพียงบรรทัดเดียว:

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

จุดจบของ :)


การวางท่อนั้นไปยัง a select -expandproperty memberofจะทำให้ผลลัพธ์อ่านง่าย / มีประโยชน์มากขึ้น
Ben Thul

2

ด้านล่างทำงานได้ดี:

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

หากคุณมีรายชื่อผู้ใช้:

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


1
   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. 

1

ฉันไม่สามารถใช้สิ่งต่อไปนี้สำหรับผู้ใช้บางราย:

Get-ADPrincipalGroupMembership username

เกิดข้อผิดพลาดที่ฉันไม่เต็มใจที่จะแก้ไขปัญหา

อย่างไรก็ตามฉันได้หาวิธีแก้ปัญหาอื่นโดยใช้ Get-ADUser ฉันชอบที่ดีกว่าเล็กน้อยเพราะหากคุณไม่ทราบชื่อบัญชีคุณสามารถใช้มันได้โดยอิงจากสัญลักษณ์แทนชื่อจริงของผู้ใช้ เพียงกรอกPartOfUsersNameแล้วไปเลย

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

อุปกรณ์ประกอบฉากขนาดใหญ่สำหรับ schmeckendeugler และ 8DH เพื่อพาฉันไปสู่โซลูชันนี้ +1 ให้คุณทั้งคู่


1

หากต้องการเรียกใช้ซ้ำคุณสามารถใช้:

<# 
    .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

1

แม้ว่าจะมีคำตอบที่ยอดเยี่ยมมากมายที่นี่ แต่ก็มีคำตอบที่ฉันมองหาเป็นการส่วนตัวที่หายไป เมื่อคิดออกแล้ว - ฉันคิดว่าควรโพสต์ไว้ในกรณีที่ต้องการค้นหาในภายหลังหรือสามารถช่วยคนอื่นได้ในบางจุด:

Get-ADPrincipalGroupMembership username | Format-Table -auto

แนวทางที่สองในการนำเสนอสิ่งนี้คือการระบุแต่ละคอลัมน์ที่คุณสนใจเช่น:

Get-ADPrincipalGroupMembership username | select name, GroupScope, GroupCategory

สิ่งนี้ทำให้กลุ่มโฆษณาทั้งหมดมีชื่อผู้ใช้เป็นของ - แต่ยังแสดงคุณสมบัติเริ่มต้นทั้งหมดของแต่ละกลุ่มที่จัดรูปแบบเป็นตารางอย่างสวยงาม

ประโยชน์หลักที่จะช่วยให้คุณคือคุณสามารถดูได้อย่างรวดเร็วว่าเป็นรายการแจกจ่ายและกลุ่มความปลอดภัย คุณสามารถดูเพิ่มเติมได้อย่างรวดเร็วว่า Universal ซึ่งเป็น DomainLocal และซึ่งเป็น Global
ทำไมคุณถึงสนใจบิตสุดท้ายนี้?

  • กลุ่มสากลคือกลุ่มการรักษาความปลอดภัยหรือการแจกจ่ายที่มีผู้ใช้กลุ่มและคอมพิวเตอร์จากโดเมนใด ๆ ในฟอเรสต์เป็นสมาชิก คุณสามารถให้สิทธิ์กลุ่มความปลอดภัยสากลและสิทธิ์ในทรัพยากรในโดเมนใดก็ได้ในฟอเรสต์
  • Global group คือกลุ่มที่สามารถใช้ในโดเมนของตนเองในเซิร์ฟเวอร์สมาชิกและในเวิร์กสเตชันของโดเมนและในการเชื่อถือโดเมน ในสถานที่เหล่านั้นทั้งหมดคุณสามารถให้สิทธิ์และสิทธิ์ของกลุ่มทั่วโลกและกลุ่มส่วนกลางสามารถเป็นสมาชิกของกลุ่มท้องถิ่นได้ อย่างไรก็ตามกลุ่มส่วนกลางสามารถมีบัญชีผู้ใช้ที่มาจากโดเมนของตนเองเท่านั้น
  • กลุ่มภายในโดเมนคือกลุ่มการรักษาความปลอดภัยหรือการแจกจ่ายที่สามารถมีกลุ่มสากลกลุ่มส่วนกลางกลุ่มภายในโดเมนอื่น ๆ จากโดเมนของตนเองและบัญชีจากโดเมนใด ๆ ในฟอเรสต์ คุณสามารถให้สิทธิ์กลุ่มความปลอดภัยภายในโดเมนและสิทธิ์ในทรัพยากรที่อยู่ในโดเมนเดียวกับที่ตั้งกลุ่มโลคัลของโดเมน

1

เมื่อคุณไม่มีสิทธิ์ในการปรึกษากลุ่มสมาชิกอื่น ๆ แต่คุณมีสิทธิ์ในการปรึกษาสมาชิกกลุ่มคุณสามารถทำสิ่งต่อไปนี้เพื่อสร้างแผนที่ว่าผู้ใช้รายใดสามารถเข้าถึงกลุ่มใดได้

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

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

เปลี่ยนค่าของ -SearchBase เพื่อสะท้อนถึง OU ที่คุณต้องการเพื่อแสดงรายชื่อผู้ใช้จาก :)

นี่จะแสดงรายชื่อผู้ใช้ทั้งหมดในหน่วยงานนั้นและแสดงให้คุณเห็นว่าพวกเขาเป็นสมาชิกกลุ่มใด



0

นี่เป็นวิธีที่ง่ายที่สุดในการรับชื่อ:

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

เพิ่มคำสั่ง select เพื่อตัดการตอบสนองหรือเพื่อให้ผู้ใช้ทุกคนใน OU ทุกกลุ่มเป็นผู้ใช้:

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


0

โซลูชันข้างต้นเกือบทั้งหมดใช้ActiveDirecotryโมดูลซึ่งอาจไม่สามารถใช้ได้ตามค่าเริ่มต้นในกรณีส่วนใหญ่

ฉันใช้วิธีการด้านล่าง ทางอ้อมเล็กน้อย แต่ตอบสนองวัตถุประสงค์ของฉัน

แสดงรายการกลุ่มที่มีทั้งหมด

Get-WmiObject -Class Win32_Group

จากนั้นแสดงรายการกลุ่มที่ผู้ใช้เป็นสมาชิก

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

จากนั้นสามารถทำการเปรียบเทียบได้โดยการตรวจสอบผ่านไฟล์SIDs. สิ่งนี้ใช้ได้กับผู้ใช้ที่ล็อกอิน กรุณาแก้ไขฉันถ้าฉันผิด ใหม่ทั้งหมดสำหรับ PowerShell แต่ต้องทำสิ่งนี้ให้สำเร็จเพื่อความมุ่งมั่นในการทำงาน


หากคุณกำลังตรวจสอบผู้ใช้ที่เป็นสมาชิกของกลุ่มผู้ดูแลระบบอยู่แล้วตรวจสอบให้แน่ใจว่าเริ่ม PowerShell โดย "Run As Administrator" มิฉะนั้นกลุ่มจะไม่แสดงรายการอย่างถูกต้องสำหรับคำสั่งที่ 2 ... ต้องใช้เวลาพอสมควรในการคิด นี้ออก ... windows ...
Ruifeng Ma

0

ด้วยอินพุตของผู้ใช้และการจัดรูปแบบเอาต์พุตแฟนซี:

[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

วางสิ่งนี้ไว้ที่นี่เพื่อใช้อ้างอิงในอนาคต ฉันอยู่ระหว่างการย้ายข้อมูลอีเมล ฉันต้องการทราบบัญชีผู้ใช้แต่ละบัญชีและการเป็นสมาชิกกลุ่มที่เกี่ยวข้องและฉันจำเป็นต้องรู้จักแต่ละกลุ่มและสมาชิกที่เกี่ยวข้องด้วย

ฉันใช้บล็อกโค้ดด้านล่างเพื่อส่งออก CSV สำหรับการเป็นสมาชิกกลุ่มของผู้ใช้แต่ละคน

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 ; `
  }

กระบวนการส่งออกสำหรับกลุ่มและสมาชิกตามลำดับมีความซับซ้อนเล็กน้อย แต่ด้านล่างได้ผล ชื่อไฟล์เอาต์พุตรวมถึงประเภทของกลุ่ม ดังนั้นกลุ่มการแจกจ่ายอีเมลที่ฉันต้องการคือ / ควรเป็นกลุ่มการกระจายทั่วไปและทั่วโลก ฉันควรจะสามารถลบหรือย้ายไฟล์ TXT ที่เป็นผลลัพธ์ที่ฉันไม่ต้องการได้

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

การศึกษาความคิดเห็นทั้งหมดที่นำเสนอทำให้ฉันมีจุดเริ่มต้น (ขอบคุณสำหรับสิ่งนั้น) แต่ทำให้ฉันมีปัญหาที่ยังไม่ได้รับการแก้ไขหลายประการ ดังนั้นนี่คือคำตอบของฉัน ข้อมูลโค้ดที่ให้มาทำมากกว่าสิ่งที่ขอ แต่ให้ข้อมูลการแก้ไขจุดบกพร่องที่เป็นประโยชน์

[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

ขออภัยฉันลืมชี้แจง ทำสิ่งนี้ก่อน: $ aduserDistinguishedName = "CN = name, OU = ... " $ aduser = Get-ADUser -Identity $ aduserDistinguishedName -Properties *
ES44AC SD70MAC

0

ฉันใช้ oneliner ที่เรียบง่ายนี้เพื่อค้นหาซ้ำทุกกลุ่มที่ผู้ใช้เป็นสมาชิก:

Get-ADPrincipalGroupMembership $UserName | foreach-object { Get-ADPrincipalGroupMembership $_.SamAccountName | select SamAccountName }

ในการกรองกลุ่มเพื่อดูว่าผู้ใช้เป็นสมาชิกของกลุ่มเฉพาะหรือไม่ฉันใช้สิ่งนี้:

if ( Get-ADPrincipalGroupMembership $UserName | foreach-object { Get-ADPrincipalGroupMembership $_.SamAccountName | select SamAccountName } | where-object {$_.SamAccountName -like "*$Groupname*"} ) { write-host "Found" } else { write-host "not a member of group $Groupname" }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.