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


135

Get-ADGroupMemberКомандлет PowerShell возвращает членов определенной группы. Существует ли командлет или свойство для получения всех групп, в которые входит конкретный пользователь?


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


Вопрос не понятен. Вы можете изменить это или добавить пример?
Мохит Чакраборти

1
См stackoverflow.com/questions/668321/... и technet.microsoft.com/en-us/library/dd315351.aspx . Вы уверены, что Get-Member делает то, что вы думаете?
tiago2014

@ Mohit Chakraborty Теперь стало понятнее?
Примоз

1
быстро вы можете использовать net user /domain username, проверьте также другие методы в Get Groups, в которых пользователь является членом Использование PowerShell
Mohamed

Ответы:


282

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

Get-ADPrincipalGroupMembership username | select name

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

1
Это только спасло меня от использования самого запутанного и многословного метода нахождения этого. Знал, что у powershell есть что-то подобное, но нигде не мог его найти. +1
Тим Александр

7
Обратите внимание, что это зависит от доступности модуля ActiveDirectory. Это не обязательно будет работать на клиентском компьютере, на котором вы запускаете скрипт PowerShell, или на клиентах нижнего уровня. Если вы хотите сделать это, используйте это решение .
Daniel.S

5
Выше были ошибки («Серверу не удалось обработать запрос из-за внутренней ошибки» - предположительно, функции недоступны на сервере). get-aduser $username -Properties memberof | select -expand memberofработал нормально, хотя.
JohnLBevan

5
Если вы работаете на рабочей станции Windows 10, а не на сервере, установите RSAT отсюда , затем введите import-module activedirectoryв командной строке powershell, после чего он должен запуститься.
Джеймс Туми

3
Если модуль не установлен: Install-WindowsFeature RSAT-AD-PowerShell
Пребен Хайбрехтс

83

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

(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 недоступны.
Натан

43

Более краткая альтернатива опубликованной Canoas, чтобы получить членство в группе для текущего пользователя.

Я сталкивался с этим методом в этой записи блога: http://www.travisrunyard.com/2013/03/26/auto-create-outlook-mapi-user-profiles/

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

Еще лучшая версия, которая использует регулярное выражение для удаления пустышки LDAP и оставляет только имена групп:

([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 к поиску активный-directory.aspx


1
Оба из них дают мне ошибку: Исключение вызывает «FindOne» с аргументом (ами) «0»: «Фильтр samaccountname = search недопустим».
Даллас

Странно .... Я только что проверил это снова, но на Windows 7 в совершенно другой среде, и здесь тоже работает нормально.
Daniel.S

Я попробовал снова только сейчас, все еще на Win 7, и он работает нормально. Возможно, у меня была опечатка, когда я впервые попробовал это. Спасибо за добавление замены, чтобы убрать лесную "болтовню".
Даллас

2
Прекрасно работает, добавьте, | Sort-Objectчтобы сделать его еще более читабельным.
Мартин Холлингсворт,

31

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

net user mst999 /domain 

1
он также работает на клиентских машинах без дополнительных инструментов AD
Rast

4
К сожалению, если имена ваших групп длинные (то есть> 21 символа), они будут обрезаны ...
kiltannen

тот бьет любой другой путь! Bravo
StayCool

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

Спасибо! это сработало. Единственным недостатком является то, что возвращаемое значение является строкой.
shaiss

3
| get-adgroup выведет объекты группы. Brilliant!
8DH

1
или вместо этого используйте $ env: USERNAME, чтобы получить имя пользователя, вошедшего в систему в данный момент
Дэйв Лукр,

6

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

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

Вам также не нужно входить в систему как пользователь, если вы используете что-то вроде$id = [Security.Principal.WindowsIdentity]("username")
Биткойн Murderous Maniac

1
Это красиво сокращается до однострочного [System.Security.Principal.WindowsIdentity]::GetCurrent().Groups | % {$_.Translate([Security.Principal.NTAccount])} .
alx9r

5

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

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

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

Но также посмотрите бесплатные команды Quest PowerShell для Active Directory .

[ Изменить : команда Get-ADPrincipalGroupMembership включена в Powershell, начиная с версии 2 с Windows 2008 R2. См. Ответ Кштрауса ниже.]


2
На самом деле, есть более простой способ с помощью командлетов Quest: Get-QADGroup -Contains Primoz
fenster

18
Это уже не лучший ответ, так как Get-ADPrincipalGroupMembership теперь встроен в PowerShell
Роб Кэннон,

1
Отклонено, потому что было бы намного лучше использовать Get-ADPrincipalGroupMembership. Я хотел бы отменить этот голос против, но не могу. Я отредактирую ответ, чтобы указать, что встроенная опция теперь существует.
Авраам

4

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.


4

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

import-module activedirectory

Затем введите эту команду:

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

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


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

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


4

Это должно предоставить вам подробную информацию о текущем пользователе. Powershell не нужен.

whoami /groups


3

Это всего лишь одна строка:

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

конец :)


Подключение этого к a select -expandproperty memberofсделает вывод более читабельным / полезным.
Ben Thul 07

2

Я написал функцию 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

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-QADUser -SamAccountName LoginID | % {$ _. MemberOf} | Get-QADGroup | выберите имя


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

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

Get-ADPrincipalGroupMembership username | Format-Table -auto

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

Get-ADPrincipalGroupMembership username | select name, GroupScope, GroupCategory

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

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

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

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, из которого вы хотите вывести список пользователей :)

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



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

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

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

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

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

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

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

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

Get-WmiObject -Class Win32_Group

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

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

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


Если вы проверяете пользователя, который уже является членом группы администраторов, убедитесь, что PowerShell запускается с помощью «Запуск от имени администратора», иначе группы не будут отображаться правильно для второй команды ... потребовалось довольно много времени, чтобы понять это из ... окна ...
Жуйфэн Ма

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

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

$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)
    }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.