Как получить все группы, членом которых является пользователь?

PowerShell Get-ADGroupMember cmdlet возвращает членов определенной группы. Есть ли командлет или свойство, чтобы получить все группы, к которым принадлежит определенный пользователь?


Я исправил свою ошибку: Get-Member должен быть Get-ADGroupMember.

Ответ 1

Get-ADPrincipalGroupMembership сделает это.

Get-ADPrincipalGroupMembership username | select name

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

Ответ 2

Одиночная строка, без необходимых модулей, использует текущего зарегистрированного пользователя:

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

Ключи к этой статье vbs/powershell: http://technet.microsoft.com/en-us/library/ff730963.aspx

Ответ 3

Более кратким альтернативом тому, который был опубликован 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'

Более подробную информацию об использовании ускорителя типа [ADSISEARCHER] можно найти в блоге парня-сценариста: http://blogs.technet.com/b/heyscriptingguy/archive/2010/08/24/use-the-powershell-adsisearcher-type-accelerator-to-search-active-directory.aspx

Ответ 4

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

Ответ 5

Старый школьный путь от CMD:

net user mst999 /domain 

Ответ 6

Получить членство в группе для пользователя:

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

См. Получить членство в группе для пользователя

Но также см. Quest Команды Free PowerShell для Active Directory.

Команда

[ Изменить: Get-ADPrincipalGroupMembership включена в Powershell с версии v2 с Windows 2008 R2. См. Ответ kstrauss ниже.]

Ответ 7

Get-Member является командлетом для перечисления членов .NET 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 использование командлетов Quest AD.

Ответ 8

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 либо с именем вашего локального компьютера, либо с доменным именем.

Ответ 9

Нет необходимости в длинных сценариях, когда это простой один вкладыш.

Команда 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 лучше.

Стив

Ответ 10

Использование:

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

Этот канал выводит команду в файл CSV.

Ответ 11

Это только одна строка:

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

конец:)

Ответ 12

Сначала импортируйте модуль activedirectory:

import-module activedirectory

Затем выполните следующую команду:

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

Это отобразит членов указанной группы.

Ответ 13

Ниже хорошо работает:

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

Ответ 14

Я написал функцию PowerShell под названием Get-ADPrincipalGroupMembershipRecursive. Он принимает DSN пользователя, компьютера, группы или учетной записи службы. Он извлекает исходный список групп из атрибута memberOf account, а затем рекурсивно проверяет эти членства в группах. Сокращенный код приведен ниже. Полный исходный код с комментариями можно найти здесь.

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

Ответ 15

Get-QADUser -SamAccountName LoginID | % {$ _. MemberOf} | Get-QADGroup | выберите имя

Ответ 16

Я не мог заставить следующее работать для конкретного пользователя:

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 для вас обоих.

Ответ 17

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, в котором вам нужно указать пользователей:)

Это отобразит всех пользователей в этом подразделении и покажет, с какими группами они являются членами.

Ответ 18

Get-ADPrincipalGroupMembership USERLOGON | выберите имя

Ответ 19

   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. 

Ответ 20

Это самый простой способ просто получить имена:

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

Добавить оператор выбора, чтобы обрезать ответ или получить каждого пользователя в подразделении, в котором они являются пользователем:

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

Ответ 21

Чтобы получить его рекурсивный, вы можете использовать:

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

Ответ 22

Почти все вышеприведенные решения использовали модуль ActiveDirecotry, который может быть недоступен по умолчанию в большинстве случаев.

Я использовал ниже метод. Немного косвенный, но служил моей цели.

Список всех доступных групп

Get-WmiObject -Class Win32_Group

И затем перечислите группы, к которым принадлежит пользователь

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

Затем сравнение можно выполнить путем проверки через SIDs. Это работает для зарегистрированного пользователя. Пожалуйста, поправьте меня, если я ошибаюсь. Полностью новый для PowerShell, но нужно было сделать это для выполнения обязательств.

Ответ 23

С пользовательским вводом и форматированием выходных данных:

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

Ответ 24

Если у вас нет привилегий консультироваться с другими группами участников, но у вас есть привилегия консультироваться с членами группы. Вы можете сделать следующее, чтобы составить карту того, какой пользователь имеет доступ к каким группам.

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

Ответ 25

Выкладываю это сюда для дальнейшего использования. Я нахожусь в процессе миграции электронной почты. Мне нужно знать каждую учетную запись пользователя и членство в соответствующей группе, а также мне нужно знать каждую группу и ее участников.

Я использую блок кода ниже для вывода 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=""; '
  }

Ответ 26

Если вы не можете заставить Get-ADPrincipalGroupMembership работать на вас, попробуйте войти в систему от имени этого пользователя, а затем использовать.

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

Ответ 27

Изучение всех представленных комментариев дало мне отправную точку (спасибо за это), но оставило мне несколько нерешенных вопросов. В результате вот мой ответ. Предоставленный фрагмент кода делает немного больше, чем запрашивается, но предоставляет полезную информацию об отладке.

[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

Ответ 28

Хотя здесь есть много отличных ответов, есть один, который я лично искал, которого не было. Как только я понял это - я подумал, что мне следует опубликовать это на тот случай, если я захочу найти его позже, или это действительно поможет кому-то еще в какой-то момент:

Get-ADPrincipalGroupMembership username | Format-Table -auto

Второй подход к представлению этого - указать отдельные интересующие вас столбцы, например:

Get-ADPrincipalGroupMembership username | select name, GroupScope, GroupCategory

Это дает все группы AD, к которым принадлежит имя пользователя, но также представляет все свойства по умолчанию для каждой группы, отформатированные в виде таблицы.

Основное преимущество, которое это дает вам, это то, что вы можете сразу увидеть списки рассылки и группы безопасности. Кроме того, вы можете сразу увидеть универсальные, доменные и глобальные.
Почему вы заботитесь об этом последнем кусочке?

  • Универсальная группа - это группа безопасности или рассылки, в которую входят пользователи, группы и компьютеры из любого домена своего леса в качестве участников. Вы можете предоставить универсальным группам безопасности права и разрешения для ресурсов в любом домене в лесу.
  • Глобальная группа - это группа, которую можно использовать в своем собственном домене, на рядовых серверах, на рабочих станциях домена и в доверенных доменах. Во всех этих местах вы можете дать глобальной группе права и разрешения, и глобальная группа может стать членом локальной группы. Однако глобальная группа может содержать учетные записи пользователей только из своего домена.
  • Локальная группа домена - это группа безопасности или распространения, которая может содержать универсальные группы, глобальные группы, локальные группы других доменов из своего собственного домена и учетные записи из любого домена в лесу. Вы можете дать локальным группам безопасности права и разрешения для ресурсов, которые находятся только в том же домене, где расположена локальная группа домена.

Ответ 29

Хотя здесь есть много отличных ответов, есть один, который я лично искал, которого не было. Как только я понял это - я подумал, что мне следует опубликовать это на тот случай, если я захочу найти его позже, или это действительно поможет кому-то еще в какой-то момент:

Get-ADPrincipalGroupMembership username | Format-Table -auto

Второй подход к представлению этого - указать отдельные интересующие вас столбцы, например:

Get-ADPrincipalGroupMembership username | select name, GroupScope, GroupCategory

Это дает все группы AD, к которым принадлежит имя пользователя, но также представляет все свойства по умолчанию для каждой группы, отформатированные в виде таблицы.

Основное преимущество, которое это дает вам, это то, что вы можете сразу увидеть списки рассылки и группы безопасности. Кроме того, вы можете сразу увидеть универсальные, доменные и глобальные.
Почему вы заботитесь об этом последнем кусочке?

  • Универсальная группа - это группа безопасности или рассылки, в которую входят пользователи, группы и компьютеры из любого домена своего леса в качестве участников. Вы можете предоставить универсальным группам безопасности права и разрешения для ресурсов в любом домене в лесу.
  • Глобальная группа - это группа, которую можно использовать в своем собственном домене, на рядовых серверах, на рабочих станциях домена и в доверенных доменах. Во всех этих местах вы можете дать глобальной группе права и разрешения, и глобальная группа может стать членом локальной группы. Однако глобальная группа может содержать учетные записи пользователей только из своего домена.
  • Локальная группа домена - это группа безопасности или распространения, которая может содержать универсальные группы, глобальные группы, локальные группы других доменов из своего собственного домена и учетные записи из любого домена в лесу. Вы можете дать локальным группам безопасности права и разрешения для ресурсов, которые находятся только в том же домене, где расположена локальная группа домена.