[GELÖST]NetUserAdd auch für lokale Benutzer?



  • Ich habe Problem mit der NetUserAdd Funktion.

    Ich glaube aber ich hab da was falsch verstanden. Ich wollte damit eigentlich Benutzer unter Windows anlegen können. Aber irgendwie funzt. das nicht so richtig.

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {                                 
        USER_INFO_1 user_data;
    
        user_data.usri1_name = L"testuser";
        user_data.usri1_password = L"pw";
        user_data.usri1_priv = USER_PRIV_USER;
        user_data.usri1_home_dir = NULL;
        user_data.usri1_comment = NULL;
        user_data.usri1_flags = UF_NORMAL_ACCOUNT;
        user_data.usri1_script_path = NULL;
    
        NET_API_STATUS status = NetUserAdd(NULL,1,(LPBYTE)&user_data,NULL);
        AnsiString errorcode;
        switch(status)
        {
            case NERR_BadUsername:
                    errorcode = "Bad username";
                    break;
            case ERROR_INVALID_PARAMETER:
                    errorcode = "Invalid Parameter";
                    break;
            case NERR_Success:
                    errorcode = "User was added";
                    break;
            case ERROR_ACCESS_DENIED:
                    errorcode = "The user does not have access to the requested information.";
                    break;
            case NERR_InvalidComputer:
                    errorcode = "The computer name is invalid.";
                    break;
            case NERR_NotPrimary:
                    errorcode = "The operation is allowed only on the primary domain controller of the domain.";
                    break;
            case NERR_GroupExists:
                    errorcode = "The group already exists.";
                    break;
            case NERR_UserExists:
                    errorcode = "The user account already exists.";
                    break;
            case NERR_PasswordTooShort:
                    errorcode = "The password is shorter than required.";
                    break;
            default:
                    errorcode = status;
                    break;
        }
        Label1->Caption = errorcode;
    }
    

    Ich bekomme als Meldung zwar: User was added.
    Und auch wenn ich ihn nochmal anlegen will sagt er mir, dass es den User schon gibt.

    ABER:
    Ich sehe den User nicht in der Benutzerverwaltung. Ist NetUserAdd nur für Netzugriffe??

    Gib es eine Funktion mit dem man ganz normale Benutzer hinzufügen kann??

    Danke schonmal

    MFG
    Ace


  • Mod

    Diese Funktion ist schon richtig. Mit dem NULL Parameter ausgeführt müsste es stimmen. Was sagt den NetUserEnum?



  • USER_INFO_1
    UF_SCRIPT The logon script executed. This value must be set.



  • @coolzero: Versteh ich nicht??

    NetUserEnum spuckt 10 mal den Username AceKiller73 aus, was meinem Hauptbenutzer entspricht, unter dem das Programm ausgeführt wird.

    Wenn ich wieder einen user hinzufüge, wird wieder ein 'AceKiller73' hinzugefügt.

    Ich will aber, dass der Benutzer später in der Windows benutzerverwaltung zu sehen ist.

    MFG
    Ace

    EDIT:\\
    Ich weiß warums net angezeigt wurde.
    Er war net in der Gruppe "Benutzer".

    Nun ist die Frage wie mache ich das?



  • usri1_flags 
    Specifies a DWORD value that determines several features. This member can be one or more of the following values.
    Note that setting user account control flags may require certain privileges and control access rights.
    For more information, see the Remarks section of the NetUserSetInfo function.
    
    Value Meaning 
    UF_SCRIPT The logon script executed. This value must be set.
    

    Das fand ich in der "MS Platform SDK"

    und hier ein Bsp. daraus:

    #ifndef UNICODE
    #define UNICODE
    #endif
    
    #include <stdio.h>
    #include <windows.h> 
    #include <lm.h>
    
    int wmain(int argc, wchar_t *argv[])
    {
       USER_INFO_1 ui;
       DWORD dwLevel = 1;
       DWORD dwError = 0;
       NET_API_STATUS nStatus;
    
       if (argc != 3)
       {
          fwprintf(stderr, L"Usage: %s \\\\ServerName UserName\n", argv[0]);
          exit(1);
       }
       //
       // Set up the USER_INFO_1 structure.
       //  USER_PRIV_USER: name identifies a user, 
       //    rather than an administrator or a guest.
       //  UF_\1: required for LAN Manager 2.0 and
       //    Windows NT and later.
       //
       ui.usri1_name = argv[2];
       ui.usri1_password = argv[2];
       ui.usri1_priv = USER_PRIV_USER;
       ui.usri1_home_dir = NULL;
       ui.usri1_comment = NULL;
       ui.usri1_flags = UF_SCRIPT;
       ui.usri1_script_path = NULL;
       //
       // Call the NetUserAdd function, specifying level 1.
       //
       nStatus = NetUserAdd(argv[1],
                            dwLevel,
                            (LPBYTE)&ui,
                            &dwError);
       //
       // If the call succeeds, inform the user.
       //
       if (nStatus == NERR_Success)
          fwprintf(stderr, L"User %s has been successfully added on %s\n",
                   argv[2], argv[1]);
       //
       // Otherwise, print the system error.
       //
       else
          fprintf(stderr, "A system error has occurred: %d\n", nStatus);
    
       return 0;
    }
    


  • Jojo
    Ne ich hatte des schon gesehen nur habe ich net verstanden warum das mein Prob beeinflusst.

    Wenn ich des ändere hab ich immer noch das gleiche Prob.

    Aber wie ich im Edit geschrieben hab. Ich weiß warum net ging. Das liegt daran, dass der User net in die Gruppe "Benutzer" eingetragen wurde.

    Jetzt wollte ich wissen wie ich ihn genau da eintrage.

    MFG
    Ace



  • hast du bei "usri1_priv = USER_PRIV_USER;" mal die beiden anderen getestet?
    USER_PRIV_GUEST Guest ,USER_PRIV_USER User ,USER_PRIV_ADMIN Administrator



  • Nach dem Erstellen des Benutzers musst du ihn noch einer Gruppe zu weisen mit NetGroupAddUser.



  • Und was ist diese Standart Gruppe, in der der User dann auch im "normalen" Login angezeigt wird.

    In deinem usermanager ist das "Benutzer" aber das Programm sagt, diese Gruppe gäbe es nicht.

    MFG
    Ace

    EDIT:\\
    @coolzero:
    Bei NetUserAdd darf man nur UER_PRIV_USER benutzen



  • Jeder Benutzer egal von welcher Gruppe wird beim Login angezeigt. (Ausgenommen die Systemgruppen wie diese Hilfedienstgruppe usw.)

    AceKiller73 schrieb:

    In deinem usermanager ist das "Benutzer" aber das Programm sagt, diese Gruppe gäbe es nicht.

    Das habe ich jetzt nicht verstanden.



  • In deinem Usermanager gibt es die Gruppe "Benutzer".

    Wenn ich jetzt NetGroupAddUser(..) bei der Gruppe "Benutzer" machen will sagt er mir, dass es die Gruppe nicht gibt.

    MFG
    Ace



  • In deinem Programm? Funktioniert es denn mit meinem Usermanager? Wenn ja, dann machst du noch irgendwas falsch.



  • Wenn ich deinen Usermanager starte, sehe ich eine Gruppe names "Benutzer".

    Wenn ich nun diesen Code ausführe:

    status = NetGroupAddUser(NULL,L"Benutzer",L"testuser3");
    

    Gibt er mir den Fehlercode 2220 zurück, wasbedeutet, dass er die Gruppe nicht gefunden hat.
    Woran kann das liegen?

    MFG
    Ace



  • Benutzt du auch Unicode richtig? Versuch mal NetGroupAddUserW explizit aufzurufen. Oder versuch es mal ohne Unicode.



  • Hmm also hier mal der komplette Quellcode.

    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
        WideString user = "testuser3";
        WideString group = "Benutzer";
        NET_API_STATUS status = NetGroupAddUser(NULL,group,user);
        AnsiString errorcode;
        switch(status)
        {
            case NERR_GroupNotFound:
                    errorcode = "The group name could not be found.";
                    break;
            default:
                    errorcode = status;
                    break;
        }
        Label4->Caption=errorcode;
    }
    

    Wenn ich versuche das ganze mit normalen char* aufgzurufen, sagt er mir er bräuchte wchar_t.
    NetGroupAddUserW findet er nicht.
    Aber in der MSDN steht was von wegen man könnte unicode ausschalten oder so...

    MFG
    Ace



  • WideString ist ein VCL Datentyp. Damit können Windows-API Funktionen nichts anfangen. Nimm statt dessen mal ein PWideChar oder gleich die Windows Datentypen LPTSTR.



  • Hmm also es funzt. nicht egal wie ichs drehe.

    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
        PWideChar user = (PWideChar)"testuser3";
        PWideChar group =(PWideChar)"Benutzer";
        NET_API_STATUS status = NetGroupAddUser(NULL,group,user);
        AnsiString errorcode;
        switch(status)
        {
            case NERR_GroupNotFound:
                    errorcode = "The group name could not be found.";
                    break;
            default:
                    errorcode = status;
                    break;
        }
        Label4->Caption=errorcode;
    }
    

    Ich bitte euch zwar nur ungern, aber könnte vllt jemand einen Code posten, der 100% bei ihm funktioniert? Also nen kompletten Code.

    Irgendwas mach ich total falsch. Die Fehlermeldung ist weiterhin:
    Group not found.

    testuser3 habe ich so hinzugefügt:

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        USER_INFO_1 user_data;
    
        user_data.usri1_name = L"testuser3";
        user_data.usri1_password = L"pw";
        user_data.usri1_priv = USER_PRIV_USER;
        user_data.usri1_home_dir = NULL;
        user_data.usri1_comment = NULL;
        user_data.usri1_flags = UF_SCRIPT;
        user_data.usri1_script_path = NULL;
    
        NET_API_STATUS status = NetUserAdd(NULL,1,(LPBYTE)&user_data,NULL);
        AnsiString errorcode;
        switch(status)
        {
            case NERR_BadUsername:
                    errorcode = "Bad username";
                    break;
            case ERROR_INVALID_PARAMETER:
                    errorcode = "Invalid Parameter";
                    break;
            case NERR_Success:
                    errorcode = "User was added";
                    break;
            case ERROR_ACCESS_DENIED:
                    errorcode = "The user does not have access to the requested information.";
                    break;
            case NERR_InvalidComputer:
                    errorcode = "The computer name is invalid.";
                    break;
            case NERR_NotPrimary:
                    errorcode = "The operation is allowed only on the primary domain controller of the domain.";
                    break;
            case NERR_GroupExists:
                    errorcode = "The group already exists.";
                    break;
            case NERR_UserExists:
                    errorcode = "The user account already exists.";
                    break;
            case NERR_PasswordTooShort:
                    errorcode = "The password is shorter than required.";
                    break;
            default:
                    errorcode = status;
                    break;
        }
        Label1->Caption = errorcode;
    }
    

    Könnte also vllt jemand nen Code posten, wo ein User hinzugefügt und einer Gruppe hinzugefügtwird?

    MFG
    Ace



  • Grudnregel: Wenn man casten muss, ist i.d.R. oft was falsch....
    Und Dein cast bei

    PWideChar user = (PWideChar)"testuser3";
    

    sieht sehr gefährlich aus...



  • ich kann das ganze ja auch mit wchar_t* machen, aber da müsste ich ja auch casten.

    Ich muss bei diesem verdamm... unicode sowieso immer casten.

    Naja wie gesagt ein beispiel code würde mir helfen.

    MFG
    Ace

    trotzdem danke für die vielen antowrten



  • Hmm ich push das ganze hier nochmal.

    Ich habs immer noch nicht hinbekommen.
    Und ich weiß echt nicht mehr worans liegen könnte.

    Wäre echt nett wenn jemand nen kurzen funktionierenden Code postet, bei dem ein User geaddet und einer Gruppe hinzugefügt wird.

    MFG
    Ace


Anmelden zum Antworten