我有两个查询,用于检索域中的所有组和所有用户, Mydomain
Mydomain
--; Get all groups in domain MyDomain select * from OpenQuery(ADSI, ' SELECT samaccountname,mail,sn,name, cn, objectCategory FROM ''LDAP://Mydomain/CN=users,DC=Mydomain,DC=com'' WHERE objectCategory=''group'' ORDER BY cn ') --; Get all users in domain MyDomain select * from OpenQuery(ADSI,' SELECT objectCategory, cn, sn, mail, name, department,samaccountname FROM ''LDAP://Mydomaindomain/CN=users,DC=Mydomain,DC=com'' WHERE objectCategory=''user'' ORDER BY cn ') -- where samaccountname='mylogin'
我想找出的是
如何检索MyDomain特定用户所属的所有组的列表?
MyDomain
[更新] 我能够得到相反的结果 给定组名,检索所有用户
select * from OpenQuery(ADSI, 'SELECT objectCategory, cn, sn, mail, name, department FROM ''LDAP://Mydomain/CN=users,DC=wl-domain,DC=com'' WHERE MemberOf=''cn=_____GROUPNAME_____,CN=users,DC=Mydomain,DC=com'' ORDER BY cn' )
我认为这是基于T-SQL的AD界面的局限性之一-您无法检索多值属性,例如memberOf其中具有多个值的属性(如针对用户的属性)。
memberOf
您可以检索单值属性,例如“ sn”(姓氏=姓氏)或“ givenName”和“ mail”等,但是基于SQL的接口无法处理分配有多个值的属性,例如“memberOf”给他们。
因此,恐怕您将不得不采用另一种方法来解决此问题-例如,在托管代码中查找并填充组成员身份(分别在SQL Server外部或在SQLServer内部作为CLR程序集)。
更新: 请参见此处(MSDN支持)以了解OPENQUERY AD提供程序的局限性:
局限性 使用OPENQUERY语句从LDAP服务器提取信息的过程确实存在一些局限性。在某些情况下可以避免这些限制,但是在其他情况下,必须更改应用程序设计。另一种可行的方法是使用ADSI从LDAP服务器检索信息,然后通过使用ADO或其他数据访问方法在SQL中构建表的外部应用程序或COM对象。 第一个限制是 该 多值属性无法 在结果集返回 到SQL Server。ADSI将从LDAP服务器读取模式信息,该信息定义了服务器使用的类和属性的结构和语法。如果从LDAP服务器请求的属性在模式中定义为多值,则不能在OPENQUERY语句中返回该属性。
局限性
使用OPENQUERY语句从LDAP服务器提取信息的过程确实存在一些局限性。在某些情况下可以避免这些限制,但是在其他情况下,必须更改应用程序设计。另一种可行的方法是使用ADSI从LDAP服务器检索信息,然后通过使用ADO或其他数据访问方法在SQL中构建表的外部应用程序或COM对象。
第一个限制是 该 多值属性无法 在结果集返回 到SQL Server。ADSI将从LDAP服务器读取模式信息,该信息定义了服务器使用的类和属性的结构和语法。如果从LDAP服务器请求的属性在模式中定义为多值,则不能在OPENQUERY语句中返回该属性。