更快地找出用户是否存在于系统上?

我有一个应用程序,检查用户是否存在(如果不创build它)每次启动。 这是如下完成的:

bool bUserExists = false; DirectoryEntry dirEntryLocalMachine = new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer"); DirectoryEntries dirEntries = dirEntryLocalMachine.Children; foreach (DirectoryEntry dirEntryUser in dirEntries) { bUserExists = dirEntryUser.Name.Equals("UserName", StringComparison.CurrentCultureIgnoreCase); if (bUserExists) break; } 

问题出现在大部分部署的系统上。 这可能需要6 – 10秒,这是太长了…我需要find一种方法来减less(尽可能)。 有没有更好更快的方式来validation用户是否存在于系统上?

我知道还有其他的方法可以解决这个问题,就像其他的应用程序睡了10秒,或者准备好后这个工具会发送一个消息,等等。但是如果我能够大大减lessfind用户的时间,这会让我的生活变得更轻松。

.NET 3.5支持System.DirectoryServices.AccountManagement命名空间下的新AD查询类。

要使用它,您需要添加“System.DirectoryServices.AccountManagement”作为参考,并添加using语句。

 using System.DirectoryServices.AccountManagement; using (PrincipalContext pc = new PrincipalContext(ContextType.Machine)) { UserPrincipal up = UserPrincipal.FindByIdentity( pc, IdentityType.SamAccountName, "UserName"); bool UserExists = (up != null); } 

<.NET 3.5

对于3.5以前版本的.NET,这里是一个干净的例子,我在dotnet-snippets上找到

 DirectoryEntry dirEntryLocalMachine = new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer"); bool UserExists = dirEntryLocalMachine.Children.Find(userIdentity, "user") != null; 

你想使用DirectorySearcher。

像这样的东西:

 static bool userexists( string strUserName ) { string adsPath = string.Format( @"WinNT://{0}", System.Environment.MachineName ); using( DirectoryEntry de = new DirectoryEntry( adsPath ) ) { try { return de.Children.Find( strUserName ) != null; } catch( Exception e ) { return false; } } } 

这应该更快。 此外,如果您正在检查是否存在,则可以减少属性。

如果“用户名”存在,则命令提示符中的以下内容将返回1。

网络用户| 找到“用户名”/ c

这应该做到这一点(当你不能使用System.DirectoryServices.AccountManagement):

 static bool userExists(string sUser) { using (var oUser = new DirectoryEntry("WinNT://" + Environment.MachineName + "/" + sUser + ",user")) { return (oUser != null); } }