Benutzer ausgeben



  • Hallo,

    also eine Suche über das Forum nach der Funktion: NetUserEnum hat leider nicht allzu viel ergeben.
    Ziel meiner Funktion soll es sein alle Benutzer, die sich an einem PC angemeldet haben/unter deren Benutzerkontext ein Dienst läuft auszugeben und deren Verwaltungsrechte auf dem PC auszugeben.
    Soweit so gut, aktuell benutze ich "NetUserEnum" als Funktion um dieses ziel zu erreichen. Das funktioniert auch, nur leider zeigt es mir nur die Nutzer an, die das System lokal hat. Nicht die, die sich über die Domäne anmelden (unter anderem mich selbst auch nicht). Müsste ich für die Domönen nutzer zusätzlich den Domain Controller als Server angeben? Wenn ja, in welcher Form? Ich habe es ausprobiert mit "DC.domain" das hat mir kein Ergebnis geliefert. Brauche dazu dann spezielle rechte?
    Hier noch der aktuelle Code:

    std::string SystemInformation::getUsers()
    {
        std::stringstream output;
        LPUSER_INFO_2 userInfo = NULL;
        LPUSER_INFO_2 userTempInfo;
        DWORD level = 2;
        DWORD filter = 0;
        DWORD prefMaxLength = MAX_PREFERRED_LENGTH;
        DWORD entriesRead = 0;
        DWORD totalentries = 0;
        DWORD resume_handle = 0;
        std::wstring userName;
        NET_API_STATUS nStatus;
        Globalstatics converter; //dient zur Konvertierung von std::wstring zu std::string und umgekehrt
    
        output << std::left << std::setw(50) << "User:" << std::setw(20) << "Privileges" << std::endl;
        do
        {
            nStatus = NetUserEnum(NULL, level, filter,(LPBYTE*) &userInfo, prefMaxLength, &entriesRead, &totalentries, &resume_handle); //hier anstelle von NULL L"domainName.domain" eingesetzt und kein ergebnis erhalten
            if ((nStatus == NERR_Success) || (nStatus == ERROR_MORE_DATA))
            {
                if ((userTempInfo = userInfo) != NULL)
                {
                    for (unsigned int i = 0; i < entriesRead; ++i)
                    {
                        if (userTempInfo == NULL)
                        {
                            output << "An access violation has occured" << std::endl;
                            break;
                        }
                        userName = userTempInfo->usri2_name;
                        output << std::left << std::setw(50) << converter.wStringToString(userName) << std::setw(20) << userTempInfo->usri2_priv << std::endl;
    
                        userTempInfo++;
                    }
                }
            }
            else
            {
                output << "An error occured" << std::endl;
            }
        }
        while (nStatus == ERROR_MORE_DATA);
    
        NetApiBufferFree(userInfo);
    
        return output.str();
    }
    

    Ich weiß, dass ich noch eine Fallunterscheidung für die Privileges machen muss, damit es vernünftig angezeigt wird und ich muss auch die Fehlerbehandlung noch erweitern. Also darüber jetzt nicht meckern, das ist auf der toDo liste. Ich woltle nur erst einmal wissen wie ich alle Benutzer bekommen kann.
    Achja, wenn ich statt

    userName = userTempInfo->usri2_name;
    

    die Eigenschaft

    username = userTempInfo->usri2_full_name;
    

    benutzt habe, war meine Tabelle auch leer. Was ist der Unterschied zwischen dem FullName und dem Namen?

    Vielen Dank

    Khali



  • Hallo,
    ich habe inzwischen weiter programmiert, komme mit den Lokalen Nutzern an der Stelle aus, ansonsten müsste man wohl tatsächlich den DC angeben mit \\DCNAME. Mit diesem kann man dann die User durchgehen.
    Für meine Anwendung reichte es am Ende aber, einen Benutzer anzugeben und dessen Gruppenzugehörigkeiten zu ermitteln.
    Dies funktioniert über eine Kombination von NetGetDCName, sowie NetUserGetGroups und NetUserGetLocalGroups. Das funktioniert soweit, was ich leider nicht testen konnte, ist ob ich damit auch universelle Gruppenmitgliedschaften heraus bekomme oder nicht. Vom Prinzip her sollte das nicht funktionieren, es gibt aber auch keine Net Funktion dafür, zumindest habe ich in der MSDN keine gefunden.

    Mit freundlichen Grüßen


Log in to reply