Rückgabewert von CreateProcessWithLogonW und GetLastError



  • Ich habe hier ein dummes Problem. Erstmal der Code:

    if not CreateProcessAsLogon(User, PW, Filename, Params)then
      begin
        MessageBox(hDlg, PChar(SysErrorMessage(GetLastError)), APPNAME, MB_ICONSTOP);
        // ExitCode: ID_CANCEL -> don't close main window
        ExitCode := ID_CANCEL;
      end
      else
        // ExitCode: ID_OK -> close main window
      ExitCode := ID_OK;
    end
    

    CreateProcessAsLogon sieht so aus:

    function CreateProcessAsLogon(const User, PW, Application, CmdLine: WideString):
      LongBool;
    var
      si           : TStartupInfoW;
      pif          : TProcessInformation;
    begin
      ZeroMemory(@si, sizeof(TStartupInfo));
      si.cb := SizeOf(TStartupInfoW);
      si.dwFlags := STARTF_USESHOWWINDOW;
      si.wShowWindow := 1;
      Result := CreateProcessWithLogonW(PWideChar(User), nil, PWideChar(PW),
        LOGON_WITH_PROFILE, nil, PWideChar(Application + ' ' + CmdLine),
        CREATE_DEFAULT_ERROR_MODE, nil, nil, si, pif);
    end;
    

    Ich weiß, das ist Delphi Code, aber die API ist ja die gleiche. Da mir bisher in einem Delphi Forum nicht geholfen werden konnte, wollte ich hier mal nachfragen.

    Nun das Problem: Übergebe ich ein falsches Passwort, gibt die Funktion auch brav false zurück. Entsprechend geht der Code in den False-Zweig und die Messagebox erscheint. Schön, wenn da in der Messagebox nicht stünde, dass der Vorgang erfolgreich beendet wurde, was ja nun nicht stimmt. 😕
    Weiß jemand, was da falsch läuft? Also warum GetLastError 0 ist?



  • Wenn du hier keine Antwort bekommst frag in der Newsgroup microsoft.public.platformsdk.security oder http://www.winapi.net/forum/



  • Danke, werde ich machen.



  • Ich habe versucht das Ganze in C++ nachzubauen und es hat auch geklappt. 👍

    Wenn ich einen falschen Benutzername oder Passwort eingebe dann liefert bei mir CreateProcessWithLogonW 0 zurück und GetLastError ist 1326 (Anmeldung fehlgeschlagen: unbekannter Benutzername oder falsches Kennwort.).

    WinXP SP2



  • Erst mal danke für deine Mühe. Könntest du mir mal bitte deinen Code zeigen?



  • Jau, kann ich machen.

    #define _WIN32_WINNT 0x0500
    
    #include <windows.h>
    #include <iostream>
    
    int main()
    {
    	STARTUPINFOW startupInfo;
    	ZeroMemory(&startupInfo, sizeof(STARTUPINFOW));
    	startupInfo.cb = sizeof(STARTUPINFOW);
    	startupInfo.dwFlags = STARTF_USESHOWWINDOW;
    	startupInfo.wShowWindow = SW_SHOWNORMAL;
    
    	PROCESS_INFORMATION processInformation;
    
    	WCHAR commandLine[MAX_PATH];
    	lstrcpyW(commandLine, L"C:\\test.exe");
    
    	BOOL ret = CreateProcessWithLogonW(L"Administrator",
    									   NULL,
    									   L"xxx",
    									   LOGON_WITH_PROFILE,
    									   NULL,
    									   commandLine,
    									   CREATE_DEFAULT_ERROR_MODE,
    									   NULL,
    									   NULL,
    									   &startupInfo,
    									   &processInformation);
    
    	if(ret)
    	{
    		std::cout << "CreateProcessWithLogonW succeed!" << std::endl;
    	}
    	else
    	{
    		std::cout << "CreateProcessWithLogonW failed! " << GetLastError() << std::endl;
    	}
    }
    

    Du kannst ja auch mal dein Programm hochladen, dann kann ich das mal testen was bei mir für ein GetLastError Wert kommt.



  • Danke. Kannst du Delphi bzw. hast einen Delphi Compiler zur Verfügung? Dann kannst du es dir hier: http://runasuser.luckie-online.de mit Quellcode runterladen. Zur Zeit kommt in der Version noch eine eigene Messagebox - logisch konnte ich ja nicht so lassen. 😉

    OS ist bei mir übrigens Windows2000 SP4.



  • Leider hab und kann ich kein Delphi.

    Kannst du nicht kurz eine Version erstellen die in der MessageBox die GetLastError Nummer oder den Text ausgibt?

    Konntest du meinen Code bei dir testen? Wenn ja wie war das Ergenis?



  • Ja mache ich gleich (Deinen Code testen und meinen anpassen und hochladen).



  • So: Hier die Version mit getLastError: http://www.luckie-online.de/Ablage/

    Deinen Code teste ich gleich mal. Muss nur erst das VC anschmeißen und mich da wieder durchfuchsen.



  • Habs probiert. Bei mir wird "Der Vorgang wurde erfolgreich beendet" ausgegeben, wenn ich ein falsches Passwort eingebe.

    Also muss es doch an deinem Code liegen, obwohl ich keinen Unterschied zu meinem erkennen kann. 🙄



  • Hmpf. Ich auch nicht. das ist es ja. Aber deinen bekomme ich nicht zum Laufen. Ich habe eine Konsolen anwendung erstellt und deinen Code kopiert:

    e:\c\programme\beispiel - demos\runasuser\runasuser.cpp(19) : error C2065: 'CreateProcessWithLogonW' : nichtdeklarierter Bezeichner
    e:\c\programme\beispiel - demos\runasuser\runasuser.cpp(22) : error C2065: 'LOGON_WITH_PROFILE' : nichtdeklarierter Bezeichner
    e:\c\programme\beispiel - demos\runasuser\runasuser.cpp(39) : warning C4508: 'main' : Funktion sollte einen Wert zurueckgeben; Ergebnistyp 'void' angenommen
    

    Die Header-Dateien sind allerdings noch die alten vom VC 6. Und die nötigen Libs habe ich eingebunden. Schickst du mir einfach mal die Exe bitte? Oder das komplette Projekt? wäre nett von dir. Danke. Mail Adresse auf meiner Homepage im Copyright.



  • So, ein Freund hat den Fehler gefunden:
    http://www.delphipraxis.net/post306577.html#306577


Anmelden zum Antworten