【问题标题】:Extend UserPrincipal class扩展 UserPrincipal 类
【发布时间】:2014-09-07 23:59:57
【问题描述】:

我对 UserPrincipal 类进行了扩展,以检索我需要的一些缺失属性:

[DirectoryObjectClass("user")]
[DirectoryRdnPrefix("CN")]
class UserPrincipalExt : UserPrincipal
{
    public UserPrincipalExt(PrincipalContext context)
        : base(context)
    {
    }

    [DirectoryProperty("department")]
    public string Department
    {
        get
        {
            if (ExtensionGet("department").Length != 1)
                return null;
            return (string)ExtensionGet("department")[0];
        }
        set 
        { 
            this.ExtensionSet("department", value); 
        }
    }

    [DirectoryProperty("company")]
    public string Company
    {
        get
        {
            if (ExtensionGet("company").Length != 1)
                return null;
            return (string)ExtensionGet("company")[0];
        }
        set
        {
            this.ExtensionSet("company", value);
        }
    }

    [DirectoryProperty("c")]
    public string CountryAbbreviation
    {
        get
        {
            if (ExtensionGet("c").Length != 1)
                return null;
            return (string)ExtensionGet("c")[0];
        }
        set
        {
            this.ExtensionSet("c", value);
        }
    }
}

然后,我可以像这样轻松搜索:

 PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, myDomain);
 UserPrincipalExt userExt = new UserPrincipalExt(principalContext);
 PrincipalSearcher searcher = new PrincipalSearcher(userExt);

 userExt.GivenName = "blabla";
 userExt.EmailAddress ="text here";

 PrincipalSearchResult<Principal> searchTmp = null;

 searcher.QueryFilter = userExt;
 searchTmp = searcher.FindAll();

所以,我的新任务,也是我当前的问题是:对于 ActiveDirectory 中搜索到的组,必须使用扩展类获取用户列表。

GroupPrincipal group = (GroupPrincipal)collection.FirstOrDefault();

foreach (Principal pRes in group.GetMembers())
{
   //This doesnt work of course.
   // return null value.
   UserPrincipalExt user = pRes as UserPrincipalExt;
}

我怎样才能实现目标?

作为解决方法,我已经创建了一个函数来检索属性:

private string GetExtendedProperty(Principal principal, string propertyTo)
    {
        string property = "";

        try
        {
            DirectoryEntry directoryEntry = principal.GetUnderlyingObject() as DirectoryEntry;

            if (directoryEntry.Properties.Contains(propertyTo))
            {
                property = directoryEntry.Properties[propertyTo].Value.ToString();
            }
            else
            {
                property = "";
            }
        }
        catch (Exception ex)
        {
            Logger.ScriviLog(4, this.GetType().Name, MethodBase.GetCurrentMethod().Name, ex.Message);
        }

        return property;
    }

提前谢谢你。

【问题讨论】:

    标签: c# active-directory userprincipal groupprincipal principalsearcher


    【解决方案1】:

    dblock247有正确答案

        public new static UserPrincipalExt FindByIdentity(PrincipalContext context, string identityValue)
        {
            return (UserPrincipalExt)FindByIdentityWithType(context, typeof(UserPrincipalExt), identityValue);
        }
    
        public new static UserPrincipalExt FindByIdentity(PrincipalContext context, IdentityType identityType, string identityValue)
        {
            return (UserPrincipalExt)FindByIdentityWithType(context, typeof(UserPrincipalExt), identityType, identityValue);
        }
    

    这样就可以拿到本金了

      UserPrincipalExt oUserPrincipal = UserPrincipalExt.FindByIdentity(oPrincipalContext, IdentityType.UserPrincipalName, userName);
    

    还有这样的属性:

    Console.WriteLine(oUserPrincipal.Company);
    

    【讨论】:

      【解决方案2】:

      覆盖扩展类中的 FindByIdentity 方法。

      public new static User FindByIdentity(PrincipalContext context, string identityValue)
      {
          return (User)FindByIdentityWithType(context, typeof(User), identityValue);
      }
      
      public new static User FindByIdentity(PrincipalContext context, IdentityType identityType, string identityValue)
      {
          return (User)FindByIdentityWithType(context, typeof(User), identityType, identityValue);
      }
      

      然后使用扩展类 FindByIdentity 方法搜索

      var user = User.FindByIdentity(
          DomainContext,
          "name"
      );
      

      看到这个Link

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-04
        • 2010-10-12
        相关资源
        最近更新 更多