Alle User im Netzwerk anzeigen



  • Ich habe da einen Beitrag schonmal unter WinApi gefunden, jedoch komme ich mit dem nicht klar.
    Rechner im Netzwerk auflisten
    "fprintf" wird da sehr oft am Anfagn der Zeile gehängt, dass habe ich noch nie im BCB gesehen. Ich habe das auch alles mal kompiliert, ging sogar gut, keine Fehler. Jedoch weiß icht ob diese Datei auch für den BCB bestimmt ist.

    Ich möchte alle User des Netzwerkes rausfinden, alle haben die gleiche Anmeldedomain. Das könnte euch vielleicht helfen.
    Ich möchte nun jeden Usernamen (Anmeldenamen) der im Netzwerk angemeldet ist, in einer ListBox anzeigen.

    Ich hoffe hier etwas weiter zu kommen.

    thx Leute



  • "fprintF" ist eine Ansi-C-Funktion, d.h sie ist allgemein in C/C++ gültig



  • Das Thema passt auch in unsere FAQ, deshalb eine "BCB-Version" dieses Beitrags aus dem WinAPI-Forum. Vorausgesetzt wird ein ListView mit sechs Columns, im ViewStyle vsReport.

    //---------------------------------------------------------------------------
    #ifndef UNICODE
    #define UNICODE
    #endif
    
    #include <vcl.h>
    #include <lm.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
      : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      LPSERVER_INFO_101 pBuf = NULL;
      LPSERVER_INFO_101 pTmpBuf;
      DWORD dwLevel = 101;
      DWORD dwPrefMaxLen = -1;
      DWORD dwEntriesRead = 0;
      DWORD dwTotalEntries = 0;
      DWORD dwTotalCount = 0;
      DWORD dwServerType = SV_TYPE_SERVER; // all servers
      DWORD dwResumeHandle = 0;
      NET_API_STATUS nStatus;
      LPTSTR pszServerName = NULL;
      DWORD i;
    
      // Call the NetServerEnum function to retrieve information
      // for all servers, specifying information level 101.
      nStatus = NetServerEnum(pszServerName,
                              dwLevel,
                              (LPBYTE *) &pBuf,
                              dwPrefMaxLen,
                              &dwEntriesRead,
                              &dwTotalEntries,
                              dwServerType,
                              NULL,
                              &dwResumeHandle);
    
      // If the call succeeds,
      if ((nStatus == NERR_Success) || (nStatus == ERROR_MORE_DATA))
      {
        if ((pTmpBuf = pBuf) != NULL)
        {
          // Loop through the entries and
          // print the data for all server types.
          for (i = 0; i < dwEntriesRead; i++)
          {
            TListItem  *ListItem = ListView1->Items->Add();
            ListItem->Caption = pTmpBuf->sv101_name;
            ListItem->SubItems->Add(pTmpBuf->sv101_platform_id);
            ListItem->SubItems->Add(String(pTmpBuf->sv101_version_major) + "." +
                                    String(pTmpBuf->sv101_version_minor));
            ListItem->SubItems->Add(pTmpBuf->sv101_type);
    
            // Check to see if the server is a domain controller;
            // if so, identify it as a PDC or a BDC.
            if (pTmpBuf->sv101_type & SV_TYPE_DOMAIN_CTRL)                
              ListItem->SubItems->Add("PDC");
            else if (pTmpBuf->sv101_type & SV_TYPE_DOMAIN_BAKCTRL)
              ListItem->SubItems->Add("BDC");
    
            ListItem->SubItems->Add(pTmpBuf->sv101_comment);
    
            pTmpBuf++;
            dwTotalCount++;
          }
    
          // Display a warning if all available entries were not enumerated,
          // print the number actually enumerated, and the total number available.
          if (nStatus == ERROR_MORE_DATA)
            Application->MessageBox(("Total entries: " + String(dwTotalEntries)).c_str(),
                                     "More entries available!", MB_OK | MB_ICONSTOP);
    
          Caption = "Entries enumerated: " + String(dwTotalCount);
        }
      }
    
      // Free the allocated buffer.
      if (pBuf)
        NetApiBufferFree(pBuf);
    }
    //---------------------------------------------------------------------------
    

    Im Originalbeitrag wird ausdrücklich darauf hingewiesen die netapi32.lib einzubinden, hier im BCB6 war dies jedoch nicht erforderlich.



  • Ich muss mich leider nochmal melden

    Das alles funktioniert super, hast du prima gemacht Jansen.
    Ist bestimmt für viele Leute genau das Richtige.

    Ich möchte aber nicht dass der Registrierungsname von Windows angezeigt wird sondern der mit dem man sich am System anmeldet.

    DWORD dwSize = 0;
    
    // Determine how many chars we need to store user name
    GetUserName(NULL, &dwSize);
    
    // create a buffer that is big enough
    char *szBuf = new char[dwSize];
    szBuf[0] = '\0';
    
    // Read the user name and place it in a label
    GetUserName(szBuf, &dwSize);
    
    //Hier wird nun in der MessageBox der Anmelde-Name angezeigt. 
    ShowMessage(szBuf);
    

    Kannst du mir noch sagen, wie ich das umändern könnte.



  • GetUserName gibt dir nur den Namen des lokal angemeldeten Users zurück, d.h. für die Maschine, auf der dein Programm läuft.

    Ich bezweifle, dass es eine Möglichkeit gibt, den Rechnernamen per Netz entsprechende User zuzuordnen, zumal die Rechner ja auch dann im Netzwerk auftauchen bzw. sichtbar bleiben, wenn kein Benutzer (mehr) angemeldet ist.

    Wenn überhaupt, dann müsste dein Programm wohl auf dem Domänencontroller laufen (bzw. Zugriff darauf haben) und dort die ActiveDirectory-Strukturen o.ä. auslesen.

    Egal wie, das geht garantiert nicht ohne WinAPI. Da der Thread hier etwas vom Thema abgekommen ist solltest du die Frage im entsprechenden Forum nochmal neu stellen. Der von dir eingangs zitierte Thread dort dreht sich ja auch nicht um die Benutzer- sondern um die Rechnernamen.



  • Ich bekomme im BCB 6 einen Fehler...

    [C++ Fehler] Unit1.cpp(49): E2034 Konvertierung von 'char *' nach 'const wchar_t *' nicht möglich
    [C++ Fehler] Unit1.cpp(49): E2342 Keine Übereinstimmung des Typs beim Parameter 'servername' ('const wchar_t *' erwartet, 'char *' erhalten)
    [C++ Warnung] Unit1.cpp(116): W8004 'pszServerName' wurde ein Wert zugewiesen, der nie verwendet wird

    kann da jemand helfen?



  • Der UNICODE-Abschnitt am Anfang des Beispiels steht nicht nur so zum Spass da ... 😉



  • Danke 🙂
    ich habs auch grad gesehn...

    aber mal ne frage noch

    wie kann ich die verbindung trennen?
    per klick



  • Was denn für'ne Verbindung? Bist du sicher, dass deine Frage irgendetwas mit dem Thema des Threads zu tun hat?



  • 0Bytes schrieb:

    [C++ Fehler] Unit1.cpp(49): E2034 Konvertierung von 'char *' nach 'const wchar_t *' nicht möglich
    [C++ Fehler] Unit1.cpp(49): E2342 Keine Übereinstimmung des Typs beim Parameter 'servername' ('const wchar_t *' erwartet, 'char *' erhalten)

    ich bekomme genau diesen fehler beim c++ builder 09, habe aber den UNICODE beachtet


Anmelden zum Antworten