programing

사용자가 구성원인 모든 그룹을 가져오는 방법은 무엇입니까?

topblog 2023. 4. 28. 20:00
반응형

사용자가 구성원인 모든 그룹을 가져오는 방법은 무엇입니까?

PowerShell의 cmdlet은 특정 그룹의 멤버를 반환합니다.특정 사용자가 멤버인 모든 그룹을 가져올 cmdlet 또는 속성이 있습니까?

Get-ADPrincipalGroupMembershipActive Directory 모듈에서 이 작업을 수행합니다.아래 명령을 실행하려면 해당 모듈 또는 Windows 10+의 RSAT가 설치되어 있어야 합니다.

Get-ADPrincipalGroupMembership username | select name

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

모듈이 필요 없는 단일 회선은 현재 기록된 사용자를 사용합니다.

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

다음 vbs/powershell 기사에 대한 찬사: http://technet.microsoft.com/en-us/library/ff730963.aspx

현재 로그온되어 있는 사용자의 그룹 구성원 자격을 얻기 위해 Canoas가 게시한 것에 대한 보다 간결한 대안입니다.

저는 이 블로그 게시물에서 이 방법을 발견했습니다: http://www.travisrunyard.com/2013/03/26/auto-create-outlook-mapi-user-profiles/ .

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

정규식을 사용하여 LDAP guff를 제거하고 그룹 이름만 남기는 더 나은 버전:

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

[ADSISARCHER] 유형의 가속기 사용에 대한 자세한 내용은 스크립팅 가이 블로그에서 확인할 수 있습니다. http://blogs.technet.com/b/heyscriptingguy/archive/2010/08/24/use-the-powershell-adsisearcher-type-accelerator-to-search-active-directory.aspx

CMD의 이전 교육 방식:

net user mst999 /domain 
(GET-ADUSER –Identity USERNAME –Properties MemberOf | Select-Object MemberOf).MemberOf

현재 사용자에 대한 세부 정보를 제공합니다.파워셸은 필요하지 않습니다.

whoami /groups

Get-ADPrincipalGroupMembership을 사용할 수 없는 경우 해당 사용자로 로그인한 후 를 사용할 수 있습니다.

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

여기에 많은 훌륭한 답변들이 있지만, 제가 개인적으로 찾고 있던 것이 하나 누락되었습니다.나중에 찾고 싶거나 실제로 다른 사람을 도울 수 있을 때를 대비해 게시해야 한다고 생각했습니다.

Get-ADPrincipalGroupMembership username | Format-Table -auto

이를 표시하는 두 번째 방법은 관심 있는 개별 열을 지정하는 것입니다. 예를 들어 다음과 같습니다.

Get-ADPrincipalGroupMembership username | select name, GroupScope, GroupCategory

이렇게 하면 사용자 이름이 속한 모든 AD 그룹이 제공되지만 각 그룹의 기본 속성이 모두 표 형식으로 표시됩니다.

이를 통해 얻을 수 있는 주요 이점은 메일 그룹과 보안 그룹을 한눈에 확인할 수 있다는 것입니다.유니버설, 도메인로컬, 글로벌 중 어느 것이 유니버설인지 자세히 볼 수 있습니다.
왜 이 마지막 부분에 신경을 쓰십니까?

  • 범용 그룹은 포리스트의 모든 도메인에 있는 사용자, 그룹 및 컴퓨터를 구성원으로 포함하는 보안 또는 배포 그룹입니다.범용 Security Group에 포리스트의 모든 도메인에 있는 리소스에 대한 권한과 사용 권한을 부여할 수 있습니다.
  • 전역 그룹은 자체 도메인, 구성원 서버, 도메인의 워크스테이션 및 신뢰 도메인에서 사용할 수 있는 그룹입니다.이러한 모든 위치에서 글로벌 그룹에 권한과 사용 권한을 부여할 수 있으며 글로벌 그룹은 로컬 그룹의 구성원이 될 수 있습니다.그러나 글로벌 그룹에는 자신의 도메인에서만 사용하는 사용자 계정이 포함될 수 있습니다.
  • 도메인 로컬 그룹은 범용 그룹, 글로벌 그룹, 자체 도메인의 다른 도메인 로컬 그룹 및 포리스트의 모든 도메인의 계정을 포함할 수 있는 보안 또는 배포 그룹입니다.도메인 로컬 그룹이 있는 동일한 도메인에만 있는 리소스에 대한 권한과 사용 권한을 도메인 로컬 Security Group에 부여할 수 있습니다.

구성원 가져오기는 사용자의 그룹 구성원 자격을 얻기 위한 것이 아닙니다.로컬 시스템에서 사용자가 속한 그룹 목록을 가져오려면 다음을 수행합니다.

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

Get-WMIObject -Query $query | Select Name

위 쿼리에서 DemoUser1을 원하는 사용자 이름으로 바꾸고 DomainName을 로컬 컴퓨터 이름 또는 도메인 이름으로 바꿉니다.

사용자에 대한 그룹 구성원 자격 가져오기:

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

사용자대한 그룹 구성원 자격 가져오기 참조

또한 Quest의 Active Directory용 무료 PowerShell 명령도 참조하십시오.

[편집: Get-ADPrincipalGroupMembership 명령은 윈도우즈 2008 R2에서 v2 이후로 Powershell에 포함되어 있습니다.아래에 있는 Kekstrauss의 답변을 확인하십시오.]

Get-Member..mdlet의 입니다.그물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
...

임의 사용자의 그룹 정보에 액세스해야 하는 경우 Quest AD cmdlets를 사용하는 것이 더 나은 방법입니다.

저는 Get-ADPrincipalGroupMembershipRecursive라는 PowerShell 함수를 작성했습니다.사용자, 컴퓨터, 그룹 또는 서비스 계정의 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

단순한 하나의 라이너일 때 긴 스크립트가 필요하지 않습니다.

퀘스트 명령

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

MSAD 명령

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

MSAD cmd가 더 빠르지만 퀘스트를 더 좋아하는 사람들도 있습니다.

스티브

사용:

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

명령 출력을 CSV 파일로 파이프합니다.

먼저 Active Directory 모듈을 가져옵니다.

Import-Module ActiveDirectory

그런 다음 다음 명령을 실행합니다.

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

지정된 그룹의 구성원이 표시됩니다.

한 줄만 사용할 수 있습니다.

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

끝 :)

다음은 잘 작동합니다.

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=$_;}} `
    }

Get-QADUser-SamAccountName 로그인ID | % {$}.MemberOf} | Get-QAD Group

   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. 

특정 사용자에 대해 다음 작업을 수행할 수 없습니다.

Get-ADPrincipalGroupMembership username

문제를 해결할 의사가 없는 오류가 발생했습니다.

하지만 저는 Get-ADUser를 사용하여 다른 해결책을 생각해냈습니다.계정 이름을 모르면 사용자의 실제 이름에 있는 와일드카드를 기반으로 얻을 수 있기 때문에 조금 더 좋습니다.Part Of UsersName을 입력하면 됩니다.

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

슈메켄유글러와 8DH에게 큰 도움을 주셔서 이 해결책으로 저를 이끌었습니다. +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

제시된 모든 의견을 검토하는 것은 저에게 출발점을 주었지만(감사합니다) 몇 가지 해결되지 않은 문제를 남겼습니다.결과적으로 제 대답은 이렇습니다.제공된 코드 스니펫은 요청된 것보다 조금 더 많은 기능을 하지만 유용한 디버깅 정보를 제공합니다.

[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

다른 구성원 그룹을 참조할 수 있는 권한은 없지만 그룹 구성원을 참조할 수 있는 권한이 있는 경우 다음을 수행하여 어떤 사용자가 어떤 그룹에 액세스할 수 있는지에 대한 맵을 작성할 수 있습니다.

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

로컬 사용자 및 그룹(Active Directory에 없음) 및 RSAT 및/또는 설치를 원하지 않거나 허용되지 않거나 설치할 수 없는 경우Install-WindowsFeature RSAT-AD-PowerShell및/또는import-module activedirectory사전 설치된 순수 파워셸(5.1+) 방식이 있습니다.

(참고:Get-LocalGroup*아래에 사용된 버전은 Powershell v5.1 이상에서만 사용할 수 있습니다. "...v5.1은 2016년 8월 2일에 윈도우 10 기념 업데이트와 함께 출시되었으며, 윈도우 서버 2016에도 출시되었습니다.또는 윈도우즈 7, 윈도우즈 서버 2008, 윈도우즈 서버 2008 R2, 윈도우즈 서버 2012 및 윈도우즈 서버 2012 R2 [it]가 2017년 1월 19일에 출시되었습니다." (wikipedia)

$username = "user002"
Get-LocalGroup | ForEach-Object {
    # the usernames are returned in the string form "computername\username"
    if (Get-LocalGroupMember -Group $_ | Where-Object name -like "*\$username") {
        $_.name
    } 
}

출력 예:

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

사용자를 나열하는 데 필요한 OU를 반영하도록 -SearchBase 값을 변경합니다. :)

그러면 해당 OU의 모든 사용자가 나열되고 사용자가 속한 그룹이 표시됩니다.

Get-ADPrincipalGroupMembership USERLOGON | 이름 선택

이 방법은 이름을 얻는 가장 간단한 방법입니다.

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

응답을 트리밍하거나 OU의 모든 사용자가 사용자인 모든 그룹을 가져오려면 선택 문을 추가합니다.

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

의 거의 은 위거의모솔은션루든의를 했습니다.ActiveDirecotry대부분의 경우 기본적으로 사용할 수 없는 모듈입니다.

저는 아래의 방법을 사용했습니다.조금 간접적이긴 하지만 제 목적에 부합합니다.

사용 가능한 모든 그룹 나열

Get-WmiObject -Class Win32_Group

그런 다음 사용자가 속한 그룹을 나열합니다.

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

교는 다을통 수있다니습을 할 수 .SIDs이 작업은 로그인한 사용자에게 적용됩니다.제가 틀렸다면 고쳐주세요.PowerShell은 완전히 새로워졌지만 작업을 위해 이 작업을 수행해야 했습니다.

사용자 입력 및 고급 출력 형식 지정:

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

나중에 참조할 수 있도록 여기에 넣어둡니다.저는 지금 이메일을 보내고 있는 중입니다.저는 각 사용자 계정과 각 그룹의 멤버십을 알아야 하며 각 그룹과 각 그룹의 멤버를 알아야 합니다.

아래 코드 블록을 사용하여 각 사용자의 그룹 멤버쉽에 대한 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=""; `
  }

언급URL : https://stackoverflow.com/questions/5072996/how-to-get-all-groups-that-a-user-is-a-member-of

반응형