Tician Geschrieben 12. Oktober 2015 Geschrieben 12. Oktober 2015 Hallöööchen mit 3 öchen,kurz und knapp: Ich versuche ein Programm zu schreiben das alle untergeordneten Mitarbeiter des aktuell angemeldeten Benutzers am PC in einer listBox anzeigt. Dazu suche ich in der AD nach dem Attribut "manager" in dem unter anderem der Name des Übergeordneten Benutzers steht. Hier fängt mein Problem an, es geht um folgende Zeilen:string username; search.Filter = "(manager="+username+")"; // search.Filter = "(manager=CN=Name Benutzer,OU=Benutzer,OU=Debitorenbuchhaltung,OU=Kaufmaennischer Service,OU=Abteilungen,DC=Domaene,DC=INT)"; // <- funktioniert!username ist dabei eine Variable in der der Benutzername des aktuell angemeldetetn Benutzers gespeichert wird. Wie muss die Suche aussehen damit ich sagen kann "Suche nach dem Benutzernamen im Attribut Manager, egal was davor und danach steht"? Wenn ich die zweite search.Filter benutze bekomme ich auch mein Ergebnis, aber das sollte nicht Sinn der Sache sein^^Ich habe auch ein bisschen mit den "*" herum probiert und natürlich auch gegoogelt, aber ich weiß nicht wie sich das ganze nennt und was ich eingeben kann um auf ein gutes Beispiel zu kommen. Für die search-Filter Funktion gibt es tausend Beispiele, aber keines das auf mein Problem passt (oder ich bin einfach blind).Ich hoffe ihr könnt mir helfen Tician Zitieren
Guybrush Threepwood Geschrieben 12. Oktober 2015 Geschrieben 12. Oktober 2015 Das hat wohl weniger mit C# Grundlagen als mit der AD Suche zu tun. Von welchem Typ ist denn search? Zitieren
Tician Geschrieben 13. Oktober 2015 Autor Geschrieben 13. Oktober 2015 Danke für die Antwort bei "search" steht als Typ:System.DirectoryServices.DirectorySearcher Ich sollte vllt den ganzen Code posten schätze ich mal using System; using System.Windows.Forms; using System.DirectoryServices; namespace ActiveDirectoryBla { public partial class Form1 : Form { public Form1() { InitializeComponent(); textBox1.Enabled = false; textBox2.PasswordChar = '#'; //Passwort-Feld für spätere Administration } private void textBox1_TextChanged(object sender, EventArgs e) { } private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { } private void button3_Click(object sender, EventArgs e) { string usernamead = System.Security.Principal.WindowsIdentity.GetCurrent().Name; string username = System.IO.Path.GetFileNameWithoutExtension(usernamead); textBox1.Text = username; string password = textBox2.Text; DirectoryEntry dir = new DirectoryEntry("LDAP://xx.xx.x.xx"); DirectorySearcher search = new DirectorySearcher(dir); //Ich starte eine Suche, die ich "search" nenne und sage wo gesucht wird (dir) search.Filter = "(manager="+username+")"; //ich sage wonach ich suche //search.Filter = "(objectClass=user)"; //<-- funktioniert! //search.Filter = "(manager=CN=xxxx xxxx,OU=Benutzer,OU=Debitorenbuchhaltung,OU=Kaufmännischer Service,OU=Abteilungen,DC=xxxx,DC=INT)"; // <- funktioniert! SearchResultCollection searchresult = search.FindAll(); //Hier in "searchresult" kommt alles rein was meine Suche findet if (searchresult != null) //wenn meine Suche nicht Ergebnislos ist dann... { foreach (SearchResult result in searchresult) //Für jedes Ergebnis... { /*var tmpResult = result; var tmpDirEntry = result.GetDirectoryEntry(); var tmpProperties = tmpDirEntry.Properties; var tmpPropSN = tmpProperties["sn"]; var tmpValue = tmpPropSN.Value;*/ listBox1.Items.Add(result.GetDirectoryEntry().Properties["cn"].Value.ToString()); } } } } }Nicht wundern, viele der Dinge die ich auskommentiert habe waren zum ausprobieren und weil andere DInge nicht liefen.https://msdn.microsoft.com/en-us/library/aa746475(v=vs.85).aspxDas habe ich auch schon gefunden, aber Microsoft bietet nicht ein einziges Beispiel mit einer Variable an wie ich sie habe.http://www.codeproject.com/Tips/150854/Accessing-Active-Directory-Objects-via-C-Visual-StDas ist der ursprüngliche Code den ich abgeleitet habe GrüßeTician Zitieren
Panawr Geschrieben 16. Oktober 2015 Geschrieben 16. Oktober 2015 Hey du.Ich muss zugeben, ich verstehe dein genaues Ziel und vorhaben noch nicht so ganz, aber da ich auch schon recht viel mit AD-Benutzers gearbeitet habe, stelle ich dir jetzt einfach mal eine Methode von mir zur Verfügung, die dir das Finden von Attributen vielleicht etwas einfacher macht. public static ActiveDirectoryResult GetActiveDirectoryUser(string domain, string userName) { DirectoryContext context = new DirectoryContext( DirectoryContextType.Domain, domain ); ActiveDirectoryResult result = new ActiveDirectoryResult(); DateTime latestLogon = new DateTime(1900, 1, 1); string servername = null; string name = null; string firstName = ""; string lastName = ""; string manager = ""; ... und so weiter DomainControllerCollection dcc = DomainController.FindAll(context); foreach (DomainController dc in dcc) { try { DirectorySearcher ds; using (dc) using (ds = dc.GetDirectorySearcher()) { ds.Filter = String.Format( "(&(objectClass=user)(sAMAccountName={0}))", userName ); //Hier einfach angeben welche Properties du vom User laden möchtest //z.B.: ds.PropertiesToLoad.Add("lastLogon"); ds.PropertiesToLoad.Add("name"); ds.PropertiesToLoad.Add("userAccountControl"); ds.PropertiesToLoad.Add("givenName"); ds.PropertiesToLoad.Add("manager"); ds.SizeLimit = 1; SearchResult sr = ds.FindOne(); if (sr != null) { // lastLogon DateTime lastLogon = DateTime.MinValue; //Hier dann die ausgewählten Properties zum Laden einfach füllen, //kann man natürlich auch anders bzw. weniger umständlich machen if (sr.Properties.Contains("lastLogon")) { lastLogon = DateTime.FromFileTime( (long)sr.Properties["lastLogon"][0] ); } if (DateTime.Compare(lastLogon, latestLogon) > 0) { latestLogon = lastLogon; servername = dc.Name; } if (sr.Properties.Contains("userAccountControl")) { active = (int)sr.Properties["userAccountControl"][0]; bool disabled = ((active & 2) > 0); result.IsActive = !disabled; } if (sr.Properties.Contains("name")) { name = (string)sr.Properties["name"][0]; } if (sr.Properties.Contains("givenName")) { firstName = (string)sr.Properties["givenName"][0]; } if (sr.Properties.Contains("objectSid")) { byte[] SID = null; SID = (byte[])sr.Properties["objectSid"][0]; sidString = GetSidString(SID); } //In deinem Fall dann z.B.: (habs nicht auf richtigkeit überprüft) manager = sr.Properties["manager"][0]; ... und so weiter.... } } } catch (Exception ex) { } } //Hier alle Properties in den Rückgabewert packen result.ParentOU = parentOU; result.LastLogon = latestLogon; result.FirstName = firstName; result.LastName = lastName; result.Manager = manager; ... und so weiter .... return result; } Vielleicht kannst du ja damit was anfangen.... LG Pana Zitieren
Tician Geschrieben 19. Oktober 2015 Autor Geschrieben 19. Oktober 2015 Uff, bei deinem Code werde ich dasselbe Problem haben. Ich versuche es nochmal verständlicher zu erklären.Ich möchte alle Benutzernamen auflisten die im Attribut "manager" meinen Namen stehen haben. Da in dem Attribut aber weitaus mehr als nur mein Name steht (ich aber nur nach diesem suchen möchte) wäre"(manager=Tician)"falsch. Irgendwie müsste es ähnlich,weil ich ja eine Variable habestring Name = Tician "(manager=*"+Tician+"*)"heißen. Ich brauch die Sternchen, aber ich weiß nicht wo, egal wo ich sie hinsetze krieg ich entweder Fehler oder es funktioniert nicht. Zitieren
Guybrush Threepwood Geschrieben 19. Oktober 2015 Geschrieben 19. Oktober 2015 Also laut der Beschreibung hier https://msdn.microsoft.com/en-us/library/aa746475(v=vs.85).aspx sollten Wildcards problemlos funktionieren.Was für Fehler bekommst du denn genau? Zitieren
Panawr Geschrieben 19. Oktober 2015 Geschrieben 19. Oktober 2015 (bearbeitet) Okay, verstehe.Ich probier später mal etwas rum. Bearbeitet 19. Oktober 2015 von Panawr Zitieren
Tician Geschrieben 19. Oktober 2015 Autor Geschrieben 19. Oktober 2015 Im Prinzip bekomme ich Fehler wenn ich die Wildcards(?) falsch setze. Ich weiß nicht wo die Sternchen hinmüssen um dasselbe Ergebnis zu bekommen wie wenn ich die vollständige Zeile eingebe.search.Filter = "(manager=CN=Tician Tralala,OU=Benutzer,OU=Debitorenbuchhaltung,OU=Kaufmännischer Service,OU=Abteilungen,DC=xxxxx,DC=xxx)"; // <- funktioniert!Die Zeile funktioniert und ich bekomme jeden Benutzer angezeigt der im manager-Attribut diese Zeile stehen hat, quasi mich als Vorgesetzten.Attribut= managerWert= CN=Tician Tralala,OU=Benutzer,OU=Debitorenbuchhaltung,OU=Kaufmännischer Service,OU=Abteilungen,DC=xxxxx,DC=xxxMeine Versuche das irgendwie nur auf den Namen zu beschränken sahen so aus und keines liefert Ergebnisse:string name = Tician search.Filter = "(manager=CN=Tician*)"; search.Filter = "(manager=*Tician*)"; search.Filter = "(manager=CN="+name+"*)"; search.Filter = "(manager=*"+name+"*)";Ich weiß einfach nicht was ich falsch mache, ich dachte es wäre etwas total banales das ich einfach nicht sehe. Vielleicht hilft das weiter GrußTician Zitieren
Guybrush Threepwood Geschrieben 19. Oktober 2015 Geschrieben 19. Oktober 2015 Wenn du nur einen * nach Tician setzt suchst du damit all Einträge die mit Tician beginnen und danach noch irgendwelchen beliebigen (oder gar keinen) Text haben. Mit *Tician* würdest du nach allen Einträgen suchen die irgendwo Tician drin stehen haben, also mit beliebigem Text davor und danach. Wenn du also damit einen Eintrag findestmanager=CN=Tician Tralalamüsstest du mitmanager=CN=Tician*den selben Eintrag finden. Zitieren
Tician Geschrieben 19. Oktober 2015 Autor Geschrieben 19. Oktober 2015 Nein mit ersterem finde ich auch keine Einträge... nur mit dieser kompletten Zeile:search.Filter = "(manager=CN=Tician Tralala,OU=Benutzer,OU=Debitorenbuchhaltung,OU=Kaufmännischer Service,OU=Abteilungen,DC=xxxxx,DC=xxx)";keine andere hat bisher funktioniert Zitieren
Guybrush Threepwood Geschrieben 19. Oktober 2015 Geschrieben 19. Oktober 2015 Ja dann meinetwegen halt sosearch.Filter = "(manager=CN=Tician*,OU=Benutzer,OU=Debitorenbuchhaltung,OU=Kaufmännischer Service,OU=Abteilungen,DC=xxxxx,DC=xxx)"; Zitieren
Tician Geschrieben 19. Oktober 2015 Autor Geschrieben 19. Oktober 2015 (bearbeitet) Selbst das tut nicht. Ich habe ein bisschen experimentiert, egal wo ich das Sternchen einfüge (und sei es nur statt der "xxx" bei "DC") es funktioniert nicht mehr.Ich denke gerade das die einzige Möglichkeit das irgendwie zum Laufen zu bringen ist, das Format von dem Wert zu ändern der im Manager-Attribut steht. Ich denke es klappt nicht weil da so viele Attribute drin stehen und C# das schätzungsweise nicht unterstützt. Das ist jetzt nur mein Laien-Denken das C# nichtAttribut: managerWert: CN=Tician*,OU=Benutzer,OU=Debitorenbuchhaltung,OU=Kaufmännischer Service,OU=Abteilungen,DC=xxxxx,DC=xxxsieht sondern durch die Kommas und "="-Zeichen ganz viele Attribute und Werte Vllt habe ich zumindest einen Ansatz gefunden, ich werde mich morgen damit beschäftigen:https://msdn.microsoft.com/en-us/library/ms180861(v=vs.80).aspx?f=255&MSPPError=-2147217396https://msdn.microsoft.com/en-us/library/ms180862(v=vs.80).aspx Bearbeitet 19. Oktober 2015 von Tician Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.