【问题标题】:How to get SID of a group once i get groups of a user in Active Directory?在 Active Directory 中获取用户组后如何获取组的 SID?
【发布时间】:2012-07-03 10:14:25
【问题描述】:

我正在使用 DirectorySearcher 来获取 ActiveDirectory 中的用户组。

我的问题是,一旦我使用“memberOf”获取用户组,如何获取与每个组关联的 SID?

我在 .NETFramework 2.0 环境中工作。

DirectoryEntry entry = new DirectoryEntry(string.Format("LDAP://{0}", sUserDomain));
DirectorySearcher mySearcher = new DirectorySearcher(entry);
mySearcher.Filter = string.Format("(&(objectClass=user) (cn= {0}))", ui.DisplayName.ToString());
mySearcher.PropertiesToLoad.Add("memberOf");
SearchResult searchresult = mySearcher.FindOne();

【问题讨论】:

    标签: c# windows active-directory active-directory-group


    【解决方案1】:

    由于memberOf 返回一个可分辨的名称,因此无法在一次 LDAP 搜索中执行此操作。您必须进行另一个绑定才能从组对象中获取 objectSid 属性。这是代码。

    DirectoryEntry entry = new DirectoryEntry(string.Format("LDAP://{0}", sUserDomain));
    DirectorySearcher mySearcher = new DirectorySearcher(entry);
    mySearcher.Filter = string.Format("(&(objectClass=user) (cn= {0}))", ui.DisplayName.ToString());
    mySearcher.PropertiesToLoad.Add("memberOf");
    SearchResult searchresult = mySearcher.FindOne();
    
    foreach (string dn in searchresult.Properties["memberOf"])
    {
        DirectoryEntry group = new DirectoryEntry(string.Format("LDAP://{0}/{1}", sUserDomain, dn));
        SecurityIdentifier sid = new SecurityIdentifier(group.Properties["objectSid"][0] as byte[], 0);
        Console.Out.WriteLine(sid.Value);
    }
    

    【讨论】:

    • 谢谢。上面的代码可以检索一个组,但是如果一个成员在多个组中,请指导我如何循环和获取组列表
    • @phanishm 更新了我的答案以获取组列表。我还修复了绑定以使用指定的域名
    【解决方案2】:

    如果您使用的是 .NET 3.5 及更高版本,则应查看 System.DirectoryServices.AccountManagement (S.DS.AM) 命名空间。在此处阅读所有相关信息:

    基本上,您可以定义域上下文并在 AD 中轻松找到用户和/或组:

        // define context for current domain
        using(PrincipalContext ctx = new PrincipalContext(ContextType.Domain))
        {
            // find  user 
            UserPrincipal user = UserPrincipal.FindByIdentity(ctx, "YourNameHere");
    
            if (user != null)
            {
                // get groups the user is a member of
                var groups = current.GetGroups();
    
                // iterate over all those groups
                foreach(var group in groups)
                {
                    // fetch the SID for each group
                    var sid = group.Sid;
                }
            }
        }   
    

    新的 S.DS.AM 让在 AD 中与用户和组一起玩变得非常容易!

    【讨论】:

    • 很遗憾,我们的产品是在.NetFramework 2.0中开发的,有没有办法将它集成到.Net Framework 2.0中
    【解决方案3】:

    看看他的文章: Retrieving user SID using DirectoryEntry and DirectorySearcher

    这为您提供了检索 SID 的完整工作示例。

    【讨论】:

    • 谢谢,但我需要用户所属组的 sid。
    • 它应该以完全相同的方式工作。只需为 DirectorySearcher 指定一个过滤器,即可找到您感兴趣的组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    • 2011-10-13
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多