2009-07-24 5 views
4

Ich arbeite an einer Anwendung, die Benutzerkonten in Active Directory verwaltet. Ich verwende den System.DirectoryServices.AccountManagement-Namespace wo immer möglich, aber ich kann nicht herausfinden, wie man die primäre Gruppe eines Benutzers bestimmt. Wenn ich versuche, eine Gruppe zu entfernen, die die primäre Gruppe des Benutzers ist, erhalte ich eine Ausnahme. Hier ist mein aktueller Code:Können Sie die primäre Gruppe eines Active Directory-Benutzers in C# finden?

private void removeFromGroup(UserPrincipal userPrincipal, GroupPrincipal groupPrincipal) { 
    TODO: Check to see if this Group is the user's primary group. 
    groupPrincipal.Members.Remove(userPrincipal); 
    groupPrincipal.Save(); 
} 

Gibt es eine Möglichkeit, den Namen des Benutzers primärer Gruppe zu bekommen, so kann ich einige Prüfungen durchführen, bevor Sie den Benutzer aus dieser Gruppe entfernen?

Antwort

0

Die RID der primären Gruppe des Benutzers wird im Attribut 'primaryGroupID' des Benutzerobjekts gespeichert. Sie müssen den DirectoryEntry für den angegebenen Benutzer (oder andere Benutzer-APIs) abrufen, um diesen Wert abzurufen. Nachdem Sie diesen Wert erhalten haben, müssen Sie ihn in eine SID für die primäre Gruppe übersetzen und dann die Gruppe daraus abrufen.

Es gibt einen KB-Artikel, die weiteren Einzelheiten über diese sowie VB-Code mit, wie die primäre Gruppe zu finden ist, hier: http://support.microsoft.com/kb/297951

5

Es ist ein ziemlich chaotisch und die beteiligten Unternehmen - aber dieser Code-Schnipsel aus mein BeaverTail ADSI Browser, die ich (in den .NET 1.1 Tage) vollständig in C# geschrieben und arbeiten bekannt - nicht schön, aber funktionell:

private string GetPrimaryGroup(DirectoryEntry aEntry, DirectoryEntry aDomainEntry) 
{ 
    int primaryGroupID = (int)aEntry.Properties["primaryGroupID"].Value; 
    byte[] objectSid = (byte[])aEntry.Properties["objectSid"].Value; 

    StringBuilder escapedGroupSid = new StringBuilder(); 

    // Copy over everything but the last four bytes(sub-authority) 
    // Doing so gives us the RID of the domain 
    for(uint i = 0; i < objectSid.Length - 4; i++) 
    { 
     escapedGroupSid.AppendFormat("\\{0:x2}", objectSid[i]); 
    } 

    //Add the primaryGroupID to the escape string to build the SID of the primaryGroup 
    for(uint i = 0; i < 4; i++) 
    { 
     escapedGroupSid.AppendFormat("\\{0:x2}", (primaryGroupID & 0xFF)); 
     primaryGroupID >>= 8; 
    } 

    //Search the directory for a group with this SID 
    DirectorySearcher searcher = new DirectorySearcher(); 
    if(aDomainEntry != null) 
    { 
     searcher.SearchRoot = aDomainEntry; 
    } 

    searcher.Filter = "(&(objectCategory=Group)(objectSID=" + escapedGroupSid.ToString() + "))"; 
    searcher.PropertiesToLoad.Add("distinguishedName"); 

    return searcher.FindOne().Properties["distinguishedName"][0].ToString(); 
} 

Hoffnung, das hilft.

Marc

+1

wow. hässlich, aber es funktioniert :) +1 – Simon

+1

ja .. es funktioniert .. –

-2
 using (PrincipalContext context = XXX) 
     { //get the group 
       using (GroupPrincipal groupPrincipal = 
         GroupPrincipal.FindByIdentity(context,IdentityType.SamAccountName, group)) 
       { 
        if (groupPrincipal != null) 
        { 
         //get the user 
         using (UserPrincipal userPrincipal = 
        UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, userName)) 
         { 
          if (userPrincipal != null) 
          { 
           returnValue = userPrincipal.IsMemberOf(groupPrincipal); 
          } 
         } 
        } 
       } 

     } 
Verwandte Themen