Alle Windows User Auslesen



  • es geht auch anders -> ich habe mir die werte in einen String ausgeben lassen und wenn ich auf den button klicke dann wird der String auf dem Label dargestellt ...

    so:

    // in der funkion
    test = pTmpBuf->usri0_name;
    
    // auf meinen klick
    wmain(0,0); // kann man hier vileicht noch was sinvoll ändern ?
    Label1->Caption = test;
    

    Das Prob ist das bei mir nur der erste user angegeben wird ! Doch wo ist der Rest ? Gast? Admin ?

    Oder auch anders wie kann ich einen schritt weiter gehen so das der zweite, dritte usw ... user ausgegeben werden ?



  • Du hast nicht wirklich den kompletten Code aus der MSDN kopiert und rufst diese "Funktion" nun aus Deinem Programm auf, oder?

    Das ist ein schlechter Scherz, oder?



  • Hepi schrieb:

    Das ist ein schlechter Scherz, oder?

    Nein, sieht leider ganz so aus 😞

    @TheGeek: EIn bisschen mehr Eigeninitiative wäre nicht schlecht. Versuche doch mal das Code-Beispiel zu verstehen und schlage die verwendeten Funktionen nach.



  • ich habe mir estmal den ganzen code reingezogen und daran rumgebastelt ... leider verstehe ich große teile davon noch nicht desswegen hab ich gehofft dass mir jemand helfen kann ihn zu verstehen 😞

    Ich bin leider noch nicht so bewandert was WinApi etc. angeht -> aber desswegen bin ich ja hier, oder ?



  • Was genau verstehst du denn an dem Code nicht - ist doch eigentlich gut kommentiert 😕

    TheGeek schrieb:

    Das Prob ist das bei mir nur der erste user angegeben wird ! Doch wo ist der Rest ? Gast? Admin ?

    Oder auch anders wie kann ich einen schritt weiter gehen so das der zweite, dritte usw ... user ausgegeben werden ?

    Du musst einfach wie im Code-Beispiel NetUserEnum in einer Schleife aufrufen 😉



  • Alles was interressant ist steht hier, nur verwenden die wie immer nen haufen sch**** der nur verwirrt.

    do // begin do
    {
    // HIER WERDEN DIE BENUTZER IN pBuf EINGELESEN
          nStatus = NetUserEnum(pszServerName,
                                dwLevel,
                                FILTER_NORMAL_ACCOUNT, // global users
                                (LPBYTE*)&pBuf,
                                dwPrefMaxLen,
                                &dwEntriesRead,
                                &dwTotalEntries,
                                &dwResumeHandle);
          //
          // If the call succeeds,
          //
          // IS ERROR_MORE_DATA in nStatus DANN KONNTEN NICHT ALLE BENUTZER IN EINEM
          // DURCHGANG GELESEN WERDEN
          if ((nStatus == NERR_Success) || (nStatus == ERROR_MORE_DATA))
          {
            // HIER WIRD DER ZEIGER pBuf NACH pTmpbuf KOPIERT
             if ((pTmpBuf = pBuf) != NULL)
             {
                //
                // Loop through the entries.
                //
                // EINMAL FÜR JEDEN BENUTZER DIE SCHLEIFE AUSFÜHREN
                for (i = 0; (i < dwEntriesRead); i++)
                {
                   assert(pTmpBuf != NULL);
                   // DAS ASSERT UND DIE ÜBERPRÜFUNG IM if SIND SINNLOS DA HIER
                   // pTmpBuf IN JEDEM FALL EINEN WERT != NULL HAT
                   // WURDE JA WEITER OBEN SCHON GEPRÜFT
                   if (pTmpBuf == NULL)
                   {
                      fprintf(stderr, "An access violation has occurred\n");
                      break;
                   }
                   //
                   //  Print the name of the user account.
                   //
                   // HIER WIRD DER NAMEN AUSGEGEBEN
                   wprintf(L"\t-- %s\n", pTmpBuf->usri0_name);
    
                   // DEN ZEIGER AUF DIE NÄCHSTE STRUKTUR MIT DEN BENUTZERDATEN
                   // ZEIGEN LASSEN
                   pTmpBuf++;
                   // BENUTZERANZAHL UM 1 ERHÖHEN
                   dwTotalCount++;
                }
             }
          }
          //
          // Otherwise, print the system error.
          //
          else
             fprintf(stderr, "A system error has occurred: %d\n", nStatus);
          //
          // Free the allocated buffer.
          //
          // HIER WIRD SPEICHER FREIGEGEBEN DER WEITER OBEN VOM SYSTEM GEHOLT WURDE
          // (OBERHALB DER DO-WHILE-SCHLEIFE) UND FÜR DIE SPEICHERUNG DER BENUTZER
          // VERWENDET WURDE
          if (pBuf != NULL)
          {
             NetApiBufferFree(pBuf);
             pBuf = NULL;
          }
       }
       // Continue to call NetUserEnum while 
       //  there are more entries. 
       // 
       // IST DER ANGEFORDERTE SPEICHERBEREICH NICHT GROß GENUG GEWESEN WIRD DAS GANZE
        // NOCHMALS DURCHGEFÜHRT UM DIE RESTLICHEN BENUTZER ZU HOLEN
        // dwTotalEntries wird hierbei mit der Zahl der bereits gelesenen Benutzer
        // übergeben wodurch die restlichen und nicht die gleichen wieder gelesen werden
       while (nStatus == ERROR_MORE_DATA); // end do
    

    Ich hoffe mal ich konnte helfen 🙂



  • Danke SirLant !!! 🕶

    jetzt werde ich mich in mein stilles Kämmerlein zurückziehen und den code mal ausführlich studieren und testen 😃

    Nette Grüße

    TheGeek



  • Juhu ich hab´s Rausgebekommen !!! 😃

    Ist zwar eine "Sehr Unkonvensionelle" Lösung aber es macht das was es soll, basta. 😃

    hier nun der code:

    // im deklarations bereich
    AnsiString user1, user2, user3, user4, user5, user6, user7, user8, user9, user10;
    int zaehlung;
    
    ... //weiter unten in der funkion
    
    // HIER WIRD DER NAMEN AUSGEGEBEN
    zaehlung++; //zählt mit
    
    wprintf(L"\t-- %s\n", pTmpBuf->usri0_name);
    
    //je nach zählung wird hier der String "rausgesucht" und mit dem User "gefüllt"
    if (zaehlung == 1) user1 = pTmpBuf->usri0_name;
    if (zaehlung == 2) user2 = pTmpBuf->usri0_name;
    if (zaehlung == 3) user3 = pTmpBuf->usri0_name;
    if (zaehlung == 4) user4 = pTmpBuf->usri0_name;
    if (zaehlung == 5) user5 = pTmpBuf->usri0_name;
    if (zaehlung == 6) user6 = pTmpBuf->usri0_name;
    if (zaehlung == 7) user7 = pTmpBuf->usri0_name;
    if (zaehlung == 8) user8 = pTmpBuf->usri0_name;
    if (zaehlung == 9) user9 = pTmpBuf->usri0_name;
    if (zaehlung == 0) user10 = pTmpBuf->usri0_name;
    
    ... // und wenn man die funkion aufruft ...
    
    wmain(0,0); // aufruf der funkion
    
    // ich lasse hier überprüfen ob die listboxeinträge voll sind
    // und wenn ja dann werden sie dargestellt sonst nicht
    if (user1 != "") WinUser->Items->Add(user1);
    if (user2 != "") WinUser->Items->Add(user2);
    if (user3 != "") WinUser->Items->Add(user3);
    if (user4 != "") WinUser->Items->Add(user4);
    if (user5 != "") WinUser->Items->Add(user5);
    if (user6 != "") WinUser->Items->Add(user6);
    if (user7 != "") WinUser->Items->Add(user7);
    if (user8 != "") WinUser->Items->Add(user8);
    if (user9 != "") WinUser->Items->Add(user9);
    if (user10 != "") WinUser->Items->Add(user10);
    

    Ach ja der eigentliche Grund warum ich das mit den Usern wissen wollte ist HIER ...

    Grüße
    TheGeek



  • oh mein gott. lern programmieren.



  • Weißt du wofür man Schleifen und Arrays einsetzt?



  • ... und du sollst nich wmain aufrufen ⚠



  • @ OMG -> lass den quatsch mach es selber erstmal besser !!

    @ SirLant -> ich habe auch erst über ein Array nachgedacht aber leider habe ich das noch nicht so gut hinbekommen ! Meine zeit als hobbyprogrammierer hatt erst begonnen ... 😉 und desswegegen habe ich mich für etwas "unkonventionelles" entschieden

    @ flenders -> Sorry ich bin unverbesserlich 🙄 ...

    @ ALL -> DANKE für die geduld und hilfe !



  • eine frage: was machst du, wenn ein system mehr als 10 user hat?
    schon allein deshalb solltest du die schleifnversion benutzen.

    achja, die winapi is schon sehr schwer für den anfang, lern erstmal c bevor du die winapi benutzt(du benutzt doch c oder?)



  • otze schrieb:

    eine frage: was machst du, wenn ein system mehr als 10 user hat?
    schon allein deshalb solltest du die schleifnversion benutzen.

    achja, die winapi is schon sehr schwer für den anfang, lern erstmal c bevor du die winapi benutzt(du benutzt doch c oder?)

    AnsiString ist doch ne Stringklasse aus der VCL wenn ich mich nicht irre



  • dann hängen wir ein "++" ans c, der code wird dadurch aber um keinen deut besser(ansistring ist die dümmste erfindung in der vcl, wieso kein wstring,oder eine klasse, der man einen wstring übergeben kann?)



  • otze schrieb:

    dann hängen wir ein "++" ans c, der code wird dadurch aber um keinen deut besser(ansistring ist die dümmste erfindung in der vcl, wieso kein wstring,oder eine klasse, der man einen wstring übergeben kann?)

    Ich weiß gar nicht was du gegen den Code hast 😃



  • weils ja eigentlich nur schlechtes c+ ist^^


Anmelden zum Antworten