Delphi-PRAXiS
Seite 3 von 4     123 4      

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)

lukdelphias 11. Aug 2020 12:30

AW: Passwort automatisch eingeben
 
Tut mir leid aber ich verstehe nicht so richtig was du meinst Himitsu. Bin leider kein Profi:|

KodeZwerg 12. Aug 2020 07:39

AW: Passwort automatisch eingeben
 
Moin moin,

also mir war es nicht möglich ohne das UAC dazwischen funkt.
Ich habe sehr viele Winapi methoden ausprobiert die eigentlich an ein gutes Ziel führen sollten, jedoch ohne erfolg.

Ich kann zwar Programme im Kontext eines Users ausführen lassen, aber nicht mit Administrative Rechte.

Mein Workaround greift wieder auf deinen Schnippsel aus Post #0.
(Ich erstelle im temp Ordner eine Batch die dann wiederum Deinen Code ausführt)


In der JCL ist ein gutes Beispiel vorhanden aber es scheitert auch.

KodeZwerg 12. Aug 2020 11:04

AW: Passwort automatisch eingeben
 
Zitat:

Zitat von Moombas (Beitrag 1471571)
Also ich mache da aktuell so (allerdings in Lazarus): ...dein code...

Fast gleiches habe ich auch erfolglos probiert.
Öffnet dein Lazaurs-Project damit die target.exe tatsächlich im Admin-Modus?
Bei mir mit Rio leider nicht.

//edit
Ps, so schaut der Code bei mir aus:
Delphi-Quellcode:
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ExtCtrls, Buttons;

type
 TForm1 = class(TForm)
   Button1: TButton;
   E1: TLabeledEdit;
   E2: TLabeledEdit;
   E3: TLabeledEdit;
   E4: TLabeledEdit;
   SpeedButton1: TSpeedButton;
   OpenDialog1: TOpenDialog;
   procedure Button1Click(Sender: TObject);
   procedure SpeedButton1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

const
    LOGON_WITH_PROFILE = $00000001;
    LOGON_NETCREDENTIALS_ONLY = $00000002;

var
 Form1: TForm1;

implementation

{$R *.dfm}

function CreateProcessWithLogonW
                               (
                                 lpUsername, // user"s name
                                 lpDomain, // user"s domain
                                 lpPassword: PWideChar; // user"s password
                                 dwLogonFlags: DWORD; // logon option
                                 lpApplicationName: PWideChar; // executable module name
                                 lpCommandLine: PWideChar; // command-line string
                                 dwCreationFlags: DWORD; // creation flags
                                 lpEnvironment: Pointer; // new environment block
                                 lpCurrentDirectory: PWideChar; // current directory name
                                 const lpStartupInfo: TStartupInfo; // startup information

 

                                 var lpProcessInformation: TProcessInformation //process inf
                                ): Bool; stdcall;external "advapi32.dll";

procedure TForm1.Button1Click(Sender: TObject);

var
  UserName,
  UserDomain,
  Password,
  CmdLine:Pwidechar;
  si: TStartupInfo;
  ProcInfo: TProcessInformation;

begin
 FillChar(si,sizeof(si), 0);
 si.cb:=sizeof(si);
 GetMem(UserName, 512);
 GetMem(UserDomain, 512);
 GetMem(Password, 512);
 GetMem(CmdLine, 512);
 try
   UserName:=StringToWideChar(E2.Text,UserName,512);
   UserDomain:=StringToWideChar(E4.Text,UserDomain,512);
   Password:=StringToWideChar(E3.Text,Password,512);
   cmdline:=StringToWideChar(E1.Text,cmdline,512);
   if not CreateProcessWithLogonW(
                                   UserName,
                                   UserDomain,
                                   Password,
                                   LOGON_WITH_PROFILE,
                                   nil,
                                   CmdLine,
                                   CREATE_DEFAULT_ERROR_MODE,
                                   //CREATE_NEW_CONSOLE or CREATE_NEW_PROCESS_GROUP,
                                   nil, nil, si, ProcInfo) then
   begin
      MessageDlg(SysErrorMessage(GetLastError)+#10#13+inttostr(GetLastError), mtError, [mbOK], 0);
   end else
   begin
     WaitForSingleObject(procinfo.hProcess, INFINITE);
     CloseHandle(procinfo.hProcess);
     CloseHandle(procinfo.hThread);
     ShowMessage("Success !!!");
   end;
 finally
   FreeMem(UserName, 512);
   FreeMem(UserDomain, 512);
   FreeMem(Password, 512);
   FreeMem(CmdLine, 512);
 end;
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
 if OpenDialog1.Execute then
 begin
   E1.Text:=OpenDialog1.FileName;
 end;
end;

end.

Moombas 12. Aug 2020 14:56

AW: Passwort automatisch eingeben
 
Er öffnet den Prozess als den angegebenen Benutzer. Wir benötigen das für Remote-Prozesse und läuft. Hab folgendes in meinem Delphi Ordner noch gefunden, was funktionierte, bevor ich auf Lazarus geschwenkt bin:
Delphi-Quellcode:
type
  function CreateProcessAsLogon(const User, PW, Application, param, CmdLine: WideString): DWORD;
//...
 
  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';

implementation

//Prozess als bestimmten Benutzer starten (Hilfsaufruf)
procedure startasUser(exe, param : string);
var
  User             : WideString;
  PW               : WideString;
  err              : DWORD;
begin
  User := 'Benutzer';
  PW  := 'Passwort';
  err := CreateProcessAsLogon(User, PW, exe, param, '');
  if err <> 0 then
    ShowMessage(SysErrorMessage(err));
end;

//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
    ws := Application
  else
    ws := Application + ' "' + CmdLine + '"';

  SetLastError(0);
  SI.cb := SizeOf(TStartupInfo);
  if CreateProcessWithLogonW(PWideChar(User), nil, PWideChar(PW), 0, nil, PWideChar(ws), CREATE_DEFAULT_ERROR_MODE, nil, PChar(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;

KodeZwerg 12. Aug 2020 15:06

AW: Passwort automatisch eingeben
 
Frage an Moombas, all meine Varianten die ich getestet habe sind im Kontext des angegebenen Users und starten auch.
Aber keine Variante startet mir 'ne .exe mit Admin-Rechten wie es ein "Als Administrator ausführen" macht, selbst wenn der User Administrator-Rechte hat.

Auch per Winapi "LogonUser" und darauf folgendem "CreateProcessAsUser" bleibt das Resultat das gleiche, .exe startet ohne Admin-Rechte.


Frage: Öffnet der in Lazarus die .exe mit Admin-Rechte?

Ich kann morgen eine Test.exe hochladen die einem den Status anzeigt mit was für Rechte sie gestartet wurde, wenn das weiterhilft.

Moombas 13. Aug 2020 06:53

AW: Passwort automatisch eingeben
 
In wie fern das generell "Admin-Rechte" betrifft, weiß ich nicht genau.
Ich öffne damit Programme mit einem Benutzer (diesen gibt es bei mir auf dem lokalen System nicht), der auf den Remotesystemen Administrator ist um Änderungen am dortigen System durchzuführen.
Das funktionierte bisher nur über den oben angegebenen Weg, jedoch einwandfrei.

Mir fällt gerade noch ein: Es kann sein, das du Recht hast. Die Programme müssen bei uns nur unter diesem Benutzer ausgeführt werden, es kann dabei jedoch sein, das dieser (auf dem startenden System) keine Adminrechte hat. Das übersteigt jedoch nun meine Kenntnisse.

Sherlock 13. Aug 2020 07:00

AW: Passwort automatisch eingeben
 
Ganz streng genommen ist doch alles korrekt, so wie es läuft. Ohne Anwenderinteraktion darf es gar nicht möglich sein, höhere Rechte zu erlangen. Sollte es doch gehen, handelt es sich entweder um ein extrem nachlässig konfiguriertes Windows, einen Bug oder eine Sicherheitslücke. Auf nichts davon darf man als seriöser Entwickler bauen.

Sherlock

KodeZwerg 13. Aug 2020 07:23

AW: Passwort automatisch eingeben
 
Liste der Anhänge anzeigen (Anzahl: 1)
Für Tester die es mal versuchen wollen ist im Anhang eine .exe enthalten die einem den Status anzeigt was für Rechte Sie besitzt.

lukdelphias 13. Aug 2020 08:55

AW: Passwort automatisch eingeben
 
Hallo,

ich hab es nun selber hinbekommen. Kann jetzt eine EXE mit Adminrechten aufrufen.
Die Methode von Cherry aus diesem Thema https://www.delphipraxis.net/140391-...arameters.html funktioniert bei mir einwandfrei.
Grüße

KodeZwerg 13. Aug 2020 10:41

AW: Passwort automatisch eingeben
 
Zitat:

Zitat von lukdelphias (Beitrag 1471758)
Hallo,

ich hab es nun selber hinbekommen. Kann jetzt eine EXE mit Adminrechten aufrufen.
Die Methode von Cherry aus diesem Thema https://www.delphipraxis.net/140391-...arameters.html funktioniert bei mir einwandfrei.
Grüße

Das teste ich heute abend mal, so viel anders wird da auch nicht gemacht als wie hier gepostet wurde... hmmm... bin gespannt ob die ElevChk.exe "IsAdministrator" und "IsElevated" gechecked hat.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:13 Uhr.
Seite 3 von 4     123 4      

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