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?
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 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.
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!
**:::
Der Fehler ist behoben 😄 Layer 8 Problem. Danke für die Hilfe.
Jetzt hat es mit dem nicht existierenden givenname geknallt. Was kann man dagegen machen? Gibt es dafür eine Funktion?
Bevor du mit einem unbekannten Ergebnis was machst, sollst/musst du prüfen, z.B. ob es null ist oder nicht, etc.
**:::
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;
}
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.
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.
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 😉