2014-09-13 70 views
0

我的GetActiveDirectory()方法用于使用SamAccountName从Active Directory获取数据,并且它正在工作,但问题是user.EmployeeId没有返回任何数据符号。无法从Active Directory检索EmployeeId

为什么我不能收到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()'每个用户发现再次检索用户对象?对我来说没有任何意义...... – 2014-09-13 07:46:51

+0

@marc_s第一个.FIndByIdentity()用于“Domain Users”组用户组,第二个用于在“Domain Users”中获取一个用户,组。 – 2014-09-15 23:23:07

+0

是的,我看到了 - 但第二个是**毫无意义** - group.GetMembers()**已经**返回UserPrincipal成员....您应该只使用这些 - 而不要去获取用户*再次* .... – 2014-09-16 04:40:24

回答

1

这是一个临时的答案UserPrincipal.EmployeeId

我不知道为什么UserPrincipal.EmployeeId没有工作,所以我决定使用旧的方式方法。

我一直试图解决.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

这里是我的方法来获得EmployeeId并完成项目中,我使用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需要我的项目所以我需要使用它。

SORRY FOR MY GRAMMAR。

这是我的完整代码。

No snippet format ???

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); 
     } 
    }