[Windows] Benutzer eines Netzwerkrechners herausfinden



  • Hallöchen liebe Community.

    Ich habe ein kleines Problem:
    Mein Programm erfasst mittels Socket alle im Netz aktiven Rechner per IP in eine Liste und ordnet jedem Eintrag den entsprechenden Computer-Namen zu. Des Weiteren soll noch der aktuell an dem entsprechenden PC angemeldete Benutzer angezeigt werden (also quasi ein GetUserName() auf die entsprechende IP odere den Computer-Namen). Ich hab das ganze zwar schon recht unsauber mit System geschrieben, der den ganzen Spaß in eine Text-Datei schreibt und anschließend den gewünschten Teil wieder in String-Form einliest, aber das geht doch bestimmt auch "schöner". Außerdem sollte das ganze (falls überhaupt möglich) ohne Clients auf den ensprechenden Rechnern funktionieren, da die Anzahl von Rechnern im Netz schwankt und ich nicht immer auf jeden Rechner einen Client installieren möchte. (Ob SNMP da vielleicht ein Ansatz ist?)

    Mein bisheriger Code für den Aufruf(nutzt auch für die Auflistung der IP-Adressen und Computer-Namen einen System-Aufruf, der über buffer::writebuffer(CSTRING) verarbeitet wird (Methode schreibt übergebenen Befehl per Stringstream in Textdatei, die dann von der entsprechenden Methode Zeile für Zeile ausgelesen wird und dann entsprechend die entscheidenden Infos im String-Array Table abgelegt werden):

    void buffer::settableUser(){
        string s1, s2, ip;
        const char *cmd;
        int r = 0;
    
        for(int i = 0; i < buffer::getentry(); i++){
            s1 = "wmic.exe /node:";                                                     // 1. Teil des Befehls zur Nutzerabfrage
            s2 = " computersystem get username";                                        // 2. Teil des Befehls zur Nutzerabfrage
            ip = buffer::table[0][i];                                                   // IP (für Nutzerabfrage)
            string command = s1 + ip + s2;                                              // Zusammensetzten des Befehls für Nutzerabfrage
            cmd = command.c_str();                                                      // Ändern von std::string auf CString
            buffer::writebuffer((char*)cmd);                                            // Übergabe (mit Typecast von const char* auf char*) von Befehl
            ifstream input("buffer.txt");
            string line;
            int c = 0;
            if(!input){
                buffer::seterrstate(1);
                return;
            }
            if(buffer::getlines() > 3){
                while(!input.eof()){
                    getline(input, line);
                    // cout << c << ": " << line << endl;                               // Kleine Debug-Zeile, Gibt für jeden Buffer-Eintrag die Linien sowie ihren Inhalt aus.
                    if(c == 1 && line.size() > 1){                                      // Wenn an der 2. Linie der Bufferdatei ein String größer 1 Zeichen gelesen wird
                        buffer::table[2][i] = line;                                     // Schreibt den String mit dem Nutzer in die Tabelle (vlt. um Domäne kürzen?)
                        r++;                                                            // Weiter in nächste Zeile der Tabelle
                    }
                    c++;                                                                // Erhöht Dateizeilencounter um 1;
                }
            }
            input.close();
        }
        system("cls");                                                                  // Löscht eventuelle Fehleranzeigen beim Aufruf des Befehls (z.B. wenn kein Server erreichbar)
    }
    

    tl/dr: Die Methode konsolidiert also 3 Strings zu "wmic.exe /node:<IP_Adresse> computersystem get username" , übergibt diese an die Methode buffer::writebuffer, öffnet dann die entstandene buffer.txt und liest dann entsprechend das Ergebnis aus und schreibt diese an die entsprechende Stelle des Array. Danach werden entsprechende Counter erhöht, die Datei geschlossen und das Terminal (die Konsole) bereinigt.

    Problem an der Sache ist, dass das Programm mit dieser Methode recht lange braucht, um meinen Datensatz zu füllen (mit der Namensauflösung ca. 9 Minuten, abhängig von der Netzwerkgröße)

    Die aktuelle Idee ist, dass die Methode einen String bekommt, der entweder den Namen des Rechners oder seine IP enthält und anhand diesen den aktuell auf dem PC aktiven Nutzer als String zurück gibt, also eine Methode, die "wmic.exe /node:<IP_Adresse> computersystem get username" nicht über System laufen lässt bzw. eine Methode GetUserName(), die über Socket auf eine IP aufgerufen wird (ich will die wmic.exe nicht gewaltsam auseinandernehmen, da sie in ihrem Umfang doch etwas zu aufgeblasen ist).

    Hat mir jemand eine Idee oder einen Ansatz?

    Code schreiben kann ich selber, ich brauch zur Not nur eine Bibliothek oder eine Funktion(oder wahrscheinlich mehrere), die mir dabei helfen könnten.

    Bin für jeden Wink mit dem Zaunpfahl dankbar 😉


Log in to reply