2014-11-20 73 views
1

Principal类只有几个广告属性表示:如何使用广告属性不是在主体类

enter image description here

的问题是我需要阅读的属性,是不是在Principal类。 ..

这是我如何查询AD对象:

// create your domain context 
PrincipalContext ctx = new PrincipalContext(ContextType.Domain,ConfigurationManager.AppSettings["ADDomain"].ToString(), ConfigurationManager.AppSettings["ADUser"].ToString(), ConfigurationManager.AppSettings["ADPassword"].ToString()); 

// define a "query-by-example" principal - here, we search for all users 
UserPrincipalEXT qbeUser = new UserPrincipalEXT(ctx); 

// create your principal searcher passing in the QBE principal  
PrincipalSearcher srch = new PrincipalSearcher(qbeUser); 

// find all matches 
foreach (var found in srch.FindAll()) //FOUND represent the AD object 
{ 
    ... 
} 

有没有办法延长Principal类获取更多AD属性?

回答

2

您可以使用GetUnderlyingObject()来访问附加属性:

if (found.GetUnderlyingObjectType() == typeof(DirectoryEntry)) 
{ 
    DirectoryEntry de = (DirectoryEntry)principal.GetUnderlyingObject(); 
    // Use de.Properties to access additional information 
} 
3

如果你在.NET 3.5和和使用System.DirectoryServices.AccountManagement(S.DS.AM)命名空间,你可以很容易地扩展现有UserPrincipal类来获得更高级的属性,如Manager

阅读所有关于它在这里:

基本上,你只是定义基于UserPrincipal派生类,然后定义您的附加属性你想要的:

[DirectoryRdnPrefix("CN")] 
[DirectoryObjectClass("Person")] 
public class UserPrincipalEx : UserPrincipal 
{ 
    // Inplement the constructor using the base class constructor. 
    public UserPrincipalEx(PrincipalContext context) : base(context) 
    { } 

    // Implement the constructor with initialization parameters.  
    public UserPrincipalEx(PrincipalContext context, 
         string samAccountName, 
         string password, 
         bool enabled) : base(context, samAccountName, password, enabled) 
    {} 

    // Create the "Department" property.  
    [DirectoryProperty("department")] 
    public string Department 
    { 
     get 
     { 
      if (ExtensionGet("department").Length != 1) 
       return string.Empty; 

      return (string)ExtensionGet("department")[0]; 
     } 
     set { ExtensionSet("department", value); } 
    } 

    // Create the "Manager" property.  
    [DirectoryProperty("manager")] 
    public string Manager 
    { 
     get 
     { 
      if (ExtensionGet("manager").Length != 1) 
       return string.Empty; 

      return (string)ExtensionGet("manager")[0]; 
     } 
     set { ExtensionSet("manager", value); } 
    } 
} 

现在,你可以使用的“扩展”版本在您的代码UserPrincipalEx

using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain)) 
{ 
    // Search the directory for the new object. 
    UserPrincipalEx inetPerson = UserPrincipalEx.FindByIdentity(ctx, IdentityType.SamAccountName, "someuser"); 

    // you can easily access the Manager or Department now 
    string department = inetPerson.Department; 
    string manager = inetPerson.Manager; 
}   
+0

真的很好的答案。谢谢!! – Shiva 2014-11-20 21:08:06

相关问题