Как определить DN пользователя после аутентификации в Active Directory?

Я использую DirectoryServices для аутентификации пользователя в ADLDS (облегченный Active Directory). После того, как я пройду аутентификацию. Как я могу определить DN или SID текущего пользователя, вошедшего в систему?

using (DirectoryEntry entry = new DirectoryEntry(<a>LDAP://XYZ:389</a>,
userName.ToString(),
password.ToString(),
AuthenticationTypes.Secure))
{
try
{
// Bind to the native object to force authentication to happen
Object native = entry.NativeObject;
MessageBox.Show("User authenticated!");
}
catch (Exception ex)
{
throw new Exception("User not authenticated: " + ex.Message);
}
...

Спасибо

Обновлять:

Я получаю исключение в

src = search.FindAll() 
There is no such object on the server.

Я понял, что пользователь, входящий в систему, имеет тип класса foreignSecurityPrincipal в облегченной версии Active Directory, поэтому я подумал, что, возможно, я могу просто изменить ваш фильтр, чтобы он был:

search.Filter = "(&(objectclass=foreignSecurityPrincipal)" + "(sAMAccountName=" + userName + "))";

Но это дало мне такое же исключение. Есть идеи, что мне не хватает?


person sOltan    schedule 08.04.2010    source источник


Ответы (2)


Насколько мне известно, вам придется выполнить поиск LDAP для пользователя и получить свойство distinguishedName из AD. Увидеть ниже:

// you can use any root DN here that you want provided your credentials
// have search rights
DirectoryEntry searchEntry = new DirectoryEntry("LDAP://XYZ:389");

DirectorySearcher search = new DirectorySearcher(searchEntry);
search.Filter = "(&(objectclass=user)(objectCategory=person)" +
  "(sAMAccountName=" + userName + "))";    

if (search != null)
{
  search.PropertiesToLoad.Add("sAMAccountName");
  search.PropertiesToLoad.Add("cn");
  search.PropertiesToLoad.Add("distinguishedName");

  log.Info("Searching for attributes");

  // find firest result
  SearchResult searchResult = null;
  using (SearchResultCollection src = search .FindAll())
  {
 if (src.Count > 0)
   searchResult = src[0];
  }

  if (searchResult != null)
  {
    // Get DN here
    string DN = searchResult.Properties["distinguishedName"][0].ToString();
  }
person Mike Marshall    schedule 08.04.2010
comment
mjmarsh Спасибо, но я получаю исключение в src = search.FindAll() На сервере нет такого объекта. ------ Я понял, что пользователь, входящий в систему, имеет тип класса foreignSecurityPrincipal в облегченной версии Active Directory, поэтому я подумал, что, возможно, я могу просто изменить ваш фильтр следующим образом: search.Filter = (&(objectclass=foreignSecurityPrincipal) + (sAMAccountName= + имя_пользователя + )); Но это дало мне такое же исключение. Есть идеи, что мне не хватает? Я чувствую, что ваш код приближает меня к тому, что мне нужно. - person sOltan; 09.04.2010

Когда я добавляю нового пользователя вручную в активный каталог, «отличительное имя» не может быть определено вручную, но по соглашению кажется, что это имя + ' ' + фамилия. В таком случае, почему бы не попытаться получить «уникальное имя» по этому шаблону. Я также обнаружил, что если я просто укажу имя для создания пользователя, не являющегося человеком, «отличительное имя» будет равно первому имени без пробела после него.

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

person Samuel    schedule 05.01.2013