Qual é a sintaxe de consulta do AD para enumerar todos os usuários de um grupo específico?

4

Veja o que não funciona até agora;

(& (objectCategory = Person) (objectClass = Grupo) (CN = group_in_question))

(& (objectClass = Group) (objectCategory = Grupo) (membro = CN = group_in_question))

(& (samAccountName =% USERNAME%) (membro = CN = group_in_question))

(& (objectCategory = person) (objectClass = usuário) (memberOf = cn = group_in_question, ou = Grupos, dc = mydomain, dc = com))

    
por Greg Meehan 02.06.2009 / 20:26

7 respostas

2

A terceira sintaxe funciona bem para mim em LDP.EXE contra um dos meus domínios. Eu normalmente não coloco o (objectCategory = person) lá, mas também funciona bem com ele.

Que tipo de erro você está recebendo quando tenta usar isso?

    
por 02.06.2009 / 20:31
9

Existem várias coisas a considerar para este tipo de consulta:

  1. Quantos objetos essa consulta provavelmente retornará?
  2. Deseja expandir em grupos que são membros de grupos?
  3. Você precisa lidar com grupos "grandes" (maiores de 1500 membros)?

Você deve sempre incluir "(ObjectCategory = person)" se sua consulta tiver que pesquisar um grande banco de dados de usuários. Existem vários motivos pelos quais você deseja fazer isso. ObjectCategory é um atributo indexado onde objectClass não é, isso aumentará significativamente sua velocidade de consulta em grandes bancos de dados do AD. Além disso, usar os atributos objectCategory e objectClass impedirá que objetos "contato" sejam retornados em sua consulta.

Se o seu conjunto de resultados devolver mais de 1000 resultados, você precisa estar ciente dos problemas de desempenho. No ADUC GUI há um limite de 2000 itens que você pode alterar através da caixa de diálogo "Opções", o que pode diminuir drasticamente sua consulta. Se você for usar o VBScript e enumerar um resultado GetObject, isso também será MUITO MUITO lento, para grupos grandes. Para os cmdlets do Quest Powershell, é necessário incluir o parâmetro "-sizelimit" para substituir o limite de 1.000 itens:

get-qadgroupmember somegroup -sizelimit 0

Se você estiver usando código (VBScript, JScript, .Net) para criar um objeto de conexão e adicionar uma consulta LDAP a ele, será necessário definir a propriedade ".pageSize" no objeto de conexão para obter um resultado paginado como o padrão é não retornar um resultado paginado, mas limitá-lo a 1000 itens. Eu costumo definir .pageSize para 1000, como esse é o máximo.

Expandir grupos aninhados é o pouco complicado. A maneira mais simples de obter informações de grupos aninhados é usar os cmdlets do Quest Powershell:

get-qadgroupmember somegroup -indirect -sizelimit 0

A partir de um script VBscript / JScript, você pode usar "GetObject" e enumerar a coleção de membros, testar cada membro para "usuário ou grupo" e depois recorrer a grupos aninhados. Isso é lento e você não deve fazê-lo, exceto como um exercício de programação VBScript.

Por fim, você provavelmente desejará aprender a fazer isso por meio de uma consulta LDAP direta. Isso é realizado por meio do operador LDAP_MATCHING_RULE_IN_CHAIN . Esse operador pode ser difícil de usar e pode ser MUITO CARO no DC se você tiver uma estrutura de aninhamento profunda para seus grupos. O bônus deste método é que, para grupos muito grandes (mais de 1500 membros por padrão), você poderá fazer uma consulta para usuários que sejam membros do grupo (mesmo que indiretamente), em vez de recuperar o grupo e tentar ler o grupo. Atributo de membro (que tem que ser tratado em um método especial para grupos "grandes" . Ou seja, você obtém um relatório de objetos Usuário, classificando-o em relação a um único objeto de grupo no qual você está tentando ler uma grande matriz de attrbiute.

(&(objectCategory=person)(objectClass=user)(memberof:1.2.840.113556.1.4.1941:=(cn=Group1,OU=groupsOU,DC=x)))

Se você está tendo problemas com grupos "grandes", também pode aumentar o limite que o AD usa ao restringir o acesso ao atributo .member.

    
por 02.06.2009 / 22:10
1

Eu pensei que a questão é encontrar todos os usuários de um grupo e não encontrar se um usuário é parte de um grupo?

se você quiser encontrar todos os membros de um grupo use

dsquery group -name "MyGroup" | dsget group -member

E se você quiser encontrar membros aninhados, use também

dsquery group -name "MyGroup" | dsget group -member -expand

Se houver mais de 1000 ou 1500 membros, o dsquery pode não fornecer resultados. Nesse caso, use adfind.exe em joeware.net

ADFIND -f "&(objectcategory=group)(cn=MyGroup)" member 
    
por 28.06.2009 / 15:39
1

Trabalhei durante dias para tentar produzir um script que fosse extraído de um arquivo contendo uma lista de atributos de DN do usuário e de análise para eles. Entrou em seu site com a resposta do JFV e teve um ataque cardíaco. Aqui está o roteiro que eu produzi da resposta do JFV. Basicamente, por que ler a partir de um arquivo quando você pode puxar diretamente do grupo (sem erro de captura ainda) ... Este script permite-me puxar o arquivo de texto para o Excel ou outro aplicativo de planilha e deliminar nos tubos. Eu posso fazer toda a classificação que eu quero nesse momento. Apenas pensei que os outros poderiam ganhar com a minha perda. : - (

Dim objGroup

Dim objUser

on error resume next

'Create a file and write headers
Set fs = CreateObject("Scripting.FileSystemObject")

Set f = fs.CreateTextFile ("lastpassword.txt")

f.WriteLine "firstName|initials|lastName|userPrincipalName|physicalDeliveryOfficeName|sAMAccountName|mail|cn|description|mobile|telephoneNumber|physicalDeliveryOfficeName|department|facsimileTelephoneNumber|pager"

'Search for a group name in AD and parse information to a file in pipe delimination

   Set objGroup = Getobject ("LDAP: //CN=groupname,OU=GROUPS,DC=FQDN,DC=FQDN,DC=FQDN")

   For Each objUser In objGroup.Members

      f.WriteLine objUser.firstName & "|" & _

            objUser.initials & ".|" & _

            objUser.lastName & "|" & _

            objUser.userPrincipalName & "|" & _

            objUser.physicalDeliveryOfficeName & "|" & _

            objUser.sAMAccountName & "|" & _

            objUser.mail & "|" & _

            objUser.cn & "|" & _

            objUser.description & "|" & _

            objuser.mobile & "|" & _

            objuser.telephoneNumber & "|" & _

            objuser.physicalDeliveryOfficeName & "|" & _

            objuser.department & "|" & _

            objuser.facsimileTelephoneNumber & "|" & _

            objuser.userAccountControl & "|" & _

            objUser.PasswordLastChanged

   Next

f.close
    
por 28.04.2011 / 14:40
0

Aqui está algo que eu usei via VBScript:

Enumerando Usuários

   Dim objGroup
   Dim x 

   Set objGroup = Getobject ("LDAP: //CN=LocalGrp,OU=Staff, DC=net, DC=dom")
   For Each x In objGroup.Members
      WScript.Echo x.Class
      WScript.Echo x.Name
      WScript.Echo x.ADsPath
      WScript.Echo x.distinguishedName + vbCrLf
   Next
    
por 02.06.2009 / 20:45
0

Isso pode ser feito com mais facilidade no PowerShell com os cmdlets do Quest AD -

get-QADGroupMember [groupname]

Em seguida, filtre e ordene!

get-QADGroupMember [groupname] | where {$_.[Property] -like [criteria]} | sort-object
    
por 02.06.2009 / 20:40
0

KAPes, você está respondendo à questão em que estou interessado, liste todos os membros do grupo A. No entanto, seu exemplo de comando não funciona, pois "membro" deve ser plural, -members . Para enumerar todos os membros de um grupo do Active Directory em uma tabela bem formatada de nome de login, nome de exibição e endereço de e-mail (todos em uma linha):

dsget group "CN=Group A,OU=DepartmentB,OU=Users and Groups,DC=my,DC=domain,DC=com" -members | dsget user -samid -display -email

Mais informações: link

    
por 29.09.2009 / 23:09