NetUserChangePassword (da geht es, dort nicht)



  • Hallo.

    Hich habe mir ein kleines Programm geschrieben, welches auf Knopfdruck das Passwort eines Benutzers ändern kann/können soll.
    Soweit funktioniert es auch.
    Jetzt habe ich jedoch festgestellt das das gleiche Programm auf einem Rechner richtig läuft, und auf dem anderen wiederum nicht.

    Beides sind:
    - Win XP Professional SP3
    - Gleicher User
    - gleiche Rechte
    - gleiches Passwort

    hier ist mein code:

    m_bMsgBoxActive = true;
    ...
    int CChangePWDlg::ChangeWindowsPassword()
    {
    	NET_API_STATUS result;
    
    	// Server == localhost == 127.0.0.1
    	wchar_t *ServerName = L"\\\\127.0.0.1";		
    	// Benutzername
    	wchar_t *UserName = L"User";
    	// altes Passwort
    	wchar_t *OldPassword = L"dasaltepw";	// <--- hier das alte Passwort eintragen (siehe "NewPassword")
    	// neues Passwort
    	wchar_t *NewPassword = L"dasneuepw";	 // <--- hier das neue Passwort eintragen
    
    	result = NetUserChangePassword(ServerName,UserName,OldPassword,NewPassword);
    
    	switch(result)
    	{
    		case NERR_Success:
    			if(m_bMsgBoxActive == true) AfxMessageBox("Erfolgreich");
    			return(0);
    
    		case ERROR_ACCESS_DENIED:
    			if(m_bMsgBoxActive == true) AfxMessageBox("Zugrifff verweigert");
    			return(101); 
    
    		case ERROR_INVALID_PASSWORD:
    			if(m_bMsgBoxActive == true) AfxMessageBox("Falsches Passwort");
    			return(102);
    
    		case NERR_InvalidComputer:
    			if(m_bMsgBoxActive == true) AfxMessageBox("Der Computername ist falsch");
    			return(103);
    
    		case NERR_NotPrimary:
    			if(m_bMsgBoxActive == true) AfxMessageBox("NERR_NotPrimary");
    			return(104);
    
    		case NERR_UserNotFound:
    			if(m_bMsgBoxActive == true) AfxMessageBox("Benutzername nicht gefunden");
    			return(105);
    
    		case NERR_PasswordTooShort :
    			if(m_bMsgBoxActive == true) AfxMessageBox("Passwort zu kurz");
    			return(106);
    
    		default:
    			if(m_bMsgBoxActive == true) AfxMessageBox("Unbekannt");
    			return(99);
    
    	}
    
    	return -1;
    }
    

    Bei dem funktionierendem System bekomme ich die Meldung "Erfolgreich", und das Passwort wurde tatsächlich gesetzt.
    Beim anderen bekomme ich immer"Zugrifff verweigert".

    Kann sich einer erklären woran das liegt ?



  • Du hast einfach nicht die nötigen Rechte. Das ist wohl alles..code hab ich nicht angeschaut.

    Edit: Dein Problem ist wohl eher der erste Parameter. Ich würde hier NULL verwenden.



  • Klasse, vielen Dank -lowbyte- , so geht es tatsächlich.

    Was kann denn das Problem sein? Firewall ist es nicht, da ich diese zwischenzeitlich auch aus hatte.

    NTFS Berechitgungen ?

    **
    EDIT:**
    Oh man, tatsächlich.
    Wenn ich in den Ordneroptionen das Häckchen bei "einfache Ordnerfreigabe verwenden" abwähle, geht es auch mit meiner alten Variante.
    Mit NULL gefällt mir besser, aber dennoch hätte ich gern eine Erklätung und eine Möglichkeit dies zu umgehen.
    Was müsste ich dafür im Quellcode ändern ?



  • Dein Process verfügt nicht über das SE_CHANGE_NOTIFY_NAME privilege. Steht alles bei msdn!



  • Ich ging davon aus das ein Ausführen als Admin reicht, aber dem ist wohl nicht so.

    Ich schau mir das mal genau an.

    Vielen Dank dir nochmal.


  • Mod

    Man muss natürlich kein Admin sein.
    Jeder angemeldete User kann sein Kennwort ändern, wenn er sein altes weißt.



  • In meinem Fall wird das Tool als Admin ausgeführt, und das Password eines Benutzers geändert.
    Wenn ich die MSDN bisher richtig verstanden habe, ist dafür tatsächlich das "SE_CHANGE_NOTIFY_NAME privilege" notwendig.

    Wenn ich das Problem gelöst habe, werde ich den kompletten Code Posten 😉



  • Martin Richter schrieb:

    Man muss natürlich kein Admin sein.
    Jeder angemeldete User kann sein Kennwort ändern, wenn er sein altes weißt.

    Kann man mit NetUserChangePassword() das Passwort auch ändern ohne das alte zu kennen ?

    Mit net user geht das auf der console auch ohne altes Passwort.

    Wie bekommt man das mit WinAPI hin ?



  • Schon geklärt.

    Wen es interessiert:

    Setting the User Password, Level 1003
    http://msdn.microsoft.com/en-us/library/windows/desktop/aa370251.aspx


Anmelden zum Antworten