Laden...

Benutzer aus AD-Gruppe Abfragen

Erstellt von Grumbler85 vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.656 Views
G
Grumbler85 Themenstarter:in
538 Beiträge seit 2008
vor 13 Jahren
Benutzer aus AD-Gruppe Abfragen

Hallo allerseits,

ich versuche grade aus einer AD die Benutzer einer speziellen Gruppe abzufragen und verzweifle daran ein wenig...

Ziel der Sache ist es alle Benutzer dieser Gruppe auszulesen und ein eindeutiges Identifizierungsmerkmal (ich tippe mal GUID) auszulesen, welches mit den Daten die der SQL Server bei SUSER_SID() ausgibt zu vergleichen.

Das wichtigste davon wäre erstmal für mich, wie ich die Benutzer ermittle die dieser speziellen Gruppe angehören (um das ganz spannend zu machen noch ne kleine Stolperfalle: Die Benutzergruppe ist aktuell (testumgebung) lokal, die Benutzer selbst kommen aber aus der AD)

Vielen dank schon mal an alle, die mir Tipps geben können

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)

D
500 Beiträge seit 2007
vor 13 Jahren

Hi!

Ich werde mal nachfolgend versuchen ein wenig Code darstellen. Dieser ist nicht getestet, aber sollte Dir helfen auf eine Loesung zu kommen. Dieser Code iteriert ueber alle Gruppen und gibt die Benutzer zu der jeweiligen Gruppe aus:


var directorySearcher = new DirectorySearcher { SearchRoot = new new DirectoryEntry(...), Filter = "(&(objectClass=group))" };
// Define filters to determine which group's properties will be shown
directorySearcher.PropertiesToLoad.Add("name");
directorySearcher.PropertiesToLoad.Add("objectsid");

// Sets the number of groups who will be listed to the maximum of an Int32
// If no value will be specified the default number of shown users will be 1000
directorySearcher.PageSize = Int32.MaxValue;
directorySearcher.SizeLimit = Int32.MaxValue;
directorySearcher.CacheResults = true;

SearchResultCollection results = directorySearcher.FindAll();

// Iterate through all groups
foreach (SearchResult searchResult in results)
{
   // anonymous type is used only for better understanding in
   // this mycsharp sample. Create a concrete enity
   var group = new
   {
      Name = GetPropertyValue(searchResult, "name"), 
      SID = GetSIDValue(searchResult)
   };

   // Invoke method Members to get all members i.e. users assigned to the current group
   object members = new DirectoryEntry(searchResult.Path).Invoke("Members", null);

   // anonymous type is used only for better understanding in
   // this mycsharp sample. Create a concrete enity
   // Iterate through all users
   var users = (from object user in (IEnumerable)members
                                      select new DirectoryEntry(user)
                                      into userDirectoryEntry
                                      select new
                                                 {
                                                     SID = this.GetSIDValue(userDirectoryEntry),
                                                     Name = this.GetPropertyValue(userDirectoryEntry, "name")
                                                 }).ToList();

   // Do something with the group and its assigned users

}

private string GetPropertyValue(DirectoryEntry directoryEntry, string propertyName)
{
   PropertyValueCollection pvc = directoryEntry.Properties[propertyName];
            
   if ((pvc != null) && (pvc.Count > 0))
   {
      return pvc[0].ToString();
   }

   return string.Empty;
}

private string GetSIDValue(DirectoryEntry directoryEntry)
{
   PropertyValueCollection pvc = directoryEntry.Properties["objectsid"];
   if ((pvc != null) && (pvc.Count > 0))
   {
      var sid = new SecurityIdentifier((byte[])pvc[0], 0);
      return sid.Value;
   }

   return string.Empty;
}


Gruss,
DaMoe

G
Grumbler85 Themenstarter:in
538 Beiträge seit 2008
vor 13 Jahren

Also - ich hatte nun mal Zeit mich endlich darum zu kümmern ...

Für eine AD funktioniert das oben gezeigte Verfahren - also bei einer Abfrage per LDAP kommen so alle Gruppen raus.

Problem an der Sache ist allerdings, dass die Gruppe eine lokale Gruppe ist und die Benutzer Domänenbenutzer sind

Ein Abfragen per WinNT-Provider liefert zwar die Gruppe, allerdings bringt ein Invoke("members", null) genau 0 Mitglieder in der Gruppe.

Hat dazu jemand eine Idee?

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)