1

私はC#に本当に慣れていないので、私の無知を許してください。ユーザー (DOMAIN\username) が特定のグループに属しているかどうかをテストする必要があります。はい、これにはネストされたグループが含まれます。

WindowsPrincipal.IsInRole()現在ログインしているユーザーを扱うときに、それがうまく機能することがわかりました。しかし、それは私には当てはまりません。任意の DOMAIN\username または UPN を渡すことができる必要があり (実装が最も簡単な方を行います)、それらがグループ X のメンバーである場合は、たとえそれらがグループ X の間接的なメンバーであっても、true/false を返す必要があります。グループ X (例: ユーザーはグループ Y のメンバーであり、グループ Y はグループ X のメンバー)。

私は を見てきましたがWindowsIdentity、C# にとっては新しいものかもしれませんが、WindowsIdentity("MYDOMAIN\User1"). ええと、私はそうしましたが、それを機能させることには決して近づきませんでした。

C# を使用して、現在ログインしているユーザーではない DOMAIN\username が与えられた場合、DOMAIN\group のメンバーであるかどうかを判断するにはどうすればよいですか?

4

4 に答える 4

0

C#を使用してFind Recursive Group Membership(Active Directory)と呼ばれるStackOverflowの同様のエントリで再帰クエリを使用して回答しました。私がそこで与えたコードを変更することで、あなたがやりたいことをすることができます。

于 2011-09-13T04:04:34.877 に答える
0

これは私が使用している機能であり、ほとんどそのまま使用できるはずです。おそらく作成する必要がありますParseUserDomainが、それは非常に簡単です。

/// <summary>
/// Checks if a user in is a active directory group.
/// <summary>
/// <param name="username">Can contain the domain and username or just username
///    (eg. domain\username or username).  If no domain is specified, the default
///    domain is used.</param>
/// <param name="group">Active directory group to check.  Group name only.  No
///    leading domain as the domain from the user is used.</param>
/// <returns></returns>
public bool UserIsInActiveDirectoryGroup(string username, string group)
{
    bool isInGroup = false;
    string user = "";
    string domain = "";
    // Parses off domain and user to seperate values
    ParseUserDomain(username, out domain, out user);   

    if (string.IsNullOrEmpty(user) ||
        string.IsNullOrEmpty(domain) ||
        string.IsNullOrEmpty(group))
    {
        return false;
    }

    using (PrincipalContext ADContext = new PrincipalContext(ContextType.Domain,
        domain))
    {
        using (GroupPrincipal principalGroup = 
            GroupPrincipal.FindByIdentity(ADContext, group))
        {
            if (principalGroup != null)
            {
                using (UserPrincipal ADPrincipalUser = 
                    UserPrincipal.FindByIdentity(ADContext, user))
                {
                    // True means deep search
                    var users = principalGroup.GetMembers(true);
                    isInGroup = users.Contains(ADPrincipalUser);
                }
            }
        }
    }
    return isInGroup;
}
于 2011-09-12T20:53:45.510 に答える
0

自分の質問への回答: 提示された解決策を試しましたが、それらを機能させることはできませんでした。これは私の C# の経験不足によるものであり、コメント投稿者が投稿したこととは何の関係もないと 100% 確信していることに注意してください。助けてくれたすべてのコメント投稿者に愛と感謝を。

私にとってうまくいったのはこれです:http://ddkonline.blogspot.com/2010/05/how-to-recurively-get-group-membership.html

上記のソリューションを自分の状況に合うようにするために、いくつかの基本的な調整を行う必要がありましたが (たとえば、LDAP パラメータを変更するなど)、基本的には機能しました。グループのメンバーの場合は true、そうでない場合は false を返します。私はすでに一握りを失っているので、これが将来の検索者の髪を節約することを願っています. ヘルプを投稿してくれたすべての人にもう一度感謝します。

于 2011-09-13T19:34:03.603 に答える
0

そのために LDAP クエリを使用できます。ここに良い記事があります

ハウツー: (ほぼ) C# を介した Active Directory のすべて

于 2011-09-12T20:46:47.633 に答える