Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Programm als Benutzer starten, wenn eigene Anwendung als Admin läuft (https://www.delphipraxis.net/204794-programm-als-benutzer-starten-wenn-eigene-anwendung-als-admin-laeuft.html)

ringli 29. Jun 2020 20:51

Programm als Benutzer starten, wenn eigene Anwendung als Admin läuft
 
Um ein Programm als normaler Benutzer zu starten wenn meine eigene Anwendung als Administrator läuft, würde ich gerne den Quelltext verwenden den ich hier gefunden habe: https://pastebin.com/S9WLMDhB

Der Code funktioniert, allerdings würde ich gerne auf möglicherweise auftretende Fehler reagieren können. Dazu habe ich die original Prozedur ShellExecuteFromExplorer zum Test folgendermassen umgeschrieben:
Delphi-Quellcode:
function ShellExecuteFromExplorer(lpVerb, lpFile, lpParameters, lpDirectory : PChar;
                                   nShow : Integer) : HRESULT;
var
  FolderView: IShellFolderViewDual;
  DispShell: IDispatch;
  ShellDispatch: IShellDispatch2;
begin
  Result := E_NOTIMPL;
  GetDesktopAutomationObject(IShellFolderViewDual, FolderView);
  OleCheck(FolderView.get_Application(DispShell));
  OleCheck(DispShell.QueryInterface(IShellDispatch2, ShellDispatch));
  Result := ShellDispatch.ShellExecute(lpFile, String(lpParameters), String(lpDirectory), String(lpVerb), nShow);
end;
Übergebe ich jetzt bspw. absichtlich einen ungültigen Pfad an die Funktion, erhalte ich eine Fehlermeldung obwohl ich kein ShowMessage o.ä. in meinem Quelltext habe:
Code:
"%systemroot%\System32\cmd.exe" konnte nicht gefunden werden. Stellen Sie sicher, dass Sie den Namen richtig eingegeben haben und wiederholen Sie den Vorgang.
Desweiteren habe ich es auch mal mit einem try..except-Block versucht:
Delphi-Quellcode:
function ShellExecuteFromExplorer(lpVerb, lpFile, lpParameters, lpDirectory : PChar;
                                   nShow : Integer) : HRESULT;
var
  FolderView: IShellFolderViewDual;
  DispShell: IDispatch;
  ShellDispatch: IShellDispatch2;
begin
  Result := E_NOTIMPL;
  GetDesktopAutomationObject(IShellFolderViewDual, FolderView);
  OleCheck(FolderView.get_Application(DispShell));
  OleCheck(DispShell.QueryInterface(IShellDispatch2, ShellDispatch));
  try
    Result := ShellDispatch.ShellExecute(lpFile, String(lpParameters), String(lpDirectory), String(lpVerb), nShow);
  except
    showmessage('Meine eigene Fehlermeldung');
  end;
end;
Die Fehlermeldung bleibt leider die gleiche. Was muss ich ändern damit ich eigene Fehlermeldungen verwenden kann?

himitsu 29. Jun 2020 21:23

AW: Programm als Benutzer starten, wenn eigene Anwendung als Admin läuft
 
Wenn das andere Programm (der Explorer) den Fehler anzeigt und in der Funktion nicht als Exception oder Error-Code durchreicht, dann hast du ein Problem.

Bei uns kam jemand auf die saudämlihe Idee im Programm an einer zentralen Stelle quasi sowas zu machen

Delphi-Quellcode:
// hier wurde der Code misshandelt
procedure MachWas;
begin
  try
    ...
  except
    on E: Exception do
      ShowMessage(E.Message);
  end;
end;

// und das hier war mein Code, der jetzt nicht mehr geht
try
  MachWas;
except
  ...
end;

hoika 30. Jun 2020 03:47

AW: Programm als Benutzer starten, wenn eigene Anwendung als Admin läuft
 
Hallo,
vielleicht hilft ja SetErrorMode?
Hier mit dem failcritical Parameter.

ringli 30. Jun 2020 06:12

AW: Programm als Benutzer starten, wenn eigene Anwendung als Admin läuft
 
Zitat:

Zitat von hoika (Beitrag 1468532)
vielleicht hilft ja SetErrorMode?

Hatte ich auch schon versucht, aber leider ohne Erfolg. :(


Zitat:

Zitat von himitsu (Beitrag 1468522)
Wenn das andere Programm (der Explorer) den Fehler anzeigt und in der Funktion nicht als Exception oder Error-Code durchreicht, dann hast du ein Problem.

Ich befürchte das du damit recht haben könntest... :?

KodeZwerg 30. Jun 2020 09:32

AW: Programm als Benutzer starten, wenn eigene Anwendung als Admin läuft
 
So könntest Du es abändern um Windows-Fehlermeldungen zu schlucken.
Nur hier im Editor geändert, ungetestet, aber das Prinzip sollte einem dadurch klar werden.
Zitat:

Zitat von ringli (Beitrag 1468520)
Delphi-Quellcode:
function ShellExecuteFromExplorer(lpVerb, lpFile, lpParameters, lpDirectory : PChar;
                                   nShow : Integer) : HRESULT;
var
  FolderView: IShellFolderViewDual;
  DispShell: IDispatch;
  ShellDispatch: IShellDispatch2;
begin
  Result := E_NOTIMPL;
  GetDesktopAutomationObject(IShellFolderViewDual, FolderView);
  if Succeeded(FolderView.get_Application(DispShell)) then
    if Succeeded(DispShell.QueryInterface(IShellDispatch2, ShellDispatch)) then
      Result := ShellDispatch.ShellExecute(lpFile, String(lpParameters), String(lpDirectory), String(lpVerb), nShow);
end;


ringli 30. Jun 2020 16:13

AW: Programm als Benutzer starten, wenn eigene Anwendung als Admin läuft
 
Zitat:

Zitat von KodeZwerg (Beitrag 1468563)
So könntest Du es abändern um Windows-Fehlermeldungen zu schlucken.

Funktioniert leider auch nicht, sprich die Windows-Fehlermeldung wird trotzdem angezeigt.

himitsu 30. Jun 2020 18:00

AW: Programm als Benutzer starten, wenn eigene Anwendung als Admin läuft
 
So als Idee:

Vom andemeldeten Benutzer (bzw. vom Desktop) das Token oder besser Elevated-Token besorgen
und dann damit via CreateProcessAsUser oder CreateProcessWithLogonW das Programm starten.


Oder du startest vorher dir ein zweites eigenes Programm (als Benutzer), redest dann via IPC mit dem und lässt dir von ihm das Programm starten.



Also wie in den vielen "Programm als Administrator starten"-Fragen/Beispielen/Tutorials, nur andersrum. :angle:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:45 Uhr.

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