2008-11-27 4 views
5

Weiß jemand, wie man WindowsPrincipal.IsInRole("domain\role") arbeiten mit Active Directory Universal Groups?WindowsPrincipal.IsInRole und universelle vs globale Active Directory-Gruppen

Nehmen wir an, der aktuelle Benutzer ist ein Mitglied einer Gruppe namens Role in einer Domäne mit dem Namen Domäne, und die Rolle Gruppe ist eine globale Gruppe im Active Directory. Der folgende Code ergäbe dann Ergebnis = true:

WindowsPrincipal wp = new WindowsPrincipal(WindowsIdentity.GetCurrent()); 
bool result = wp.IsInRole(@"domain\Role"); 

Aber wenn die Rollengruppe in eine universelle Gruppe der Code Ausbeuten Ergebnis = false geändert.

Antwort

10

Ich fand keine gute Antwort auf meine Frage, was ich tun musste, war eine neue Principal-Klasse zu schreiben, die das Verzeichnis nach allen Gruppen durchsucht, zu denen der Benutzer gehört, und rekursiv all diese Gruppen scannt, um Gruppen zu lösen. Gruppenmitgliedschaften. Code für Benutzer mit demselben Problem. Es ist nicht der prickiest Code, den ich geschrieben habe, aber zumindest funktioniert es.

Verwendung wie folgt aus:

var wp = new WindowsPrincipalEx(WindowsIdentity.GetCurrent()); 
result = wp.IsInRole(@"domain\role"); 



public class WindowsPrincipalEx : IPrincipal 
{ 
    // Dictionary to store all groups, key = uppercase groupname, value = groupname as entered in AD 
    private Dictionary<string,string> completeGroupList = new Dictionary<string,string>(); 
    // Private vars 
    private WindowsIdentity identity; 
    private string domain; 

    // Identity property 
    public IIdentity Identity 
    { 
     get { return identity; } 
    } 

    // Constructor, accepts identity 
    public WindowsPrincipalEx(IIdentity identity) 
    { 
     this.identity = (WindowsIdentity)identity; 
     // Find domain name and store it for filtering purposes 
     if (identity.Name.Contains('\\')) 
      this.domain = identity.Name.Substring(0, identity.Name.IndexOf('\\') + 1); 

     // Find all groups this user belongs to, and store the list for later use 
     getRoles(completeGroupList); 
    } 

    public bool IsInRole(string role) 
    { 
     // Remove domain 
     if (role.StartsWith(domain, StringComparison.CurrentCultureIgnoreCase)) 
      role = role.Substring(domain.Length); 
     return completeGroupList.ContainsKey(role.ToUpper()); 
    } 

    private void getRoles(Dictionary<string,string> groupList) 
    { 
     // Find username and remove domain 
     string name = Identity.Name.Replace(domain,""); 

     // Find user in AD 
     DirectorySearcher search = new DirectorySearcher("(&(sAMAccountName="+name+")(objectCategory=user))"); 
     search.PropertiesToLoad.Add("memberof"); 

     SearchResult result = search.FindOne(); 
     if (result != null) 
     { 
      // Add all groups to the groupList dictionary 
      foreach (string s in result.Properties["memberOf"]) 
      { 
       string[] elements = s.Split(new char[] { ',' }); 
       foreach (string e in elements) 
        if (e.StartsWith("CN=", StringComparison.CurrentCultureIgnoreCase)) 
        { 
         if (!groupList.ContainsKey(e.Substring(3).ToUpper())) 
          groupList.Add(e.Substring(3).ToUpper(),e.Substring(3)); 
         break; 
        } 
      } 
     } 

     // Scan through all groups found, and find group on group memberships recursevly 
     foreach (var ng in groupList.ToArray()) 
      getRolesInRoles(groupList, ng.Key); 
    } 

    private void getRolesInRoles(Dictionary<string, string> groupList, string roleName) 
    { 
     string name = roleName.Replace(domain, ""); 

     // Find group in AD 
     DirectorySearcher search = new DirectorySearcher("(&(cn="+name+")(objectCategory=group))"); 
     search.PropertiesToLoad.Add("memberof"); 

     SearchResult result = search.FindOne(); 
     if (result != null) 
     { 
      // Add all groups to the groupList dictionary 
      foreach (string s in result.Properties["memberOf"]) 
      { 
       string[] elements = s.Split(new char[] { ',' }); 
       foreach (string e in elements) 
        if (e.StartsWith("CN=", StringComparison.CurrentCultureIgnoreCase)) 
        { 
         if (!groupList.ContainsKey(e.Substring(3).ToUpper())) 
         { 
          groupList.Add(e.Substring(3).ToUpper(),e.Substring(3)); 
          getRolesInRoles(groupList, e.Substring(3)); 
         } 
         break; 
        } 
      } 
     } 
    } 
}