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

时间:2009-11-04 18:43:54

标签: c# windows active-directory

我有一个应用程序,每次启动时都会检查用户是否存在(如果没有创建)。这样做如下:

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秒,这太长了......我需要找到一种方法来减少这种情况(尽可能多)。是否有更好更快的方式,我可以用它来验证系统上是否存在用户?

我知道还有其他方法可以解决这个问题,例如让其他应用程序休眠10秒,或者让这个工具在准备就绪时发送消息等等......但是如果我可以大大减少所需的时间找到用户,这将使我的生活更轻松。

4 个答案:

答案 0 :(得分:22)

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

要使用它,您需要添加“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);
}

<强>&LT; .NET 3.5

对于3.5之前的.NET版本,这是我在dotnet-snippets

上找到的一个干净的例子
DirectoryEntry dirEntryLocalMachine =
    new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer");

bool UserExists =
    dirEntryLocalMachine.Children.Find(userIdentity, "user") != null;

答案 1 :(得分:5)

您想使用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;
        }
    }
}

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

答案 2 :(得分:1)

如果'username'存在,命令提示符中的以下内容将返回1.

净用户|找到“用户名”/ c

答案 3 :(得分:0)

这应该这样做(当你不能使用System.DirectoryServices.AccountManagement时):

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