【发布时间】:2011-12-21 14:56:08
【问题描述】:
如何通过 用户名 获得 Active Directory 用户的IADs 界面?
注意:本机代码
我正在尝试编写可以在 Active Directory 中获取 用户 的IADs 接口的函数。
到目前为止,我有以下“伪代码”:
public IADs GetUserObject(string samAccountName)
{
IADs ads;
//Get the current domain's distinguished name ("dc=stackoverflow,dc=com")
AdsGetObject("LDAP://rootDSE", IADs, ref ads);
String dn = ads.Get("defaultNamingContext"); //"dc=stackoverflow,dc=com"
String path;
//Attempt #1 to bind to a user by username
path = "LDAP://sSAMAccountName="+samAccountName+",dc=stackoverflow,dc=com"
AdsGetObject(path, IADs, ref ads); //invalid syntax
return ads;
}
我想不通的诀窍是如何通过用户的帐户名绑定到用户。以下变体不起作用:
LDAP://sSAMAccountName=ian,dc=stackoverflow,dc=comLDAP://dc=stackoverflow,dc=com;(&(objectCategory=user)(sAMAccountName=ian))<LDAP://dc=stackoverflow,dc=com>;(&(objectCategory=user)(sAMAccountName=ian))
编辑:
确实有效但没有回答我的问题的版本是:
LDAP://cn=Ian Boyd,ou=Avatar Users,dc=stackoverflow,dc=com它没有回答我的问题有两个原因:
- 我不知道用户的
CN(通用名)(例如 Ian Boyd),只知道他们的sAMAccountName(例如 ian)- 不适用于不在头像用户单位部门的用户;而且我不知道用户的 OU
这来自我之前的笔记:
注意:
- 我不知道域名的名称(不过没关系,我可以在运行时获取)
- 我不知道任何活动目录服务器的名称
- 我不知道用户所在的文件夹
tl;dr:你会如何编写实用函数:
public IADs GetUserObject(string samAccountName)
{
//TODO: ask stackoverflow
}
更新 2:
注意:
- 我已经知道如何查询用户信息using .NET's DirectorySearcher
- 我已经知道如何查询有关用户 using the Active Directory Services OLEDB provider with ADO 的信息(使用 SQL 语法,但不是本机语法)
- 我现在正在寻找代码来查询有关用户 using Active Directory Services COM objects 的信息(因此是关于为用户获取
IADs的问题)
更新 3:
当然可能需要我应用“过滤器”,但我不知道在哪里。唯一提到 Filter 的 ActiveDs 界面是 IADSContainer,但我不知道从哪里获得。
我随机尝试从根IADs接口获取IADsContainer接口,但是“rootDSE”不支持IADsContainer:
IADs ads = AdsGetObject("LDAP://rootDSE");
IADsContainer container = (IADsContainer)ads; //interface not supported exception
我可以
- 请教如何获取AD根的
IADsContainer- 所以我可以问如何递归搜索活动目录
- 所以我可以询问如何使用
IADsContainer进行过滤
- 所以我可以询问如何使用
- 所以我可以问如何递归搜索活动目录
但是跟踪所有这些问题很困难。
【问题讨论】:
-
为什么不尝试使用轻量级目录访问协议 Microsoft API(如 RFC 1823 中所述)
-
@JPBlanc 这将需要 另一个 stackoverflow 问题,“如何使用 RFC1823 的轻量级直接访问协议获得
IADs接口?”