![]() |
Rückgabewert von CreateProcessWithLogonW und GetLastError
Ich habe hier ein dummes Problem. Erstmal der Code:
Delphi-Quellcode:
CreateProcessAsLogon sieht so aus:
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
Delphi-Quellcode:
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. :gruebel:
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; Weiß jemand, was da falsch läuft? Also warum GetLastError 0 ist? |
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Ich würde mal auf Absicht tippen...
Nehmen wir an du hast ein Programm was das Passwort knacken will... Wenn es keinen "Fehler-Wert" bei falschem Passwort bekommt, kann man an der Stelle keine "Try and Error" Methode anwenden.. Nur so als Idee, man korrigiere mich, wenn ich daneben liege :) |
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Dann dürfte die Funktion aber auch kein False zurückliefern.
|
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Ich habe das Programm jetzt erstmal mit einer eigenen Fehlermeldung veröffentlicht:
![]() |
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Hi,
was sagt denn das MSDN dazu? Steht dort, dass man den Fehler mit GetLastError bestimmen kann? mfG mirage228 |
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Zitat:
Liefert GetLastError korrekte Fehlercodes bei anderen Fehlern (zB nicht existierender User)? Wenn ja könnte man im Fall von CreateProcessWithLogonW = False + GetLastError = 0 eine eigene Überprüfung des Passwortes per SSPI durchführen und eventuell eine entsprechende Fehlermeldung ausgeben... |
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
So dieser Code
Code:
(Quelle:
#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:\\winnt\\notepad.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; } } ![]() tut es unter Windows XP SP2 korrekt: Zitat:
|
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Was ist denn der Preis? Sehe ich das richtig: Wenn ein falsches Passwort angegeben wird, soll die besagte Meldung kommen? Dann geht´s bei mir. 8)
Edit: Mit Delphi natürlich! |
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Reicht ein feuchter Händedruck? ;)
|
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Feucht auch noch. :shock: Tja, keine Ahnung. Ich habe nur Delphi 5 und musste den ganzen Plunder daher selbst deklarieren, aber ich sehe die gewünschte Fehlermeldung, weil "xxx" natürlich nicht mein Admin-Kennwort ist. Hier der Code (die "DisplayErrorMsg"-Prozedur müsstest du kennen)
Delphi-Quellcode:
Das Test-OS war XP SP2.
type
_STARTUPINFOW = record cb: DWORD; lpReserved: Pointer; lpDesktop: Pointer; lpTitle: Pointer; dwX: DWORD; dwY: DWORD; dwXSize: DWORD; dwYSize: DWORD; dwXCountChars: DWORD; dwYCountChars: DWORD; dwFillAttribute: DWORD; dwFlags: DWORD; wShowWindow: Word; cbReserved2: Word; lpReserved2: PByte; hStdInput: THandle; hStdOutput: THandle; hStdError: THandle; end; TStartUpInfoW = _STARTUPINFOW; PStartUpInfoW = ^_STARTUPINFOW; const LOGON_WITH_PROFILE = $00000001; function CreateProcessWithLogonW(lpUsername, lpDomain, lpPassword: PWideChar; dwLogonFlags: dword; lpApplicationName, lpCommandLine: PWideChar; dwCreationFlags: dword; lpEnvironment: pointer; lpCurrentDirectory: PWideChar; lpStartupInfo: PStartUpInfoW; lpProcessInfo: PProcessInformation): boolean; stdcall; external 'advapi32.dll'; procedure DisplayErrorMsg(wnd: HWND); var buf : array[0..MAX_PATH]of char; begin ZeroMemory (@buf,sizeof(buf)); FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,nil,GetLastError,0,buf, sizeof(buf),nil); MessageBox (wnd,buf,nil,MB_OK or MB_ICONSTOP); end; procedure TForm1.Button1Click(Sender: TObject); var si : TStartupInfoW; pif : TProcessInformation; res : boolean; begin ZeroMemory(@si,sizeof(si)); si.cb := sizeof(si); si.dwFlags := STARTF_USESHOWWINDOW; si.wShowWindow := 1; res := CreateProcessWithLogonW('Administrator',nil, 'xxx',LOGON_WITH_PROFILE,nil, 'rollup.exe', CREATE_DEFAULT_ERROR_MODE,nil,nil,@si,@pif); if(not res) then DisplayErrorMsg(self.Handle); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz