代码之家  ›  专栏  ›  技术社区  ›  jbassking10

如何在C中获取给定用户/组的安全组权限#

  •  0
  • jbassking10  · 技术社区  · 7 年前

    private static void FindUserById(PrincipalSearcher ps, PrincipalContext pc, string name)
    {
        var up = new UserPrincipal(pc)
        {
            // EmailAddress = wildcard
            // GivenName = wildcard
            Name = name
        };
    
        ps.QueryFilter = up;
    
        foreach (var found in ps.FindAll())
        {
            if (found is UserPrincipal user)
            {
                string line = $"{{\"Name\":\"{user.DisplayName}\", \"Email\": \"{user.EmailAddress}\"}},";
                var groups = user.GetAuthorizationGroups();
    
                Console.WriteLine(line);
            }
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Gabriel Luci    7 年前

    GetAuthorizationGroups() 我会给你一份 GroupPrincipal 物体。然而, 不公开对象的权限。它确实有用 DirectoryEntry

    var groupDe = (DirectoryEntry) group.GetUnderlyingObject();
    

    然后你可以使用 ObjectSecurity 属性查看组对象的权限。

    不过,这并不十分直截了当。 This question 实际上,它有一些相当完整的代码来检索权限(就在这个问题上)。特别是:

    var accessRules = groupDe.ObjectSecurity.GetAccessRules(true, true, typeof(NTAccount));
    
    foreach (ActiveDirectoryAccessRule ar in accessRules)
    {
        Console.WriteLine($"{ar.IdentityReference.ToString()}");
        Console.WriteLine($"Inherits - {ar.InheritanceType.ToString()}");
        Console.WriteLine($"ObjectType - {ar.ObjectType.ToString()}");
        Console.WriteLine($"InheritedObjectType - {ar.InheritedObjectType.ToString()}");
        Console.WriteLine($"ObjectFlags - {ar.ObjectFlags.ToString()}");
        Console.WriteLine($"AccessControlType - {ar.AccessControlType.ToString()}");
        Console.WriteLine($"ActiveDirectoryRights - {ar.ActiveDirectoryRights.ToString()}");
    
    
        Console.WriteLine($"IsInherited - {ar.IsInherited.ToString()}");
        Console.WriteLine($"PropagationFlags - {ar.PropagationFlags.ToString()}");
        Console.WriteLine("-------");
    }