Laden...

AD - Nach Usern suchen.

Erstellt von Kanubbel vor 4 Jahren Letzter Beitrag vor 4 Jahren 2.251 Views
K
Kanubbel Themenstarter:in
5 Beiträge seit 2019
vor 4 Jahren
AD - Nach Usern suchen.

Guten Morgen Zusammen,

ich bin momentan Azubi und muss ein Programm entwickeln zur Verwaltung einer Datenbank. (Habe nicht sehr viel Erfahrung damit, deshalb entschuldigt bitte, dass ich "offensichtliches" nicht direkt erkenne). In dem Programm soll der Benutzer in einer neuen Form nach Benutzern im Active directory suchen. Ich habe dafür ein Button "Suchen" ein Textfeld für die Eingabe und ein DataGridView für die Ausgabe. Ich habe schon viel mit dem DirectoryEntry ausprobiert, bin aber jedes mal auf Fehler gestoßen, wie z.B. "-2147016661". Danach habe ich es auf einem anderen Weg gemacht, womit ich aber nicht nach mehreren Nutzern und mit unterschiedlichen Eingaben suchen konnte. Es funktionierte nur mit der UserID und es gab mir nur dann was aus, wenn auch nur ein Benutzer für die Suche existierte.


//Versuch Nummer 1
if (null != ConfigurationManager.ConnectionStrings["UserForActiveDirectoryAccess"])
                    {
                        string adUser = ConfigurationManager.ConnectionStrings["UserForActiveDirectoryAccess"].ConnectionString;
                    }

                    using (var pctx = new PrincipalContext(ContextType.Domain, "domhv1", adUserID, adUserPassword))
                    {
                        using (UserPrincipal up = UserPrincipal.FindByIdentity(pctx, getUserID))
                        {
                            if (up != null)
                            {
                                UserID = up.SamAccountName;
                            }
                            else
                            {
                                MessageBox.Show("Konnte nichts finden.");
                                return;
                            }
                        }



//Versuch Nummer 2            
string searchbox = txtSearch.Text;
            DirectoryEntry dirEntry;
            string Path = "LDAP://DC=domhv1,DC=de";
            dirEntry = new DirectoryEntry(Path);
            DirectorySearcher adSearcher = new DirectorySearcher(dirEntry);
            adSearcher.Filter = "(&(objectCategory=person(objectClass=user))";
            foreach (SearchResult res in adSearcher.FindAll())
            {
                if(res.Properties["givenname"].Count > 0)
                {
                    lbOutput.Text += "<br />" + (string)res.Properties["givenname"][0];
                }
            }

Daher würde ich gerne Wissen, wie kann ich das machen, dass ich nach mehreren Sachen suchen kann (Email, UserID, Vorname, Nachname) und dann auch mehrere User rausbekomme?

1.696 Beiträge seit 2006
vor 4 Jahren

Dein Suchfilter kannst du erweitern, z.B.

"(&(objectCategory=User)(|(samaccountname=xyz*)(samaccountname=abc*)))"

die User Attributes kannst du hier entnehmen http://www.kouti.com/tables/userattributes.htm

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

K
Kanubbel Themenstarter:in
5 Beiträge seit 2019
vor 4 Jahren

Ich habe es versucht, jedoch gibt er mir bei der foreach Zeile den error "System.DirectoryServices.DirectoryServicesCOMException: 'Eine Referenzauswertung wurde vom Server zurückgesendet'" und dafür habe ich keine Lösung gefunden.

1.696 Beiträge seit 2006
vor 4 Jahren

Du sollst vernünftige Fehlerabfang mit try & catch betreiben, dann weißt du wo es aussteigt. Ich vermute mal, dass bei einem Userkonto nichts in givenname steht, daher knallt es mit dem Vergleich mit .Count!

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

K
Kanubbel Themenstarter:in
5 Beiträge seit 2019
vor 4 Jahren

Der Fehler ist behoben 😄 Layer 8 Problem. Danke für die Hilfe.

K
Kanubbel Themenstarter:in
5 Beiträge seit 2019
vor 4 Jahren

Jetzt hat es mit dem nicht existierenden givenname geknallt. Was kann man dagegen machen? Gibt es dafür eine Funktion?

1.696 Beiträge seit 2006
vor 4 Jahren

Bevor du mit einem unbekannten Ergebnis was machst, sollst/musst du prüfen, z.B. ob es null ist oder nicht, etc.

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

K
Kanubbel Themenstarter:in
5 Beiträge seit 2019
vor 4 Jahren

Für die Nachwelten, hier die Lösung.

            dgvOutput.Rows.Clear();
            string searchbox = txtSearch.Text;
            DirectoryEntry dirEntry;
            string Path = "LDAP://DC=YourPath";
            dirEntry = new DirectoryEntry(Path);
            DirectorySearcher adSearcher = new DirectorySearcher(dirEntry);
            adSearcher.Filter = "(&(objectCategory=User)(|(samaccountname=*" + searchbox + "*)(givenname=*" + searchbox + "*)(sn=*" + searchbox + "*)(mail=*" + searchbox + "*)))";
            try
            {
                foreach (SearchResult res in adSearcher.FindAll())
                {
                    string Vorname = "-";
                    string Nachname = "-";
                    string UserID = "-";
                    string Mail = "-";
                    if (res.Properties["givenname"].Count > 0 || res.Properties["sn"].Count > 0 || res.Properties["mail"].Count > 0 || res.Properties["samaccount"].Count > 0)
                    {
                        if(res.Properties["samaccountname"][0] != null)
                        {
                            UserID = (string)res.Properties["samaccountname"][0];
                        }
                        if (res.Properties["givenname"][0] != null)
                        {
                            Vorname = (string)res.Properties["givenname"][0];
                        }
                        if (res.Properties["sn"][0] != null)
                        {
                            Nachname = (string)res.Properties["sn"][0];
                        }
                        if (res.Properties["mail"] != null)
                        {
                            Mail = (string)res.Properties["mail"][0];
                        }
                        dgvOutput.Rows.Add(UserID, Vorname, Nachname, Mail);
                    }
                }
            }
            catch (Exception ex)
            {
                string m = ex.Message;
            }
B
22 Beiträge seit 2018
vor 4 Jahren
  
catch (Exception ex)  
{  
      string m = ex.Message;  
}  
  

Im Sinne der Wiederverwendbarkeit des Codes ist es keine Sinnvolle Lösung die Fehlermeldung der Exception in einer Variablen zu speichern auf die niemand Zugriff hat.

Gehen wir davon aus du nutzt eine andere Methode die die Methode mit deinem Code ausführt. Woher soll die Aufrufende Methode wissen das eine Exception aufgetreten ist. Die Fehlermeldung steht in deiner Variablen "m" und wird vergessen.

A
2 Beiträge seit 2019
vor 4 Jahren

Hallo zusammen,

habe vor kurzem mit C# angefangen.

Ich soll eine Consolen Anwendung schreiben, die bei der Eingabe von den Name die Liste mit den Gruppen ausgibt in den man ist, oder eine Fehlermeldung rauswerfen.

Wird der Script viel anderes sein? Muss man viel ändern?

Ich habe 2 Gruppen die ich durchsuchen muss, in einer bin Angemeldet in einer anderen nicht.

M
368 Beiträge seit 2006
vor 4 Jahren

Lösung.

Von der expliziten "!= null"-Prüfung mal abgesehen, könnte man sich die Null-Coalesce oder Null-Conditional-Operatoren mal ansehen: http://dotnetperls.com/null-coalescing

Goalkicker.com // DNC Magazine for .NET Developers // .NET Blogs zum Folgen
Software is like cathedrals: first we build them, then we pray 😉