如何在 C# 中获取当前用户的 Active Directory 详细信息
Posted
技术标签:
【中文标题】如何在 C# 中获取当前用户的 Active Directory 详细信息【英文标题】:How to get the current user's Active Directory details in C# 【发布时间】:2010-10-12 20:33:06 【问题描述】:我正在开发一个使用 Windows 身份验证的 C# 和 ASP.Net 应用程序。
即在 Web.config 中:
<system.web>
<authentication mode="Windows" />
</system.web>
我想从 Active Directory 中获取当前用户的详细信息(全名、电子邮件地址等)。
我可以通过使用获得他们在 Windows 2000 之前的用户登录名(例如:SOMEDOMAIN\someuser
)
string username = HttpContext.Current.Request.ServerVariables["AUTH_USER"];
我已经为用户制定了 LDAP 查询,使用他们当前的登录名(不是他们在 Windows 2000 之前的用户登录名):
DirectorySearcher adSearch = new DirectorySearcher(
"(userprincipalname=someuser@somedomain.com.au)");
SearchResult adSearchResult = adSearch.FindOne();
但是,我不知道如何使用他们的预 W2K 登录名搜索 AD 以查找用户,或者以“someuser@somedomain.com.au”格式获取他们的登录名。
有什么想法吗?
【问题讨论】:
【参考方案1】:Alan 已经给了你正确的答案 - 使用 sAMAccountName
过滤你的用户。
我会添加关于您使用 DirectorySearcher
的建议 - 如果您只需要一两条信息,请将它们添加到 DirectorySearcher
的 "PropertiesToLoad"
集合中。
而不是检索整个大用户对象然后挑选一两个项目,这只会返回您需要的那些位。
示例:
adSearch.PropertiesToLoad.Add("sn"); // surname = last name
adSearch.PropertiesToLoad.Add("givenName"); // given (or first) name
adSearch.PropertiesToLoad.Add("mail"); // e-mail addresse
adSearch.PropertiesToLoad.Add("telephoneNumber"); // phone number
这些只是您需要指定的常用 AD/LDAP 属性名称。
【讨论】:
【参考方案2】:“pre Windows 2000”名称,即DOMAIN\SomeBody
,Somebody
部分称为 sAMAccountName。
那就试试吧:
using(DirectoryEntry de = new DirectoryEntry("LDAP://MyDomainController"))
using(DirectorySearcher adSearch = new DirectorySearcher(de))
adSearch.Filter = "(sAMAccountName=someuser)";
SearchResult adSearchResult = adSearch.FindOne();
someuser@somedomain.com.au 是 UserPrincipalName,但它不是必填字段。
【讨论】:
不,不是。 sAMAccountName 不包含“DOMAIN\”部分,因此对于林范围的查询毫无用处。 确实,缺少“DOMAIN\”是有问题的。 抱歉,注释与代码示例不符。是的,sAMAccountName 只是 DOMAIN\username 的“用户名”部分。 sAMAccountName 没有forrest 的概念,因为它是Windows2000 之前的概念。如果您需要搜索 W2k+ 域林,请使用 UPNusername@DOMAIN
【参考方案3】:
如果您使用的是 .NET 3.5 SP1+,更好的方法是查看
System.DirectoryServices.AccountManagement namespace.
它具有查找人员的方法,您几乎可以传递您想要的任何用户名格式,然后返回您需要的大部分基本信息。如果您在加载更复杂的对象和属性方面需要帮助,请查看 http://umanage.codeplex.com 的源代码,它得到了一切。
布伦特
【讨论】:
【参考方案4】:添加对 COM“Active DS 类型库”的引用
Int32 nameTypeNT4 = (int) ActiveDs.ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_NT4;
Int32 nameTypeDN = (int) ActiveDs.ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_1779;
Int32 nameTypeUserPrincipalName = (int) ActiveDs.ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_USER_PRINCIPAL_NAME;
ActiveDs.NameTranslate nameTranslate = new ActiveDs.NameTranslate();
// Convert NT name DOMAIN\User into AD distinguished name
// "CN= User\\, Name,OU=IT,OU=All Users,DC=Company,DC=com"
nameTranslate.Set(nameTypeNT4, ntUser);
String distinguishedName = nameTranslate.Get(nameTypeDN);
Console.WriteLine(distinguishedName);
// Convert AD distinguished name "CN= User\\, Name,OU=IT,OU=All Users,DC=Company,DC=com"
// into NT name DOMAIN\User
ntUser = String.Empty;
nameTranslate.Set(nameTypeDN, distinguishedName);
ntUser = nameTranslate.Get(nameTypeNT4);
Console.WriteLine(ntUser);
// Convert NT name DOMAIN\User into AD UserPrincipalName Name.User@Company.com
nameTranslate.Set(nameTypeNT4, ntUser);
String userPrincipalName = nameTranslate.Get(nameTypeUserPrincipalName);
Console.WriteLine(userPrincipalName);
【讨论】:
使用NameTranslate获取DSN才是正道 您好,我尝试这样做,但是当我添加“Active DS 类型库”时,会出现一个黄色三角形,就像警告一样。我在windows 10,你知道发生了什么吗?谢谢以上是关于如何在 C# 中获取当前用户的 Active Directory 详细信息的主要内容,如果未能解决你的问题,请参考以下文章
在 C# 中验证远程 Active Directory 的用户