![]() |
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; |
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Hmpf. Mit einem leeren Projekt geht es. Füge ich den Code bei mir ein, bekomme ich nach der Passwort Eingabe einen RunTime Error 216 (AccessViolation). Die Deklaraition von _STARTUPINFOW = record habe ich so auch übernommen.
TProcessInformation sieht bei mir so aus:
Delphi-Quellcode:
Das sollte aber passen.
TProcessInformation = record
hProcess: THandle; hThread: THandle; dwProcessId: DWORD; dwThreadId: DWORD; end; PProcessInformation = ^TProcessInformation; |
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Wenn du willst kann ichs mir morgen nochmal genauer anschaun.. jetzt muss ich erstmal zur Geburtstagsfeier meiner "Schwiegermama".. ;)
|
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Liste der Anhänge anzeigen (Anzahl: 1)
So der 216'er ist weg. Aber jetzt bekomme ich wieder "Vorgang wurde erfolgreich abgeschlossen" bei falschen Passwort. Ich werde noch mal wahnsinnig. :wall:
Wenn da mal bitte jemand draufgucken könnte? Ich sehe es einfach nicht. Sourcen im Anhang. Die Deklarationen sind in MpuWinNT.pas und der Code, um den es geht in RunDlg.pas. |
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Also, halte mir bitte zugute, dass ich heute das erste Mal mit dieser Funktion gearbeitet habe. Darum fiel mir ein Problem vorher gar nicht auf. :oops: Aber egal, jetzt will ich mich erst mal im Glanz meines Wissens sonnen 8).
Also, ein Problem liegt daran, dass du Programm und Parameter mit Leerzeichen verbindest. An sich kein Problem, und wenn ich die Dateinamen und Parameter direkt als String vorgebe (s. wie oben in meinem Beispiel), dann klappt das sogar. Ich hätte es also erst mal auf ein Problem beim Typecast von Widestring -> PWideChar geschoben. Nach näherer Betrachtung der Deklaration im PSDK schlage ich aber vor, du machst es einfach so:
Delphi-Quellcode:
Ich meine, die werden sich schon was dabei gedacht haben, die Parameter als "lpApplicationName" und "lpCommandLine" zu bezeichnen. :mrgreen:
result := CreateProcessWithLogonW(PWideChar(User), nil, PWideChar(PW),
LOGON_WITH_PROFILE, { --> } PWideChar(Application), PWideChar(CmdLine), { <-- } CREATE_DEFAULT_ERROR_MODE, nil, nil, @si, @pif); Edit: Könnte sein, dass ich das Wort "Problem" zu oft benutzt habe :zwinker: |
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
:angel: :hello: :love: :firejump: :drunken: :duck:
Edit: Zu früh gefreut, jetzt beachtet er den Parameter nicht mehr. :cry: |
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Erst will ich meinen feuchten Händedruck, dann schaue ich´s mir vielleicht noch mal an ...
|
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
hände ableck und drückt
Ich habe eine Managment Konsole (mmc.exe) der über gebe ich eine Konsole (D:\Einstellungen\Konsole.msc), nur öffnet er mir die mmc.exe jetzt immer leer. Ich glaube deswegen habe ich auch Programm und Parameter zusammen beo lpApplication angegeben. |
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Ich habe zwar keine Ahnung, was ich hier eigentlich mache :oops:, aber du hast Recht. Ich habe gerade mal ein Programm mit Parameter gestartet, und es funktionierte nicht. Normalerweise hätte der ungültige Parameter eine entsprechende Syntaxmeldung zum Vorschein bringen müssen.
Nun kann das aber in meinem Fall auch daran gelegen haben, dass ich einen langen Dateinamen hatte. Und da steht im PSDK: Anführungszeichen
Delphi-Quellcode:
Jetzt entspricht es wieder dem Muster vom Anfang, und es funktionierte bei mir sogar. Nein, jetzt kommt wieder die Meldung "Vorgang wurde erfolgreich ausgeführt", trotz falschem Passwort. Hm ... :?
result := CreateProcessWithLogonW(PWideChar(User), nil, PWideChar(PW),
LOGON_WITH_PROFILE, nil, pwidechar('"' + Application + '" ' + CmdLine), CREATE_DEFAULT_ERROR_MODE, nil, nil, @si, @pif); |
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Wir sind wieder am Anfang. Jetzt startet er die Anwnednug wieder korrekt, aber bei falschen Passwort habe ich wieder:
Zitat:
|
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Tja, warum auch immer, aber es hat was mit dem Typecast zu tun:
Delphi-Quellcode:
Wenn ich nämlich das Programm und den falschen Parameter fest eintrage, dann funktioniert es wie es soll: Mit richtigem Passwort kommt die Fehlermeldung wg. Syntax (der Parameter wird also berücksichtigt), und mit falschem Passwort kommt die Meldung "Unbekannter Benutzer oder Passwort".
pwidecar(Application + ' ' + CmdLine)
In der Richtung solltest du also mal weiter forschen. Reagiert das C-Programm eigentlich immer richtig? Mit und ohne Parameter, meine ich. |
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Die Exe schon, leider habe ich es noch nicht geschafft es zu kompilieren.
|
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Hm meine Versuche sehen jetzt so aus:
Delphi-Quellcode:
Anwendungen lassen sich mit und ohne Parameter starten, aber es kommt eine AV. Die Parameter werden als PWideChar(WideString(User)) übergeben.
function CreateProcessAsLogon(const User, PW, Application, CmdLine: PWideChar):
LongBool; var si : TStartupInfoW; pif : TProcessInformation; AppCmdLine : PWideChar; begin GetMem(AppCmdLine, length(Application) + length(CmdLine) + 3); try lstrcpyW(AppCmdLine, Application); lstrcatW(AppCmdLine, ' "'); lstrcatW(AppCmdLine, CmdLine); lstrcatW(AppCmdLine, '"'); ZeroMemory(@si, sizeof(si)); si.cb := sizeof(si); si.dwFlags := STARTF_USESHOWWINDOW; si.wShowWindow := 1; result := CreateProcessWithLogonW(User, nil, PW, LOGON_WITH_PROFILE, nil, AppCmdLine, CREATE_DEFAULT_ERROR_MODE, nil, nil, @si, @pif); finally FreeMem(AppCmdLine); end; end; Dann noch das:
Delphi-Quellcode:
Die Parameter werden ungecastet als Stringsübergeben. Da bekomme ich auch Anwendungen mit und ohne Parameter gestartet, aber bei falschen Passwort habe ich wieder GetLastError = 0:
function CreateProcessAsLogon(const User, PW, Application, CmdLine: WideString):
LongBool; var si : TStartupInfoW; pif : TProcessInformation; //AppCmdLine : PWideChar; begin // GetMem(AppCmdLine, length(Application) + length(CmdLine) + 3); try // lstrcpyW(AppCmdLine, Application); // lstrcatW(AppCmdLine, ' "'); // lstrcatW(AppCmdLine, CmdLine); // lstrcatW(AppCmdLine, '"'); ZeroMemory(@si, sizeof(si)); si.cb := sizeof(si); 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); finally // FreeMem(AppCmdLine); end; end; Noch ein Versuch:
Delphi-Quellcode:
False und GetLastError = 0.
function CreateProcessAsLogon(const User, PW, Application, CmdLine: WideString):
LongBool; var si : TStartupInfoW; pif : TProcessInformation; WUser : WideString; WPW : WideString; WApp : WideString; WCmdLine : WideString; begin ZeroMemory(@si, sizeof(si)); si.cb := sizeof(si); si.dwFlags := STARTF_USESHOWWINDOW; si.wShowWindow := 1; WUser := User; WPW := PW; WApp := Application; WCmdLine := CmdLine; result := CreateProcessWithLogonW(PWideChar(WUser), nil, PWideChar(WPW), LOGON_WITH_PROFILE, nil, PWideChar(WApp + ' "' + WCmdLine + '"'), CREATE_DEFAULT_ERROR_MODE, nil, nil, @si, @pif); end; Nächster Versuch:
Delphi-Quellcode:
False und GetLastError = 0. Bei Anwendungen mit Paramtern komt eine AV nach dem Start.
function CreateProcessAsLogon(const User, PW, Application, CmdLine: PWideChar):
LongBool; var si : TStartupInfoW; pif : TProcessInformation; WUser : LPWSTR; WPW : LPWSTR; WApp : LPWSTR; WCmdLine : LPWSTR; AppCmd: LPWSTR; begin ZeroMemory(@si, sizeof(si)); si.cb := sizeof(si); si.dwFlags := STARTF_USESHOWWINDOW; si.wShowWindow := 1; WUser := SysAllocString(User); WPW := SysAllocString(PW); WApp := SysAllocString(Application); WCmdLine := SysAllocString(CmdLine); GetMem(AppCmd, length(Application)+length(CmdLine)+3); lstrcpyW(AppCmd, WApp); lstrcatW(AppCmd, ' "'); lstrcatW(AppCmd, CmdLine); lstrcatW(AppCmd, '"'); result := CreateProcessWithLogonW(PWideChar(WUser), nil, PWideChar(WPW), LOGON_WITH_PROFILE, nil, AppCmd, CREATE_DEFAULT_ERROR_MODE, nil, nil, @si, @pif); end; |
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Also folgendes funktioniert bei mir:
Delphi-Quellcode:
Mit Parameter, mit ohne Parameter, mit falschen Passwrt, mit richtigem Passwort, Username, immer das erwartete Ergebnis.
function CreateProcessAsLogon(const User, PW, Application, CmdLine: WideString):
LongBool; var si : TStartupInfoW; pif : TProcessInformation; WUser : WideString; WPW : WideString; WApp : WideString; WCmdLine : WideString; begin ZeroMemory(@si, sizeof(si)); si.cb := sizeof(si); si.dwFlags := STARTF_USESHOWWINDOW; si.wShowWindow := 1; WUser := User; WPW := PW; WApp := Application; WCmdLine := CmdLine; result := CreateProcessWithLogonW(PWideChar(WUser), nil, PWideChar(WPW), LOGON_WITH_PROFILE, PWideChar(WApp), PWideChar(WCmdLine), CREATE_DEFAULT_ERROR_MODE, nil, nil, @si, @pif); if not result then MessageBox(0, PChar(SysErrorMessage(GetLastError)), 'Testanwendung', MB_ICONSTOP); end; procedure TForm1.Button1Click(Sender: TObject); var User, PW, Filename, Params: WideString; begin User := Edit1.Text; PW := Edit2.Text; Filename := Edit3.Text; Params := Edit4.Text; CreateProcessAsLogon(User, PW, Filename, Params) end; Das geniale ist aber, folgender Code:
Delphi-Quellcode:
führt zu GetLastError = 0.
function CreateProcessAsLogon(const User, PW, Application, CmdLine: WideString):
LongBool; var si : TStartupInfoW; pif : TProcessInformation; WUser : WideString; WPW : WideString; WApp : WideString; WCmdLine : WideString; begin ZeroMemory(@si, sizeof(si)); si.cb := sizeof(si); si.dwFlags := STARTF_USESHOWWINDOW; si.wShowWindow := 1; WUser := User; WPW := PW; WApp := Application; WCmdLine := CmdLine; result := CreateProcessWithLogonW(PWideChar(WUser), nil, PWideChar(WPW), LOGON_WITH_PROFILE, PWideChar(WApp), PWideChar(WCmdLine), CREATE_DEFAULT_ERROR_MODE, nil, nil, @si, @pif); end; procedure TForm1.Button1Click(Sender: TObject); var User, PW, Filename, Params: WideString; begin User := Edit1.Text; PW := Edit2.Text; Filename := Edit3.Text; Params := Edit4.Text; SetLastError(0); if not CreateProcessAsLogon(User, PW, Filename, Params)then MessageBox(0, PChar(SysErrorMessage(GetLastError)), '', MB_ICONSTOP); end; Dem bin ich mal nachgegangen, und das ganze scheint sich tief in der Laufzeitumgebung abzuspielen und - oh wunder - alles andere als dokumentiert zu sein. Vor dem Austritt aus der Funktion ruft der Compiler WStrArrayClr() aus der Borland-RTL auf. Die wiederum ruft SysFreeString aus Microsofts OleAuto32.dll auf (deren Funktioenen in D6 übrigens nur unvollständig implementiert sind, und in der Personal anscheinend noch unvollständiger). Diese ist eigentlich dazu da, einen String wieder freizugeben. Das erstaunliche aber ist, daß sie gleichzeitig den Wert von GetLastError() ändert, und zwar ohne daß das mit nur einem Wort im SDK erwähnt wird. Wenn du GetLastError() vor dem Funktionsaustritt aufrufst, hat der Compiler noch nicht versucht die Widestrings wieder freizugeben, folglich wurde SysFreeString() noch nicht aufgerufen und der Wert von GetLastError stimmt noch. So wie es aussieht musst du also entweder einen variablen Parameter für den Fehlerwert einführen, oder anstatt eines Boolean-Ergebnisses einen Integer mit dem Wert von GetLastError() nehmen. Ich denke, daß folgender Code es auch tun würde:
Delphi-Quellcode:
Macht den Code kürzer und spart immerhin das Rumreferenziere der Strings ;-)
function CreateProcessAsLogon(const User, PW, Application, CmdLine: WideString):
LongBool; var si : TStartupInfoW; pif : TProcessInformation; begin ZeroMemory(@si, sizeof(si)); si.cb := sizeof(si); si.dwFlags := STARTF_USESHOWWINDOW; si.wShowWindow := 1; result := CreateProcessWithLogonW(PWideChar(User), nil, PWideChar(PW), LOGON_WITH_PROFILE, PWideChar(App), PWideChar(CmdLine), CREATE_DEFAULT_ERROR_MODE, nil, nil, @si, @pif); if not result then MessageBox(0, PChar(SysErrorMessage(GetLastError)), 'Testanwendung', MB_ICONSTOP); end; Kriege ich jetzt auch einen feuchten Händedruck? Biddöööö :mrgreen: |
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Zitat:
|
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Joa, also mit dem Problem der WideStrings bzw den Typecasts hab ich mich auch schonmal ausführlich beschäftigt. Das Problem ist, wie schon von Thomas erkannt, das interne String-Handling und die damit verbundenen transparenten API-Aufrufe. Werd mir das sobald ich dazu komm nochmal genauer anschaun...
|
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Zitat:
Zitat:
Zitat:
Zitat:
|
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Moin Thomas,
Zitat:
Man sollte nur die Doku zu GetLastError berücksichtigen, bezüglich SysFreeString ist hier der letzte markierte Satz entscheidend. Zitat:
|
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Hmm, habe ich tatsächlich nicht bemerkt, aber ändert nichts dran, denn:
Zitat:
Zitat:
|
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Um die Ecke denken? Nein. Richtig übersetzen würde schon reichen. :mrgreen:
Zitat:
|
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Zitat:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var c: PWideChar; begin SysAllocStringLen(c, 10); SetLastError(123); ShowMessage(IntToStr(GetLastError)); // <-- '123' SysFreeString(c); ShowMessage(IntToStr(GetLastError)); // <-- '0' end; |
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
So ein Mist. So geht es jetzt:
Delphi-Quellcode:
Auch mit Parametern. Aber das ist Mist, weil dann die aufrufende Routine die Fehlerbehandlung nicht machen kann. Und so was gefällt mir nicht. Wollte ich jetzt keine Fehlermeldung haben, müsste ich im Code rumfuschen. :roll:
function CreateProcessAsLogon(const User, PW, Application, CmdLine: WideString; var LastError: DWORD):
LongBool; var si : TStartupInfoW; pif : TProcessInformation; begin ZeroMemory(@si, sizeof(si)); si.cb := sizeof(si); 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); if not result then MessageBox(hApp, PChar(SysErrorMessage(GetLastError)), APPNAME, MB_ICONSTOP); end; Hier übrigens dein feuchter Händedruck:
Delphi-Quellcode:
;)
{************************************************************}
{ } { RunAsUser - Version 1.1 } { } { Copyright (c) 2005 Michael Puff } { } { When I die I want 'Hello, world' carved on my headstone. } { } {************************************************************} {************************************************************* History: - 2005-01-24 - 1.1 GetLastError-Bug in CreateProcessAsLogon von tommie-lie gefunden: [url]http://www.delphipraxis.net/post306577.html#306577[/url] *************************************************************} |
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Zitat:
Zitat:
Delphi-Quellcode:
So würde zumindest ich es machen ;-)
CreateProcessBlubb(...);
result := GetLastError; Wenn CreateProcessWithLogonW() True zurückgegeben hat, müsste GetLastError() ja 0 sein. Und andernfalls hat es halt einen bestimmten Fehlerwert. In der Aufruffunktion überprüfst du dann das Ergebnis auf 0 und gibst entsprechend die Fehlermeldung passend zum Fehlercode aus, sofern die Funktion nicht 0 zurückliefert. Erfordert zwar eine weitere Variable, aber der Compiler sollte sie in ein Register packen können (wäre glaub' ich sogar schneller, weil nur ein Wert geladen wird :gruebel: Schwachsinn, stattdessen wird er vorher geladen, macht absolut keinen Unterschied, wenn der Compiler die Variable in ein Register packt). Zitat:
|
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Zitat:
|
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Zitat:
Naja, ich glaube du hast mich nur wie immer falsch verstanden ;-) Zitat:
|
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Es funktioniert, wenn GetLastWrror direkt in der Routine ausgewertet wird, nicht aber wenn ich GetLastError zurückgeben lasse.
|
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Zitat:
Also bei mir geht das, auch wenn ich GetLastError() zurückgebe:
Delphi-Quellcode:
function CreateProcessAsLogon(const User, PW, Application, CmdLine: WideString):
LongWord; var si : TStartupInfoW; pif : TProcessInformation; begin ZeroMemory(@si, sizeof(si)); si.cb := sizeof(si); si.dwFlags := STARTF_USESHOWWINDOW; si.wShowWindow := 1; SetLastError(0); CreateProcessWithLogonW(PWideChar(User), nil, PWideChar(PW), LOGON_WITH_PROFILE, nil, PWideChar(Application+' "'+CmdLine+'"'), CREATE_DEFAULT_ERROR_MODE, nil, nil, @si, @pif); Result := GetLastError; end; procedure TForm1.Button1Click(Sender: TObject); var lasterror: LongWord; begin lasterror := CreateProcessAsLogon(Edit1.Text, Edit2.Text, Edit3.Text, Edit4.Text); if LastError <> 0 then MessageBox(Application.Handle, PChar(SysErrorMessage(LastError)), '', MB_ICONSTOP); end; |
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Verdammt, jetzt geht es bei mir auch. :roll:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:40 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