问题描述
我希望能够使用该用户的显示名称在 Active Directory 中获取该用户的用户 ID.显示名称是从数据库中获取的,并在该用户的会话期间使用以下代码存储以获取显示名称:
I want to be able to obtain the userid of a user in Active Directory using the display name of that user. The display name is obtained from a database, and has been stored during that user's session using the following code to obtain the display name:
using System.DirectoryServices.AccountManagement; private string GetDisplayName() { // set up domain context PrincipalContext ctx = new PrincipalContext(ContextType.Domain); // find currently logged in user UserPrincipal user = UserPrincipal.Current; return user.DisplayName; }
这一次,我想要一个名为 GetUserIdFromDisplayName() 的方法来返回 Active Directory 登录名.有什么想法吗?
This time around, I would like to have a method named GetUserIdFromDisplayName() that returns the Active Directory login name. Any ideas?
推荐答案
我相信通过使用 System.DirectoryServices.AccountManagement (SDS.AM) 命名空间.
I believe you can do it much more easily than with David's answer by using the built-in functionality of the System.DirectoryServices.AccountManagement (S.DS.AM) namespace.
基本上,您可以定义域上下文并轻松找到 AD 中的用户和/或组:
Basically, you can define a domain context and easily find users and/or groups in AD:
using System.DirectoryServices.AccountManagement; private string GetUserIdFromDisplayName(string displayName) { // set up domain context using(PrincipalContext ctx = new PrincipalContext(ContextType.Domain)) { // find user by display name UserPrincipal user = UserPrincipal.FindByIdentity(ctx, displayName); // if (user != null) { return user.SamAccountName; // or maybe you need user.UserPrincipalName; } else { return string.Empty; } } }
我认为没有必要访问底层的 DirectoryEntry 对象,真的 - 除非 UserPrincipal 的所有属性都不是您真正需要的.
I don't see any need to go to the underlying DirectoryEntry object, really - unless none of the properties of the UserPrincipal really are what you're looking for.
PS:如果按显示名称搜索不起作用(我手头没有 AD 来测试它) - 您也可以随时使用 PrincipalSearcher 来查找您的用户:
PS: if the search by display name shouldn't work (I don't have an AD at hand to test it right now) - you can always also use the PrincipalSearcher to find your user:
using System.DirectoryServices.AccountManagement; private string GetUserIdFromDisplayName(string displayName) { // set up domain context using(PrincipalContext ctx = new PrincipalContext(ContextType.Domain)) { // define a "query-by-example" principal - here, we search for a UserPrincipal // and with the display name passed in UserPrincipal qbeUser = new UserPrincipal(ctx); qbeUser.DisplayName = displayName; // create your principal searcher passing in the QBE principal PrincipalSearcher srch = new PrincipalSearcher(qbeUser); // find match - if exists UserPrincipal user = srch.FindOne() as UserPrincipal; if (user != null) { return user.SamAccountName; // or maybe you need user.UserPrincipalName; } else { return string.Empty; } } }