Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Rückgabewert von CreateProcessWithLogonW und GetLastError (https://www.delphipraxis.net/38439-rueckgabewert-von-createprocesswithlogonw-und-getlasterror.html)

Luckie 19. Jan 2005 14:04


Rückgabewert von CreateProcessWithLogonW und GetLastError
 
Ich habe hier ein dummes Problem. Erstmal der Code:

Delphi-Quellcode:
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:
Delphi-Quellcode:
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;
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:
Weiß jemand, was da falsch läuft? Also warum GetLastError 0 ist?

SubData 19. Jan 2005 15:06

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 :)

Luckie 19. Jan 2005 15:09

Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
 
Dann dürfte die Funktion aber auch kein False zurückliefern.

Luckie 20. Jan 2005 18:55

Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
 
Ich habe das Programm jetzt erstmal mit einer eigenen Fehlermeldung veröffentlicht: RunAsUser. Aber befriedigen tut mich das nicht. Hat sonst noch jemand eine Idee, woran das liegen könnte oder was ich falsch mache?

mirage228 20. Jan 2005 19:14

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

Motzi 20. Jan 2005 19:22

Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
 
Zitat:

Zitat von mirage228
was sagt denn das MSDN dazu?

Steht dort, dass man den Fehler mit GetLastError bestimmen kann?

Wenn du nachgeschaut hättest wüsstest du es.. :roll: Ja, steht dort! ;)

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...

Luckie 22. Jan 2005 13:17

Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
 
So dieser Code
Code:
#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;
    } 
}
(Quelle: http://www.c-plusplus.de/forum/viewtopic.php?t=98607 )

tut es unter Windows XP SP2 korrekt:
Zitat:

Anmeldung fehlgeschlagen: unbekannter Benutzername oder falsches Kennwort.
So jetzt die Preisfrage: Wo ist der Unterschied zu meinem Code?

MathiasSimmack 22. Jan 2005 13:43

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!

Luckie 22. Jan 2005 13:46

Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
 
Reicht ein feuchter Händedruck? ;)

MathiasSimmack 22. Jan 2005 13:49

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:
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;
Das Test-OS war XP SP2.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:34 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz