空虚的领带 · 元素定位之css ...· 1 年前 · |
大气的芒果 · selenium ...· 1 年前 · |
面冷心慈的菠萝 · Pandas 向csv文件追加列 - 知乎· 1 年前 · |
豪情万千的麻辣香锅 · JS - 根据数组中对象的某个属性进行排序 ...· 1 年前 · |
瘦瘦的海豚 · Codespaces ...· 1 年前 · |
我有两个查询可以检索域中的所有组和所有用户,
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
中的所有组的列表?
更新 i能够得到相反的结果
给定组名,检索所有用户
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'
)
Microsoft Technet脚本中心 是脚本的优秀资源
http://technet.microsoft.com/en-us/scriptcenter/default.aspx
这里有一个脚本,声称给出了您想要的内容:
http://gallery.technet.microsoft.com/ScriptCenter/en-us/ab5400e2-489a-4738-9b85-508bcb5b75f8
我认为这是基于that接口的限制之一--您不能检索多值属性,例如包含多个值的属性(比如用户的
memberOf
)。
您可以检索单值属性,如"sn“(姓氏=姓氏)或"givenName”和"mail“等等,但基于SQL的接口无法处理诸如"memberOf”之类的属性,并分配给它们几个值。
因此,恐怕您必须采取另一种方法来解决这个问题--例如,在托管代码中查找和填充组成员(在Server之外,或者可能作为Server中的CLR程序集)。
更新: 参见 这里(MSDN支持) 以了解OPENQUERY AD提供程序的限制:
局限性 使用OPENQUERY语句从LDAP服务器提取信息的过程确实受到了一些限制。在某些情况下,这些限制是可以避免的,但在另一些情况下,应用程序设计必须改变。使用ADSI从LDAP服务器检索信息,然后使用ADO或其他数据访问方法在SQL中构建表的外部应用程序或COM对象是另一种可行的方法。 第一个限制是 ,即多值属性不能在结果集 中返回给Server。ADSI将从LDAP服务器读取模式信息,该服务器定义服务器使用的类和属性的结构和语法。如果从LDAP服务器请求的属性在模式中定义为多值属性,则不能在OPENQUERY语句中返回该属性。
您可以通过获取在其成员属性中包含用户的所有组,或者更好地获取用户的LDAP路径(distinguishedName)来实现这一点。这是一个简单的程序来做这个工作。
CREATE PROCEDURE dbo.GetLdapUserGroups
@LdapUsername NVARCHAR(256)
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
-希尔伯特
实际上,撤回用户所属的所有组的列表并不像看起来那么直接/容易。据我所知,PowerShell和其他脚本都不能提供完全准确的结果,即使在检索tokenGroups属性时也是如此,因为为了做出这个判断,还必须考虑到Builtin组的成员资格,这是特定于域的。
在ActiveDirSec.org上有一个非常有用的线程,我认为您可能会发现它很有用- 如何枚举用户所属的所有域安全组的列表? 。
根据我的经验,我已经了解到,这并不像看起来那么容易,除非您有一种方法可以确定地验证输出,否则也无法知道您的脚本是否提供了正确的结果。
下面的存储过程,使用示例执行:
Get_ADGroups_ForUser 'Beau.Holland‘--AccountName
注意:将LDAP://DC= DC=local替换为您自己的域。
CREATE PROCEDURE dbo.Get_ADGroups_ForUser
@Username NVARCHAR(256)
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
面冷心慈的菠萝 · Pandas 向csv文件追加列 - 知乎 1 年前 |