2014-09-13 3 views
0

Мой метод GetActiveDirectory() используется для получения данных из Active Directory с использованием SamAccountName, и он работает, но проблема заключается в том, что проблема user.EmployeeId не возвращает никаких признаков.Не удается получить EmployeeId из Active Directory

Почему я не могу получить EmployeeId и как его исправить?

Это мои коды:

public void GetActiveDirectory(DataTable DataStorage, string SamAccountName) 
{ 
     var domainContext = new PrincipalContext(
      ContextType.Domain, null, _ldapPath, _ldapUsername, _ldapPassword); 

     var group = GroupPrincipal.FindByIdentity(domainContext, "Domain Users"); 

     if (group != null) 
     { 
      DataStorage.Columns.Add("SamAccountName"); 
      DataStorage.Columns.Add("Surname"); 
      DataStorage.Columns.Add("Guid"); 
      DataStorage.Columns.Add("Enabled"); 
      DataStorage.Columns.Add("GivenName"); 
      DataStorage.Columns.Add("EmailAddress"); 
      DataStorage.Columns.Add("SID"); 
      DataStorage.Columns.Add("DateCreated"); 
      DataStorage.Columns.Add("DateModified"); 
      DataStorage.Columns.Add("EmployeeNumber"); 
      DataStorage.AcceptChanges(); 

      foreach (var p in group.GetMembers(false)) 
      { 
       if(p.SamAccountName != null) 
       { 
        try 
        { 
         var user = UserPrincipal.FindByIdentity(
          domainContext, IdentityType.SamAccountName, SamAccountName); 
         if (user != null) 
         { 
          var userDE = (DirectoryEntry)p.GetUnderlyingObject(); 
          DateTime dateCreated = userDE.Properties["WhenCreated"].Value != null 
           ? (DateTime)userDE.Properties["WhenCreated"].Value 
           : DateTime.MinValue; 
          DateTime dateModified = userDE.Properties["WhenChanged"].Value != null 
           ? (DateTime)userDE.Properties["WhenChanged"].Value 
           : DateTime.MinValue; 
          DataRow dr = DataStorage.NewRow(); 
          dr["SamAccountName"] = user.SamAccountName; 
          dr["Surname"] = user.Surname; 
          dr["Guid"] = user.Guid.ToString(); 
          dr["Enabled"] = user.Enabled; 
          dr["GivenName"] = user.GivenName; 
          dr["EmailAddress"] = user.EmailAddress; 
          dr["SID"] = user.Sid.Value; 
          dr["EmployeeNumber"] = user.EmployeeId; //Always give an empty space or null. 
          dr["DateCreated"] = dateCreated; 
          dr["DateModified"] = dateModified; 
          DataStorage.Rows.Add(dr); 
          return; 
         } 
        } 
        catch { } 

        break; 
       } 
      } 
     } 
    } 
+0

В 'group.GetMembers()' уже возвращает пользователей - Почему вы называете '.FindByIdentity()' на каждого найденного пользователя еще раз, чтобы получить объект пользователя ?? Не имеет для меня никакого смысла .... –

+0

@marc_s Первый '.FIndByIdentity()' предназначен для групп пользователей, группа «Пользователи домена», а вторая используется для того, чтобы получить одного пользователя в «Пользователи домена», группа. –

+0

Да, я вижу, но второй - ** бессмысленно ** - 'group.GetMembers()' ** уже ** возвращает члены 'UserPrincipal' ... вы должны просто использовать их - а не искать выборку пользователь * снова * .... –

ответ

1

ЭТО ВРЕМЕННОЕ ОТВЕТ НАUserPrincipal.EmployeeId

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

То, что я пытался решить мою собственную проблему в .EmployeeId, чтобы вернуться с помощью System.DirectoryServices

Вот мой метод, чтобы получить EmployeeId с помощью System.DirectoryServices

 var oDirecotyrEntry = new DirectoryEntry(
      _ldapPath, _ldapUsername, _ldapPassword, AuthenticationTypes.Secure); 
     SearchResultCollection odrSearchResultCollection; 
     var odrUser = new DirectoryEntry(); 
     var odrDirectorySearcher = new DirectorySearcher 
     {Filter = "sAMAccountName="+SamAccountName+"", SearchRoot = oDirecotyrEntry}; 
     using(odrDirectorySearcher) 
     { 
      odrSearchResultCollection = odrDirectorySearcher.FindAll(); 
      if(odrSearchResultCollection.Count > 0) 
      { 
       foreach(SearchResult result in odrSearchResultCollection) 
       { 
        var num = result.Properties["employeeNumber"]; 
        foreach(var no in num) 
        { 
         dr["EmployeeNumber"] = no.ToString(); 
        } 
       } 
      } 
     } 

и завершить свой проект я использую System.DirectoryServices.AccountManagement

var oPricipalContext = new PrincipalContext(
      ContextType.Domain, _ldapPath2, _ldapUsername, _ldapPassword); 
     UserPrincipal oUserPrincipal = UserPrincipal.FindByIdentity(oPricipalContext, SamAccountName); 
     if (oUserPrincipal != null) 
     { 
      var oDateTime = (DirectoryEntry)oUserPrincipal.GetUnderlyingObject(); 
      DateTime dateCreated = oDateTime.Properties["WhenCreated"].Value != null 
       ? (DateTime)oDateTime.Properties["WhenCreated"].Value 
       : DateTime.MinValue; 
      DateTime dateChanged = oDateTime.Properties["WhenChanged"].Value != null 
       ? (DateTime)oDateTime.Properties["WhenChanged"].Value 
       : DateTime.MinValue; 
      dr["SamAccountName"] = oUserPrincipal.SamAccountName; 
      dr["Surname"] = oUserPrincipal.Surname; 
      dr["Guid"] = oUserPrincipal.Guid.ToString(); 
      dr["Enabled"] = oUserPrincipal.Enabled; 
      dr["GivenName"] = oUserPrincipal.GivenName; 
      dr["EmailAddress"] = oUserPrincipal.EmailAddress; 
      dr["SID"] = oUserPrincipal.Sid.Value; 
      dr["DateCreated"] = dateCreated; 
      dr["DateModified"] = dateChanged; 
      DataStorage.Rows.Add(dr); 
     } 

System.DirectoryServices.AccountManagement требуется для моего проекта поэтому я должен использовать его.

ИЗМЕНИТЬ ДЛЯ МОЕЙ ГРАММЫ.

Вот мой полный код.

Нет фрагментарного формата ???

using System.DirectoryServices; 
using System.DirectoryServices.AccountManagement; 

public void GetUsers(DataTable DataStorage, string SamAccountName) 
    { 
     DataStorage.Columns.Add("SamAccountName"); 
     DataStorage.Columns.Add("Surname"); 
     DataStorage.Columns.Add("Guid"); 
     DataStorage.Columns.Add("Enabled"); 
     DataStorage.Columns.Add("GivenName"); 
     DataStorage.Columns.Add("EmailAddress"); 
     DataStorage.Columns.Add("SID"); 
     DataStorage.Columns.Add("DateCreated"); 
     DataStorage.Columns.Add("DateModified"); 
     DataStorage.Columns.Add("EmployeeNumber"); 
     DataStorage.AcceptChanges(); 
     DataRow dr = DataStorage.NewRow(); 
     //System.DirectoryServices 
     var oDirecotyrEntry = new DirectoryEntry(
      _ldapPath, _ldapUsername, _ldapPassword, AuthenticationTypes.Secure); 
     SearchResultCollection odrSearchResultCollection; 
     var odrUser = new DirectoryEntry(); 
     var odrDirectorySearcher = new DirectorySearcher 
     {Filter = "sAMAccountName="+SamAccountName+"", SearchRoot = oDirecotyrEntry}; 
     using(odrDirectorySearcher) 
     { 
      odrSearchResultCollection = odrDirectorySearcher.FindAll(); 
      if(odrSearchResultCollection.Count > 0) 
      { 
       foreach(SearchResult result in odrSearchResultCollection) 
       { 
        var num = result.Properties["employeeNumber"]; 
        foreach(var no in num) 
        { 
         dr["EmployeeNumber"] = no.ToString(); 
        } 
       } 
      } 
     } 

     //System.DirectoryServices.AccountManagement 
     var oPricipalContext = new PrincipalContext(
      ContextType.Domain, _ldapPath2, _ldapUsername, _ldapPassword); 
     UserPrincipal oUserPrincipal = UserPrincipal.FindByIdentity(oPricipalContext, SamAccountName); 
     if (oUserPrincipal != null) 
     { 
      var oDateTime = (DirectoryEntry)oUserPrincipal.GetUnderlyingObject(); 
      DateTime dateCreated = oDateTime.Properties["WhenCreated"].Value != null 
       ? (DateTime)oDateTime.Properties["WhenCreated"].Value 
       : DateTime.MinValue; 
      DateTime dateChanged = oDateTime.Properties["WhenChanged"].Value != null 
       ? (DateTime)oDateTime.Properties["WhenChanged"].Value 
       : DateTime.MinValue; 
      dr["SamAccountName"] = oUserPrincipal.SamAccountName; 
      dr["Surname"] = oUserPrincipal.Surname; 
      dr["Guid"] = oUserPrincipal.Guid.ToString(); 
      dr["Enabled"] = oUserPrincipal.Enabled; 
      dr["GivenName"] = oUserPrincipal.GivenName; 
      dr["EmailAddress"] = oUserPrincipal.EmailAddress; 
      dr["SID"] = oUserPrincipal.Sid.Value; 
      dr["DateCreated"] = dateCreated; 
      dr["DateModified"] = dateChanged; 
      DataStorage.Rows.Add(dr); 
     } 
    } 
Смежные вопросы