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?
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))
Existem várias coisas a considerar para este tipo de consulta:
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.
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
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
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
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
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
Tags windows ldap active-directory