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)
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
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)