0

いくつかの extensionAttributes を追加する GroupPrincipal 拡張機能があります。

[DirectoryObjectClass("group")]
[DirectoryRdnPrefix("CN")]

public class GroupPrincipalsEx : GroupPrincipal
{
    public GroupPrincipalsEx(PrincipalContext context) : base(context) { }

    public GroupPrincipalsEx(PrincipalContext context, string samAccountName)
        : base(context, samAccountName)
    {
    }

    [DirectoryProperty("ExtensionAttribute1")]
    public string ExtensionAttribute1
    {
        get
        {
            if (ExtensionGet("ExtensionAttribute1").Length != 1)
                return null;

            return (string)ExtensionGet("ExtensionAttribute1")[0];

        }
        set { this.ExtensionSet("ExtensionAttribute1", value); }
    }

    [DirectoryProperty("ExtensionAttribute2")]
    public string ExtensionAttribute2
    {
        get
        {
            if (ExtensionGet("ExtensionAttribute2").Length != 1)
                return null;

            return (string)ExtensionGet("ExtensionAttribute2")[0];

        }
        set { this.ExtensionSet("ExtensionAttribute2", value); }
    }

    [DirectoryProperty("ExtensionAttribute3")]
    public string ExtensionAttribute3
    {
        get
        {
            if (ExtensionGet("ExtensionAttribute3").Length != 1)
                return null;

            return (string)ExtensionGet("ExtensionAttribute3")[0];

        }
        set { this.ExtensionSet("ExtensionAttribute3", value); }
    }

    [DirectoryProperty("ExtensionAttribute4")]
    public string ExtensionAttribute14
    {
        get
        {
            if (ExtensionGet("ExtensionAttribute4").Length != 1)
                return null;

            return (string)ExtensionGet("ExtensionAttribute4")[0];

        }
        set { this.ExtensionSet("ExtensionAttribute4", value); }
    }
}

特定のユーザーがメンバーであり、そのグループの extensionAttribute1 が特定の値であるグループのリストを取得する必要があります。カスタム オブジェクトの配列を返す必要があります (グループ SamAccountName、DN、extensionAttributes 1 ~ 4)。

ユーザーがメンバーであるすべてのグループを取得する方法は知っていますが、GroupPrincipal を GroupPrincipalsEx にキャストするのに問題があります。

public List<GroupPrincipalsEx> GetGroups(string userName, Boolean Recurent = false)
    {
        List<GroupPrincipalsEx> result = new List<GroupPrincipalsEx>();

        // establish domain context
        PrincipalContext yourDomain = new PrincipalContext(ContextType.Domain);

        // find your user
        UserPrincipal user = UserPrincipal.FindByIdentity(yourDomain, userName);

        // if found - grab its groups
        if (user != null)
        {
            PrincipalSearchResult<Principal> groups = Recurent ? user.GetAuthorizationGroups() : user.GetGroups();

            // iterate over all groups
            foreach (Principal p in groups)
            {
                // make sure to add only group principals
                if (p is GroupPrincipal)
                {
                    //I need a way to cast p from GroupPrincipal to GroupPrincipalsEx and then add it to array
                    GroupPrincipalsEx gp = (GroupPrincipalsEx)p;
                    if(gp.ExtensionAttribute1 == "Specific Value")
                       result.Add(gp);
                }
            }
        }

        return result;
    }

DirectoryEntry を使用せずにこれを行う方法はありますか?

4

1 に答える 1

0

クラス階層を再考する必要があります。子クラスへのキャストは決してベスト プラクティスではありません。とにかく、私は次のようにコーディングします:

var gp = p as GroupPrincipalsEx;
// make sure to add only group principals
if (gp != null && gp.ExtensionAttribute1 == "Specific Value")
   result.Add(gp)
于 2014-01-17T09:52:40.953 に答える