web-dev-qa-db-ja.com

特定のグループのすべてのユーザーを列挙するためのADクエリ構文は何ですか?

これがしないこれまでのところ機能します。

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

(&(objectClass = Group)(objectCategory = Group)(member = CN = group_in_question))

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

(&(objectCategory = person)(objectClass = user)(memberOf = cn = group_in_question、ou = Groups、dc = mydomain、dc = com))

4
Greg Meehan

3番目の構文は、私のドメインの1つに対してLDP.EXEでうまく機能します。私は通常(objectCategory = person)をそこに入れませんが、それでもうまくいきます。

それを使用しようとすると、どのようなエラーが発生しますか?

2
Evan Anderson

このタイプのクエリでは、いくつかの考慮事項があります。

  1. このクエリはいくつのオブジェクトを返す可能性がありますか?
  2. グループのメンバーであるグループを拡張しますか?
  3. 「大規模」グループ(1500人を超えるメンバー)を処理する必要がありますか?

クエリでユーザーの大規模なデータベースを検索する必要がある場合は、常に「(ObjectCategory = person)」を含める必要があります。これを実行する理由はいくつかあります。 ObjectCategoryは、objectClassがないインデックス属性です。これにより、大規模なADデータベースでのクエリ速度が大幅に向上します。また、objectCategory属性とobjectClass属性の両方を使用すると、「連絡先」オブジェクトがクエリで返されなくなります。

結果セットが1000を超える結果を返す場合は、パフォーマンスの問題に注意する必要があります。 ADUC GUIには、「オプション」ダイアログを介して変更できる2000項目の制限があり、増加するとクエリが大幅に遅くなる可能性があります。 VBScriptを使用してGetObjectの結果を列挙する場合、大きなグループの場合、これも非常に遅くなります。 Quest Powershellコマンドレットの場合、「-sizelimit」パラメーターを含めて、1000アイテムの制限を上書きする必要があります。

get-qadgroupmember somegroup -sizelimit 0

コード(VBScript、JScript、.Net)を使用して接続オブジェクトを作成し、それにLDAPクエリを追加する場合、デフォルトではページングされた結果を取得するために、接続オブジェクトに ".pageSize"プロパティを設定する必要があります。ページングされた結果を返さず、1000アイテムに制限します。私は通常、.pageSizeを1000に設定します。

入れ子になったグループを展開するのは、少し注意が必要です。ネストされたグループ情報を取得する最も簡単な方法は、Quest Powershellコマンドレットを使用することです。

get-qadgroupmember somegroup -indirect -sizelimit 0

VBscript/JScriptスクリプトから、 "GetObject"を使用してメンバーコレクションを列挙し、各メンバーの "ユーザーまたはグループ"をテストしてから、ネストされたグループに再帰できます。これは遅いので、VBScriptプログラミングの練習以外では、実行しないでください。

最終的には、直接LDAPクエリを介してそれを実行することを学習したいと思うでしょう。これは LDAP_MATCHING_RULE_IN_CHAIN 演算子を介して行われます。この演算子は使いづらい場合があり、DCの場合、グループの入れ子構造が深い場合、非常に高価になる可能性があります。この方法の利点は、非常に大規模なグループ(デフォルトで1500メンバー)グループを取得してメンバー属性を読み取ろうとするのではなく、グループのメンバーであるユーザーに対して(間接的にでも)クエリを実行できます(これは 「大規模」グループ用の特別なメソッド 。つまり、大きなattrbiute配列を読み取ろうとしている単一のグループオブジェクトよりも率の高いUserオブジェクトのレポートを取得します。

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

「大きな」グループで問題が発生している場合は、.member属性へのアクセスを制限するときにADが使用する制限を増やすこともできます。

9
Ryan Fisher

問題は、Aグループのすべてのユーザーを見つけることであり、ユーザーがAグループの一部であるかどうかを見つけることではないと思いましたか?

グループのすべてのメンバーを検索したい場合

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

ネストされたメンバーを検索する場合も使用します

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

メンバーが1000または1500を超える場合、dsqueryは結果を提供しない可能性があります。その場合は joeware.net のadfind.exeを使用します

ADFIND -f "&(objectcategory=group)(cn=MyGroup)" member 
1
KAPes

ユーザーDNのリストとそれらのパース属性を含むファイルからプルするスクリプトを作成しようとするために何日も働いた。 JFVの応答であなたのサイトを訪れ、心臓発作を起こしました。 JFVの応答から作成したスクリプトは次のとおりです。基本的に、なぜグループから直接プルできるのにファイルから読み取るのか(まだエラートラップはありません)...このスクリプトを使用すると、テキストファイルをExcelまたは他のスプレッドシートアプリにプルして、パイプを排除できます。その時点で、必要なすべての並べ替えを実行できます。他の人が私の損失から得ることができると思いました。 :-(

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
1
Jeff

KAPes、あなたは私が興味のある質問に答えています。グループAのすべてのメンバーをリストします。ただし、コマンドの例は「メンバー」が複数であるべきなので機能しません-members。 Active Directoryグループのすべてのメンバーを、ログイン名、表示名、および電子メールアドレス(すべて1行)の適切にフォーマットされたテーブルに列挙するには:

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

詳細: http://technet.Microsoft.com/en-us/library/cc755876%28WS.10%29.aspx#BKMK_group

0
matt wilkie

これは、Quest ADコマンドレットを使用してPowerShellで最も簡単に実行できます-

get-QADGroupMember [groupname]

次に、フィルタリングして並べ替えます。

get-QADGroupMember [groupname] | where {$_.[Property] -like [criteria]} | sort-object
0
Doug Chase

これは、VBScriptを介して使用したものです。

ユーザーの列挙

   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
0
JFV