none
Infos zu den Users einer Maschine/Domäne auflisten RRS feed

  • Frage

  • Guten Tag,

    ich versuche mit dem folgenden Code die Informationen zu den Users einer Maschine/Domäne aufzulisten, wenn ich auf Button klicke, wird folgendes gezeigt: "Der Netzwerkpfad wurde nicht gefunden."

    Was habe ich bitte falsch gemacht?

    namespace ActiveDirectory
    {
        class Users : CollectionBase
        {
           public User this[int index]
            {
                set { base.InnerList[index] = value; }
                get { return (User)base.InnerList[index]; }
            }
    
            internal void Add(User user)
            {
                base.InnerList.Add(user);
            }
            public static Users EnumUsers(string domainName, string machineName, string bindUser, string bindPassword)
            {
                Users users = new Users();
                if (domainName == null && machineName == null)
                    machineName = Environment.MachineName;
    
                string adsiPath = "WinNT://";
                if (domainName != null && machineName != null)
                    adsiPath += domainName + "/" + machineName + ",computer";
                else if (machineName != null)
                    adsiPath += machineName + ",computer";
                else if (domainName != null)
                    adsiPath += domainName + ",domain";
    
                DirectoryEntry computerEntry = new DirectoryEntry(adsiPath, bindUser, bindPassword);
    
                try
                {
                    foreach (DirectoryEntry de in computerEntry.Children)
                    {
                        if (de.SchemaClassName.ToLower() == "user")
                        {
                            User user = new User();
                            user.Name = de.Name;
                            try { user.FullName = (string)de.Properties["FullName"].Value; } catch { }
                            try { user.Beschreibung = (string)de.Properties["Description"].Value;} catch { }
                            try { user.HomeDirectory = (string)de.Properties["HomeDirectory"].Value; } catch { }
                            try { user.MaxStorage = (int)de.Properties["MaxStorage"].Value; } catch { }
                            try { user.LastLogin = (DateTime)de.Properties["LastLogin"].Value; } catch { }
    
                            users.Add(user);
                        }    
                    }
                }
                finally
                {
                    computerEntry.Dispose();
                }
                return users;
            }
     
        }
    }
    

     string domainName = null;
            string machineName = null;
            string bindUser = null;
            string bindPassword = null;
    
            string NL = Environment.NewLine;
            private void button1_Click(object sender, EventArgs e)
            {
                try
                {
                    Users users = Users.EnumUsers(domainName, machineName, bindUser, bindPassword);
    
                    for (int i = 0; i < users.Count; i++)
                    {
                        textBox1.Text = "Name: {0}, users[i].Name" + NL +
                        "Vorname: {0}, users[i].FullName" + NL +
                        "Beschreibung: {0}, users[i].Description" + NL +
                        "Letzter Login: {0}, users[i].LastLogin" + NL +
                        "Home-Verzeichnis: {0}, users[i].HomeDirectory" + NL +
                        "Maximaler Speicherplatz: {0}, users[i].MaxStorage";
    
                    }
                }
                catch (Exception ex)
                {
                    textBox1.Text = ex.Message;
                }
            }

    Montag, 11. Februar 2019 13:02

Antworten

  • Hi,

    das ist ja auch nicht schlimm.

    Ich formuliere es dann mal anders.

    Anstelle von null bei allen Werten übergib mal:

    string domainName = "NameEurerDomäne";
    string machineName = ".";
    string bindUser = "BenutzernameFürADZugriff";
    string bindPassword = "PasswortDesBenutzersFürADZugriff";

    Also natürlich nicht genau diese Werte, sondern die, die für euer AD passen.

    Dann setzt Du mal einen Breakpoint auf die erste Codezeile in der EnumUsers Methode und gehst dann mit F10 schrittweise durch den Code.

    Beachte bitte auch, dass ein catch Zweig, in dem rein gar nichts steht, in der Regel nicht sinnvoll ist. Ich würde hier eher ein Protokoll füllen (es reicht ja eine List<String>, in die Du dann ex.ToString() reinschreibst) und mir das dann mal anschauen.



    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Montag, 11. Februar 2019 22:04
    Moderator

Alle Antworten

  • Hi,

    Du fragst, was Du falsch gemacht hast: Du hast keine Breakpoints gesetzt, nicht debuggt, nicht geschaut, welche Codezeile genau den Fehler auslöst und uns alles mit null übergeben. Wie soll das funktionieren?

    Für den lokalen PC nimmt man in der Regel ., für eine Domäne eben was anderes. User und PW sollte man wohl auch setzen, ansonsten kann man die Anwendung auch mit einem berechtigten AD Acccount starten (also einem, der die Informationen lesen darf)


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Montag, 11. Februar 2019 15:59
    Moderator
  • Hi,

    Du fragst, was Du falsch gemacht hast: Du hast keine Breakpoints gesetzt, nicht debuggt, nicht geschaut, welche Codezeile genau den Fehler auslöst und uns alles mit null übergeben. Wie soll das funktionieren?

    Für den lokalen PC nimmt man in der Regel ., für eine Domäne eben was anderes. User und PW sollte man wohl auch setzen, ansonsten kann man die Anwendung auch mit einem berechtigten AD Acccount starten (also einem, der die Informationen lesen darf)


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport


    Ich bin leider neue was Programmieren angeht
    Montag, 11. Februar 2019 20:42
  • Hi,

    das ist ja auch nicht schlimm.

    Ich formuliere es dann mal anders.

    Anstelle von null bei allen Werten übergib mal:

    string domainName = "NameEurerDomäne";
    string machineName = ".";
    string bindUser = "BenutzernameFürADZugriff";
    string bindPassword = "PasswortDesBenutzersFürADZugriff";

    Also natürlich nicht genau diese Werte, sondern die, die für euer AD passen.

    Dann setzt Du mal einen Breakpoint auf die erste Codezeile in der EnumUsers Methode und gehst dann mit F10 schrittweise durch den Code.

    Beachte bitte auch, dass ein catch Zweig, in dem rein gar nichts steht, in der Regel nicht sinnvoll ist. Ich würde hier eher ein Protokoll füllen (es reicht ja eine List<String>, in die Du dann ex.ToString() reinschreibst) und mir das dann mal anschauen.



    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Montag, 11. Februar 2019 22:04
    Moderator
  • Hi,

    das ist ja auch nicht schlimm.

    Ich formuliere es dann mal anders.

    Anstelle von null bei allen Werten übergib mal:

    string domainName = "NameEurerDomäne";
    string machineName = ".";
    string bindUser = "BenutzernameFürADZugriff";
    string bindPassword = "PasswortDesBenutzersFürADZugriff";

    Also natürlich nicht genau diese Werte, sondern die, die für euer AD passen.

    Dann setzt Du mal einen Breakpoint auf die erste Codezeile in der EnumUsers Methode und gehst dann mit F10 schrittweise durch den Code.

    Beachte bitte auch, dass ein catch Zweig, in dem rein gar nichts steht, in der Regel nicht sinnvoll ist. Ich würde hier eher ein Protokoll füllen (es reicht ja eine List<String>, in die Du dann ex.ToString() reinschreibst) und mir das dann mal anschauen.



    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Ich hätte mal bitte noch eine Frage.

    Für den BenutzernameFürADZugriff muss ich den  AD Administrator UserName und sein PasswortFürADZugriff verwenden oder? Mein Rechner ist in der Domäne und der System-Integration-Dozent meint jeder Domain Benutzer kann das Ohne die Daten von AD Admin angewiesen zu sein, ist das so möglich?


    Dienstag, 12. Februar 2019 08:43
  • Hi,

    bestimmte Infos kann jeder aktive Benutzer im AD lesen (muss er ja auch), andere Infos wiederum nicht.

    Da ich kein AD Spezi bin, kann ich dir nicht sagen, was wann von wem wie gelesen werden kann und wann, was, wie eben nicht.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport


    Dienstag, 12. Februar 2019 08:59
    Moderator
  • Hi,

    bestimmte Infos kann jeder aktive Benutzer im AD lesen (muss er ja auch), andere Infos wiederum nicht.

    Da ich kein AD Spezi bin, kann ich dir nicht sagen, was wann von wem wie gelesen werden kann und wann, was, wie eben nicht.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport


    Ok, vielen Deine Bemühungen

    Nette grüße

    Sofi

    Dienstag, 12. Februar 2019 10:36