[英]How can I get Active Directory username from their Exchange email address?
[英]With access to Active Directory, can I get an object GUID for a user from an username/email address alone?
背景
我一直在尝试 C# 中的活动目录访问,以了解如何以各种方式连接/验证凭据。 在这个答案的底部,我包含了一些代码片段,以了解我所做的事情,也许可以以此为基础来实现我的目标。
主要目标
如果我有连接到 Active Directory 的有效凭据,我可以获取代表用户名/电子邮件地址的字符串(假设它存在于userPrincipalName
或类似字段中),然后取回objectGUID
吗?
或者我是否需要考虑其他事情,例如:这些凭据搜索其他用户的权限; 了解不同广告的结构; 如果userPrincipalName
是正确的搜索字段?
代码片段(实验开始,不完全符合我的目标)
var credentials = new NetworkCredential(username, password, hostname);
var serverId = new LdapDirectoryIdentifier(hostname);
var connection = new LdapConnection(serverId, credentials);
try
{
connection.Bind();
}
catch (Exception e)
{
//error
Console.WriteLine(e);
connection.Dispose();
return;
}
//success
var dirEntry = new DirectoryEntry(string.Format("LDAP://{0}/{1}", hostname, baseDn), username, password);
var searcher = new DirectorySearcher(dirEntry)
{
Filter = "(&(&(objectClass=user)(objectClass=person)))"
};
var resultCollection = searcher.FindAll();
searcher.Dispose();
您在DirectorySeacher
的正确轨道上。 您只需要一个适当的查询,以及一些其他的调整。
修改Filter
,以便您找到所需的内容。
一个。 如果您有 email 地址:
(&(objectClass=user)(objectClass=person)(mail=email@example.com))
(&(objectClass=user)(objectClass=person)(proxyAddresses=smtp:email@example.com))
(这也将匹配辅助 email 地址)湾。 如果您有用户名,则取决于您拥有的用户名。
(&(objectClass=user)(objectClass=person)(userPrincipalName=username@example.com))
(&(objectClass=user)(objectClass=person)(sAMAccountName=myusername))
使用DirectorySeacher.PropertiesToLoad
。 如果不这样做,它将检索具有 value 的每个属性,这只是浪费的网络流量。
您不需要处置DirectorySearcher
,但您确实需要处置resultCollection
,因为文档说如果您将其留给垃圾收集,您最终可能会出现 memory 泄漏。
所以,假设你有userPrincipalName
,你会有这样的东西:
var userToLookFor = "username@example.com";
var dirEntry = new DirectoryEntry(string.Format("LDAP://{0}/{1}", hostname, baseDn), username, password);
var searcher = new DirectorySearcher(dirEntry)
{
Filter = $"(&(objectClass=user)(objectClass=person)(userPrincipalName={userToLookFor}))",
SizeLimit = 1 //we're only looking for one account
};
searcher.PropertiesToLoad.Add("objectGuid");
using (var resultCollection = searcher.FindAll())
{
if (resultCollection.Count == 1)
{
var userGuid = new Guid((byte[]) resultCollection[0].Properties["objectGuid"][0]);
}
else
{
//the account was not found - do something else
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.