Как определить, нашел ли «DirectoryEntry» моего пользователя? - PullRequest
3 голосов
/ 01 октября 2010

Я использую этот простой метод поиска пользователя в текущем домене, который работает для всех пользователей, которые «существуют», но я не могу найти способ определить, существует ли пользователь.

string userLDAP = @"MYDOMAIN/username";
string path = "WinNT://" + userLDAP ;
DirectoryEntry root = new DirectoryEntry(path, null, null, AuthenticationTypes.Secure);

Помимо создания исключения, как я могу использовать запись в каталоге, чтобы определить, не существует ли пользователь?

 if (root.Properties != null)
      if (root.Properties["objectSid"] != null)  //// EXCEPTION HERE
          if (root.Properties["objectSid"][0] != null)

Ответы [ 4 ]

5 голосов
/ 05 октября 2010

Для этой цели лучше использовать DirectorySearcher ...

 string userName = "TargetUserName";

        using (DirectorySearcher searcher = new DirectorySearcher("GC://yourdomain.com"))
        {
            searcher.Filter = string.Format("(&(objectClass=user)(sAMAccountName={0}))", userName);

            using (SearchResultCollection results = searcher.FindAll())
            {
                if (results.Count > 0)
                  Debug.WriteLine("Found User");

            }
        }

Этот образец будет искать и весь лес, включая дочерние домены. Если вы хотите настроить таргетинг только на один домен, используйте «LDAP: //mydomain.com» вместо «GC: //mydomain.com». Вы также можете снабдить поисковик.SearchRoot каталогом DirectoryEntry для использования в качестве корня поиска (т. Е. Определенного подразделения или домена).

Не забывайте, что большинство материалов AD можно распечатать, поэтому утилизируйте их правильно, как показано выше.

0 голосов
/ 24 августа 2014

Я думаю, что простой способ проверить, если ваш DirectoryEntry объект указывает на существующую запись AD, использует статический Exists метод.

Так что ваш код может выглядетьвот так:

using(DirectoryEntry de = new DirectoryEntry(....)) {
   // now we check if the related object exists
   bool exists = DirectoryEntry.Exists(de.Path);
   if(exists) {
     // yes  the objects exists
     // do something

   } // end if
} // end using

Конечно, вы можете опустить переменную существующие.Я использовал это только для того, чтобы сделать утверждение более ясным.

0 голосов
/ 01 октября 2010

Ответ на этот вопрос на как проверить, существует ли имя учетной записи пользователя Windows в домене , может быть полезным для вас.

0 голосов
/ 01 октября 2010

Вы ищете определенного пользователя или всех пользователей?

У меня есть приложение, которое проверяет, присутствует ли пользователь, проверяя имя учетной записи - оно использует SecurityIdentifier в пространстве имен System.Security.Principal дляпроверьте, действителен ли SID.

public bool AccountExists(string name)
        {
            bool SidExists = false;
            try
            {
                NTAccount Acct = new NTAccount(name);
                SecurityIdentifier id = (SecurityIdentifier)Acct.Translate(typeof(SecurityIdentifier));
                SidExists = id.IsAccountSid();
            }
            catch (IdentityNotMappedException)
            {
                //Oh snap.
            }
            return SidExists;
        }

Вы можете указать Домен при создании NTAccount объекта

NTAccount Acct = new NTAccount("SampleDomain", "SampleName");

РЕДАКТИРОВАТЬ

Что касается вашего комментария, будет ли это работать для вас?Не проверял, возможно, придется обработать возможный нулевой возврат, прежде чем эмулировать метод IsAccountSid() ...

public SecurityIdentifier AccountSID(string myDomain, string myAcct)
{
   SecurityIdentifier id;

   try
   {
     NTAccount Acct = new NTAccount(myDomain, myAcct);
     id = (SecurityIdentifier)Acct.Translate(typeof(SecurityIdentifier));
   }
   catch (IdentityNotMappedException)
   {
     //Oh snap.
   }

   return id;
}

SecurityIdentifier AcctSID = AccountSID("ExampleDomain", "ExampleName");

if (AcctSID.IsAccountSid())
   //Do Something
...