Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Passwort automatisch eingeben (https://www.delphipraxis.net/205188-passwort-automatisch-eingeben.html)

himitsu 10. Aug 2020 14:06

AW: Passwort automatisch eingeben
 
Ebenso, wie man mit dem UAC-Dialogen nicht interagieren kann, gibt es auch bei RUNUS aus Sicherheitsgründen keinen Paramter, womit man das Passwort reingeben kann.
Aber es lässt sich via PIPE übergeben. https://stackoverflow.com/questions/...-line/16116329

Beim CreateProcess kann man auch so eine PIPE einrichten, siehe lpStartupInfo.hStdInput
auch wenn es hier sinnlos wäre, da man auch direkt CreateProcessAsUser/CreateProcessWithLogonW verwenden kann.

lukdelphias 10. Aug 2020 14:11

AW: Passwort automatisch eingeben
 
Also KodeZwerg,
habe deinen Code mal probiert.
Fehler gibt es mir keine aus allerdings wird das Programm nicht ausgeführt...leider.
Hier der Code dazu:
Delphi-Quellcode:
unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, ShellAPI;

type
  TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure RunAsExec(hWnd: HWND; aFile: string; aParameters: string);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation


{$R *.dfm}

procedure TForm2.RunAsExec(hWnd: HWND; aFile: string; aParameters: string);
var
  SEI: TShellExecuteInfo;
begin
  FillChar(SEI, SizeOf(SEI), 0);
  SEI.cbSize := sizeof(SEI);
  SEI.Wnd := hWnd;
  SEI.fMask := SEE_MASK_NOCLOSEPROCESS;
  SEI.lpVerb := 'runas';
  SEI.lpFile := PChar(aFile);
  SEI.lpParameters := PChar(aParameters);
  SEI.nShow := SW_SHOWNORMAL;
  if not ShellExecuteEx(@SEI) then
    RaiseLastOSError;
end;

procedure TForm2.Button1Click(Sender: TObject);
var
  DateiName: string;
  Parameter: string;
begin
  DateiName := 'C:\temp\test.exe';
  Parameter := ' ' + 'administrator' + ' ' + 'password';
  RunAsExec(Application.Handle, DateiName, Parameter);
end;

end.

@himitsu
Da schon viele von CreateProcessWithLogonW geredet haben. Hast du dafür irgendein Beispiel. Ich weiß nicht wie ich das auf meinen Fall anwenden muss, sodass es funktioniert:(

lukdelphias 10. Aug 2020 14:13

AW: Passwort automatisch eingeben
 
Nur das habe ich bisher probiert:
Delphi-Quellcode:
program runadmin;

{$APPTYPE CONSOLE}

uses
  System, SysUtils, JwaWinBase;

var
  si: STARTUPINFOW;
  pif: PROCESS_INFORMATION;
  res: Boolean;
  s: string;
  cmd: PWideChar;
begin
  if Length(ParamStr(1)) = 0 then
    WriteLn(
      'RunAdmin - Kommando unter Administrator-Konto ausführen' + #13#10 +
      'Usage: runadmin <command>')
  else
  try
    si.cb := SizeOf(startupinfow);
    si.dwFlags := STARTF_USESHOWWINDOW;
    si.wShowWindow := 1;
    si.lpReserved := nil;
    si.lpDesktop := nil;
    si.lpTitle := 'Konsole';
    getmem(cmd,Length(ParamStr(1))*2);
    cmd := StringToWideChar(ParamStr(1),cmd,Length(ParamStr(1))*2);
    res := CreateProcessWithLogonW('Administrator', '', 'password', LOGON_WITH_PROFILE,
      nil,cmd,CREATE_DEFAULT_ERROR_MODE, nil, nil, si, pif);
    if booltostr(res) = '0' then
    begin
      str(GetLastError, s);
      WriteLn('Beim Ausfuehren des Befehls "' + ParamStr(1) + '"');
      WriteLn('ist der Fehler ' + s + ' aufgetreten.');
      Halt(1);
    end;
  except
    on E: Exception do
    begin
      WriteLn('Beim Ausfuehren des Befehls "' + ParamStr(1) + '"');
      WriteLn('ist der Fehler ' + E.Message + ' aufgetreten.');
      Halt(1);
    end;
  end;

end.
Das ist ein angeblich lauffähiges Beispiel aus einem anderen Thema. Funktioniert bei mir leider nicht.:(

KodeZwerg 10. Aug 2020 14:14

AW: Passwort automatisch eingeben
 
Existiert ein Benutzerkonto namens "Administrator" ?

lukdelphias 10. Aug 2020 14:19

AW: Passwort automatisch eingeben
 
Ja das gibt es:wink:

KodeZwerg 10. Aug 2020 14:22

AW: Passwort automatisch eingeben
 
Okay, ich wollte nur sichergehen das man das als Fehler schonmal ausschließen kann. Zu morgen sollte ich was funktionierendes gebastelt bekommen.

lukdelphias 10. Aug 2020 14:23

AW: Passwort automatisch eingeben
 
Das kling ja schonmal ganz gut. Vielen Dank erstmal für die Mühe.

Moombas 11. Aug 2020 07:19

AW: Passwort automatisch eingeben
 
Also ich mache da aktuell so (allerdings in Lazarus):

Delphi-Quellcode:
//Oberhalb des "implementation" Bereichs
function CreateProcessWithLogonW(lpUsername, lpDomain, lpPassword: LPWSTR; dwLogonFlags: dword; lpApplicationName,
  lpCommandLine: LPWSTR; dwCreationFlags: dword; lpEnvironment: pointer; lpCurrentDirectory: LPWSTR; lpStartupInfo:
  PStartUpInfoW; lpProcessInfo: PProcessInformation): boolean; stdcall; external 'advapi32.dll';
Delphi-Quellcode:
//Im "implementatrion" Bereich
//Prozess als bestimmten Benutzer starten
function CreateProcessAsLogon(const User, PW, Application, param, CmdLine: WideString): DWORD;
var
  ws : WideString;
  si : TStartupInfoW;
  pif : TProcessInformation;
begin
  ZeroMemory(@si, sizeof(si));
  si.cb := sizeof(si);
  si.dwFlags := STARTF_USESHOWWINDOW;
  si.wShowWindow := 1;

  if CmdLine = '' then
  begin
    ws := Application;
  end else
  begin
    ws := Application + ' "' + CmdLine + '"';
  end;

  SetLastError(0);
  SI.cb := SizeOf(TStartupInfo);
  if CreateProcessWithLogonW(PWideChar(User), nil, PWideChar(PW), 0, nil, PWideChar(ws), CREATE_DEFAULT_ERROR_MODE, nil, PWideChar(param), @si, @pif) then
  begin
    sleep(500);
    if PIf.dwProcessId > 0 then
    begin
      AppPID := PIf.dwProcessId;
      CloseHandle(PIf.hProcess);
      CloseHandle(PIf.hThread);
    end;
  end;
  Result := GetLastError;
end;

lukdelphias 11. Aug 2020 11:08

AW: Passwort automatisch eingeben
 
Zitat:

Zitat von KodeZwerg (Beitrag 1471532)
Meinst Du so etwas?

Delphi-Quellcode:
procedure RunAsExec(hWnd: HWND; aFile: string; aParameters: string);
var
  SEI: TShellExecuteInfo;
begin
  FillChar(SEI, SizeOf(SEI), 0);
  SEI.cbSize      := sizeof(SEI);
  SEI.Wnd         := hWnd;
  SEI.fMask       := SEE_MASK_NOCLOSEPROCESS;
  SEI.lpVerb      := 'runas';
  SEI.lpFile      := PChar(aFile);
  SEI.lpParameters := PChar(aParameters);
  SEI.nShow       := SW_SHOWNORMAL;
  if not ShellExecuteEx(@SEI) then
    RaiseLastOSError;
end;
Beispiel-Aufruf:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  DateiName: string;
  Parameter: string;
begin
  DateiName := 'Programm.exe';
  Parameter := ' ' + 'Benutzername' + ' ' + 'Passwort';
  RunAsExec(Application.Handle, DateiName, Parameter);
end;

Hallo KodeZwerg,

um nochmal darauf einzugehen. Das läuft jetzt teilweise bei mir. Heißt wenn ich den Parameter-String frei lasse funktioniert es. Sobald ich in den Parameter-String Benutzername und Passwort eintrage, öffnet er mir das Programm nicht mehr. Bringt aber auch keinen Fehler....:(

himitsu 11. Aug 2020 11:36

AW: Passwort automatisch eingeben
 
Jetzt könnte man den ExitCode des Programms noch prüfen.

Zitat:

SEE_MASK_NOCLOSEPROCESS
Und was soll dieses Handle-Leck in dem Code?

SEI.pHandle wird zuückgegeben, aber niemals geschlossen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:35 Uhr.
Seite 2 von 4     12 34      

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