netapi32.dll - NetUserChangePassword Problem

  • Hallöchen,

    ich habe nun schon einiges probiert, aber ich schaffe es nicht einem Benutzer ein neues Passwort mit Hilfe der netapi32.dll und der Funktion NetUserChangePassword zu geben.

    Der DllCall gibt mir immer den Fehlercode 2221 -> sprich UserNotFound zurück.

    Andere netapi32.dll Funktionen, die mit Benutzern und Gruppen zusammenhängen habe ich schon erfolgreich getestet bzw. programmiert, nur irgendwie hakt es bei der Funktion.

    [autoit]

    Func _NetUserChangePassword($sUsername, $sOldPassword, $sNewPassword)
    Local $tServer = DllStructCreate("wchar[1]")
    Local $tUsername = DllStructCreate("wchar["& StringLen($sUsername)+1 &"]")
    Local $tOldPassword = DllStructCreate("wchar["& StringLen($sOldPassword)+1 &"]")
    Local $tNewPassword = DllStructCreate("wchar["& StringLen($sNewPassword)+1 &"]")

    [/autoit][autoit][/autoit][autoit]

    DllStructSetData($tServer,1,"")
    DllStructSetData($tUsername,1,$sUsername)
    DllStructSetData($tOldPassword,1,$sOldPassword)
    DllStructSetData($tNewPassword,1,$sNewPassword)

    [/autoit][autoit][/autoit][autoit]

    Local $aRet = DllCall("netapi32.dll", "int", "NetUserChangePassword", "ptr", DllStructGetPtr($tServer), "ptr", DllStructGetPtr($tUsername), "ptr", DllStructGetPtr($tOldPassword), "ptr", DllStructGetPtr($tNewPassword))
    If $aRet[0] Then Return SetError(1, $aRet[0], False)
    Return True
    EndFunc

    [/autoit]

    So habe ich es schon probiert und auch so:

    [autoit]

    Func _NetUserChangePassword($sUsername, $sOldPassword, $sNewPassword)
    Local $aRet = DllCall("netapi32.dll", "int", "NetUserChangePassword", "wstr", "", "wstr", $sUsername, "wstr", $sOldPassword, "wstr", $sNewPassword)
    If $aRet[0] Then Return SetError(1, $aRet[0], False)
    Return True
    EndFunc

    [/autoit]

    Der Benutzer existiert und ich kann mich auch einloggen, nur bekomme ich immer die Fehlermeldung, dass der Benutzer angeblich nicht existiert. Mit verschiedenen Benutzern habe ich es auch schon ausprobiert mit genau so wenig Erfolg.

    Vielleicht übersehe ich auch nur einen Fehler.

    Für Hilfe wäre ich sehr dankbar.

    Mfg Hajo

    Einmal editiert, zuletzt von cuteboy (1. August 2009 um 14:22)

  • Du darfst nicht einen NULL-Wert mit einem Leerstring gleichsetzen. NULL bedeutet ein Pointer mit dem Wert 0 ;) Also sollte es so funktionieren:

    [autoit]

    Func _NetUserChangePassword($sDomainname, $sUsername, $sOldPassword, $sNewPassword)
    Local $tpDomain = "wstr", $tpUser = "wstr"
    If $sDomainname = "" Then $tpDomain = "ptr"
    If $sUsername="" Then $tpUser = "ptr"
    Local $aReturn = DllCall("netapi32.dll", "int", "NetUserChangePassword", $tpDomain, $sDomainname, $tpUser, $sUsername, "wstr", $sOldPassword, "wstr", $sNewPassword)
    If @error Then Return SetError(1,0,False)
    Return SetError($aReturn[0], 0, $aReturn[0]=0)
    EndFunc

    [/autoit]
  • Vielen, vielen Dank. ;)

    Hat super funktioniert und werde es mir für die weitere Programmierung merken.

    Hajo