1

以下のコードを使用して、Active Directory からユーザーのセキュリティ グループのリストを取得しましたが、Active Directory からユーザーのすべてのグループを取得しています。Active Directory からユーザーのセキュリティ グループのリストのみを取得する方法を教えてください。 ?

public List<string> getSecurityGroup(string userName,SearchInfo searchInfo, Error errorInfo)
        {
            List<string> groups =new List<string>() ;
            try
            {
                string ldapPath = @"LDAP://" + searchInfo.HostName + @"/" + searchInfo.SearchDN;
                DirectoryEntry obEntry = new DirectoryEntry(ldapPath);

                DirectorySearcher srch = new DirectorySearcher(obEntry,
                    "(sAMAccountName=" + userName + ")");
                SearchResult res = srch.FindOne();
                if (null != res)
                {
                    DirectoryEntry obUser = new DirectoryEntry(res.Path);
                    // Invoke Groups method.
                    object obGroups = obUser.Invoke("Groups");
                    foreach (object ob in (IEnumerable)obGroups)
                    {
                        // Create object for each group.
                        DirectoryEntry obGpEntry = new DirectoryEntry(ob);
                        groups.Add(obGpEntry.Name);
                    }
                 }
            }
            catch (System.Runtime.InteropServices.ExternalException comException)
            {
                errorInfo.ErrorCode = comException.ErrorCode;
                errorInfo.ErrorMessage = comException.Message;
            }
            catch (Exception exception)
            {
                errorInfo.ErrorCode = -1;
                errorInfo.ErrorMessage = exception.Message;
            }
            return groups;

        }
4

2 に答える 2

1

1 つの方法は、groupType 属性を確認することです。たとえば、次を使用してセキュリティ グループを検索できます。

(&(objectCategory=group)(groupType:1.2.840.113556.1.4.803:=2147483648))

ところで、特定のユーザーが (直接的または間接的に) メンバーであるすべてのグループを取得する別の方法は、検索フィルターを使用することです。

(member:1.2.840.113556.1.4.1941:=<user-distinguished-name>)

これを groupType フィルターと組み合わせることができます。詳細については、検索フィルターの構文に関するこの MSDN の記事を参照してください。

アップデート

コードのどの部分を変更する必要があるか教えていただけますか?

上記は、パラメーターとしてDirectorySearcherメソッドに渡すためのフィルターです。たとえば、以下は直接的または間接的にメンバーでsAMAccountNameある各セキュリティ グループのリストを作成する必要があります。userrName

List<string> groups = new List<string>();
using (var root = new DirectoryEntry(ldapPath))
{
    using(var srch = new DirectorySearcher(root, 
                   "(sAMAccountName=" + userName + ")"))
    {
        SearchResult res = srch.FindOne();
        if (res != null)
        {
            string dn = (string) res.Properties["distinguishedName"][0];
            string filter = String.Format(CultureInfo.InvariantCulture,
                "(&(objectCategory=group)(groupType:1.2.840.113556.1.4.803:=2147483648)(member:1.2.840.113556.1.4.1941:={0}))",
                dn);
            using (var groupSearch = new DirectorySearcher(root, filter, new[] { "sAMAccountName" }))
            {
                groupSearch.PageSize = 1000;
                using (var resultCollection = groupSearch.FindAll())
                {
                    foreach (SearchResult result in resultCollection)
                    {
                        groups.Add((string) result.Properties["sAMAccountName"][0]);
                    }
                }
            }
        }
    }
}
于 2012-09-21T12:22:33.627 に答える
0

まず、Java ではなく C# によく似ています。タグ Java で投稿している理由は何ですか?

次に、AD では、セキュリティ グループは OU「セキュリティ グループ」に属している必要があります。したがって、各グループの識別名を調べます。" " が含まれている場合はOU=Security Groups、セキュリティ グループである必要があります。

sAMAccountTypeまたは、グループ レコードを取得して属性を調べることもできます。セキュリティ グループの値は 0x10000000 (10 進数で 268435456) である必要があります。

編集:C#に完全に流暢ではないため、正確な正確さを保証することはできませんが、次のようなことを試してみてください:

foreach (object ob in (IEnumerable)obGroups)
{
    // Create object for each group.
    DirectoryEntry obGpEntry = new DirectoryEntry(ob);
    if (obGpEntry.Path.ToLower().contains("ou=security groups")) {
        groups.Add(obGpEntry.Name);
    }
}
于 2012-09-21T08:40:19.990 に答える