Zum Inhalt springen

C# Grundlagenfrage


Tician

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Das 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-St

Das ist der ursprüngliche Code den ich abgeleitet habe

 

Grüße

Tician

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 habe

string 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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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= manager

Wert= CN=Tician Tralala,OU=Benutzer,OU=Debitorenbuchhaltung,OU=Kaufmännischer Service,OU=Abteilungen,DC=xxxxx,DC=xxx

Meine 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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 findest

manager=CN=Tician Tralala

müsstest du mit

manager=CN=Tician*

den selben Eintrag finden.

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

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# nicht

Attribut: manager

Wert: CN=Tician*,OU=Benutzer,OU=Debitorenbuchhaltung,OU=Kaufmännischer Service,OU=Abteilungen,DC=xxxxx,DC=xxx

sieht 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=-2147217396

https://msdn.microsoft.com/en-us/library/ms180862(v=vs.80).aspx

Bearbeitet von Tician
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...