繁体   English   中英

通过访问 Active Directory,我能否仅从用户名/电子邮件地址获取用户的 object GUID?

[英]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的正确轨道上。 您只需要一个适当的查询,以及一些其他的调整。

  1. 修改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))
    • 什么通常称为“用户名”,通常格式为 DOMAIN\username: (&(objectClass=user)(objectClass=person)(sAMAccountName=myusername))
  2. 使用DirectorySeacher.PropertiesToLoad 如果不这样做,它将检索具有 value 的每个属性,这只是浪费的网络流量。

  3. 您不需要处置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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM