2008-09-05 4 views
3

Ich fragte mich, ob jemand weiß, wie man die Mitgliedschaft von lokalen Gruppen auf einem Remote-Server programmgesteuert über C# erhalten. Benötigt dies Administratorrechte? Und wenn ja, gibt es eine Möglichkeit, die Mitgliedschaft des angemeldeten Benutzers (oder nicht) dieser Gruppen zu bestätigen?Ermitteln von Mitgliedern der lokalen Gruppen über C#

+0

möglich Duplikat [Auflisten von Windows-Benutzergruppenmitgliedern auf dem Remote-System unter Verwendung von C#] (http://stackoverflow.com/questions/21514/enumerate-windows-user-group-members-on-remote-system- using-c-sharp) –

Antwort

0

Vielleicht kann dies über WMI geschehen?

4

Howto: (Almost) Everything In Active Directory via C# ist sehr hilfreich und enthält auch Anweisungen zur Iteration von AD-Mitgliedern in einer Gruppe.

public ArrayList Groups(string userDn, bool recursive) 
{ 
    ArrayList groupMemberships = new ArrayList(); 
    return AttributeValuesMultiString("memberOf", userDn, 
     groupMemberships, recursive); 
} 

Sie auch diese Funktion benötigen:

public ArrayList AttributeValuesMultiString(string attributeName, 
    string objectDn, ArrayList valuesCollection, bool recursive) 
{ 
    DirectoryEntry ent = new DirectoryEntry(objectDn); 
    PropertyValueCollection ValueCollection = ent.Properties[attributeName]; 
    IEnumerator en = ValueCollection.GetEnumerator(); 

    while (en.MoveNext()) 
    { 
     if (en.Current != null) 
     { 
      if (!valuesCollection.Contains(en.Current.ToString())) 
      { 
       valuesCollection.Add(en.Current.ToString()); 
       if (recursive) 
       { 
        AttributeValuesMultiString(attributeName, "LDAP://" + 
        en.Current.ToString(), valuesCollection, true); 
       } 
      } 
     } 
    } 
    ent.Close(); 
    ent.Dispose(); 
    return valuesCollection; 
} 

Wenn Sie nun wollen diese AD-Methode verwenden, können Sie die Informationen in diesem Artikel verwenden könnte, aber es nutzt nicht verwalteten Code:

http://www.codeproject.com/KB/cs/groupandmembers.aspx

Die Beispielanwendung, die sie gemacht:

alt text

+1

Lokale Gruppen sind lokal für den Server; Sie werden nicht im AD gespeichert. Sie können jedoch AD-Benutzer und/oder Gruppen als Mitglieder enthalten. – quux

+0

Diese Antwort zeigt eine Möglichkeit, AD-Benutzer, aber nicht lokale Computergruppen aufzulisten. – hal9000

2

Es scheint, dass es eine neue Assembly in .net 3.5 namens System.DirectoryServices.AccountManagement gibt, die eine sauberere Implementierung als System.DirectoryServices bietet. Dominick Baier blogs about ein paar einfacher Operationen sowie die Zugehörigkeit zu einer Gruppe Überprüfung: -

public static bool IsUserInGroup(string username, string groupname, ContextType type) 
{ 
    PrincipalContext context = new PrincipalContext(type); 

    UserPrincipal user = UserPrincipal.FindByIdentity(
     context, 
     IdentityType.SamAccountName, 
     username); 
    GroupPrincipal group = GroupPrincipal.FindByIdentity(
     context, groupname); 

    return user.IsMemberOf(group); 
} 

Ich denke, dass ich diesen Ansatz verwenden, danke für die Anregungen, obwohl aber! :-)

+0

was ist der Kontexttyp hier ??? @ ljs – TechBrkTru

0

Ich stellte eine ähnliche Frage und endete damit, eine answer zu schreiben, die WMI verwendete, um die Gruppenmitglieder zu benennen. Ich hatte echte Probleme mit der Authentifizierung im System.directoryservices.accountmanagement stuff. YMMV, natürlich.

0

Ich wäre gespannt, ob das System.DirectoryServices.AccountManagement vollständig verwaltet wird. Ich habe System.DirectoryServices.ActiveDirectory verwendet, das ein Wrapper für COM Interop ist, der zu vielen Kopfschmerzen geführt hat ...

0

Dies kann möglicherweise helfen. Ich musste eine App entwickeln, wo wir gegen Active Directory authentifizieren möchten, und untersuchen Sie auch die Gruppen Zeichenfolgen, in denen der Benutzer ist.

Aus ein paar Gründen wollen wir nicht Windows-Authentifizierung verwenden, sondern haben unsere eigene formularbasierte Authentifizierung. Ich habe die folgende Routine entwickelt, um zum einen den Benutzer zu authentifizieren und zum anderen alle Gruppen zu untersuchen, denen der Benutzer angehört. Vielleicht kann es helfen. Die Routine verwendet LogonUser zur Authentifizierung und ruft dann die Liste der numerischen Guid-artigen Gruppen-IDs (SIDs) für diesen Benutzer ab und übersetzt diese in eine für den Menschen lesbare Form.

Hoffe das hilft, musste ich diesen Ansatz aus einer Vielzahl von verschiedenen Google-Suchen synthetisieren.

private int validateUserActiveDirectory() 
{ 
    IntPtr token = IntPtr.Zero; 
    int DBgroupLevel = 0; 

    // make sure you're yourself -- recommended at msdn http://support.microsoft.com/kb/248187 
    RevertToSelf(); 

    if (LogonUser(txtUserName.Value, propDomain, txtUserPass.Text, LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, token) != 0) { 
     // ImpersonateLoggedOnUser not required for us -- we are not doing impersonated stuff, but leave it here for completeness. 
     //ImpersonateLoggedOnUser(token); 
     // do impersonated stuff 
     // end impersonated stuff 

     // ensure that we are the original user 
     CloseHandle(token); 
     RevertToSelf(); 

     System.Security.Principal.IdentityReferenceCollection groups = Context.Request.LogonUserIdentity.Groups; 
     IdentityReference translatedGroup = default(IdentityReference); 

     foreach (IdentityReference g in groups) { 
      translatedGroup = g.Translate(typeof(NTAccount)); 
      if (translatedGroup.Value.ToLower().Contains("desired group")) { 
       inDBGroup = true; 
       return 1; 
      } 
     } 
    } 
    else { 
     return 0; 
    } 
} 
Verwandte Themen