我有两个查询检索域中的所有组和所有用户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
中所有群组的列表?
[更新] 我得到了相反的结果 给定组名称,检索所有用户
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'
)
答案 0 :(得分:18)
下面的存储过程,使用示例执行:
Get_ADGroups_ForUser 'Beau.Holland' - 帐号名称
注意:将LDAP:// DC = Domain,DC = local替换为您自己的域。
CREATE PROCEDURE dbo.Get_ADGroups_ForUser
(
@Username NVARCHAR(256)
)
AS
BEGIN
DECLARE @Query NVARCHAR(1024), @Path NVARCHAR(1024)
-- Find the fully qualified CN e.g: CN=Beau Holland,OU=Users,OU=Australia,OU=NSO,OU=Company,DC=Domain,DC=local
-- replace "LDAP://DC=Domain,DC=local" with your own domain
SET @Query = '
SELECT @Path = distinguishedName
FROM OPENQUERY(ADSI, ''
SELECT distinguishedName
FROM ''''LDAP://DC=Domain,DC=local''''
WHERE
objectClass = ''''user'''' AND
sAMAccountName = ''''' + @Username + '''''
'')
'
EXEC SP_EXECUTESQL @Query, N'@Path NVARCHAR(1024) OUTPUT', @Path = @Path OUTPUT
-- get all groups for a user
-- replace "LDAP://DC=Domain,DC=local" with your own domain
SET @Query = '
SELECT cn,AdsPath
FROM OPENQUERY (ADSI, ''<LDAP://DC=Domain,DC=local>;(&(objectClass=group)(member:1.2.840.113556.1.4.1941:=' + @Path +'));cn, adspath;subtree'')'
EXEC SP_EXECUTESQL @Query
END
GO
答案 1 :(得分:14)
您可以通过在其成员属性中提取包含用户的所有组来实现此目的,或者更好地获取用户的LDAP路径(distinguishedName)。这是一个完成这项工作的简单程序。
CREATE PROCEDURE dbo.GetLdapUserGroups
(
@LdapUsername NVARCHAR(256)
)
AS
BEGIN
DECLARE @Query NVARCHAR(1024), @Path NVARCHAR(1024)
SET @Query = '
SELECT @Path = distinguishedName
FROM OPENQUERY(ADSI, ''
SELECT distinguishedName
FROM ''''LDAP://DC=domain,DC=com''''
WHERE
objectClass = ''''user'''' AND
sAMAccountName = ''''' + @LdapUsername + '''''
'')
'
EXEC SP_EXECUTESQL @Query, N'@Path NVARCHAR(1024) OUTPUT', @Path = @Path OUTPUT
SET @Query = '
SELECT name AS LdapGroup
FROM OPENQUERY(ADSI,''
SELECT name
FROM ''''LDAP://DC=domain,DC=com''''
WHERE
objectClass=''''group'''' AND
member=''''' + @Path + '''''
'')
ORDER BY name
'
EXEC SP_EXECUTESQL @Query
END
- 希尔伯特
答案 2 :(得分:12)
我认为这是基于T-SQL的AD接口的限制之一 - 您无法检索多值属性,例如:属性(如用户的memberOf
),其中包含多个值。
您可以检索单值属性,如“sn”(姓氏=姓氏)或“givenName”和“mail”等,但基于SQL的界面无法处理“memberOf”等属性分配给他们的几个值。
所以我担心你不得不采取另一种方式解决这个问题 - 例如查找并填充托管代码中的组成员身份(单独在SQL Server之外,或者可能作为SQL Server中的CLR程序集)。
更新:有关OPENQUERY AD提供商限制的说明,请参阅here (MSDN Support):
限制
使用过程 拉开OPENQUERY语句 来自LDAP服务器的信息 受到一些限制。该 可以绕过限制 有些情况,但在其他情况下 应用程序设计必须改变。一个 外部应用程序或COM对象 使用ADSI来检索 来自LDAP服务器的信息和 然后使用ADO在SQL中构建一个表 或其他数据访问方法 另一种可行的方法。第一个限制是 多值属性不能 在结果集中返回到SQL 服务器。 ADSI将读取架构 来自LDAP服务器的信息 定义了结构和语法 。使用的类和属性 服务器。如果属性是 从LDAP服务器请求的是 在架构中定义为 多值它不能归还 一个OPENQUERY声明。
答案 3 :(得分:1)
实际上,检索用户所属的所有组的列表并不像看起来那么简单/容易。据我所知,PowerShell和其他脚本都无法提供完全准确的结果,即使在检索tokenGroups属性时也是如此,因为为了做出此决定,还必须考虑特定于域的内置组的成员身份。
ActiveDirSec.org上有一个非常有用的主题,我认为你可能觉得有用 - How to enumerate the list of all Active Directory domain security groups that a user belongs to?
根据我的经验,我了解到这并不像看起来那么容易,除非您有办法确认输出,否则也无法知道您的脚本是否提供了正确的结果。
答案 4 :(得分:-1)
Microsoft Technet脚本中心是脚本的绝佳资源
http://technet.microsoft.com/en-us/scriptcenter/default.aspx
这是一个声称可以准确提供您想要的内容的脚本:
http://gallery.technet.microsoft.com/ScriptCenter/en-us/ab5400e2-489a-4738-9b85-508bcb5b75f8