Uruchomienie procesu bez podniesionych uprawnień przez proces z uprawnieniami administratora

0

Hej,
Mam instalator. Aby mógł działać musi być odpalony z uprawnieniami administratora.
Chcę jednak uruchomić pod koniec instalacji inny proces, który musi być uruchomiony bez podniesionych uprawnień (zwykły użytkownik).

Jak to zrobić? Znalazłem na necie przykład, ale w c++ - nie ogarniam.
https://www.appsloveworld.com/coding/delphi/48/createprocess-with-lower-privileges-than-the-caller

Czy ktoś z Was ma może taką funkcję w Delphi albo potrafi przełożyć to na Delphi?
Dziękuję.
-Pawel

1

Jak to teraz jest modne - poprosiłem naszego przyjaciela GPT o pomoc, także poniżej daję, co on wygenerował. Jeśli będzie działać - proszę o łapkę. Jeśli wyczyści Ci dysk - nie moja wina, nie ja to pisałem ;)

Należy pamiętać, że kod Delphi nie zawiera dyrektyw preprocesora, takich jak #define czy #include. Kod Delphi jest kompilowany jako jednostka, a odpowiednie jednostki są używane przez użyte biblioteki. Przekształcony kod Delphi korzysta z odpowiednich jednostek, takich jak ActiveX, ComObj, ShlObj, ShlDisp, ExDisp i Windows, które zapewniają odpowiednie interfejsy i funkcje wymagane przez kod C++.

uses
  ActiveX, ComObj, ShlObj, ShlDisp, ExDisp, Windows;

procedure FindDesktopFolderView(const riid: TGUID; var ppv: Pointer);
var
  spShellWindows: IShellWindows;
  vtLoc, vtEmpty: Variant;
  lhwnd: Integer;
  spdisp: IDispatch;
  spBrowser: IShellBrowser;
  spView: IShellView;
begin
  spShellWindows := CreateComObject(CLSID_ShellWindows) as IShellWindows;

  vtLoc := CSIDL_DESKTOP;
  vtEmpty := System.Variants.EmptyParam;
  lhwnd := 0;
  spShellWindows.FindWindowSW(vtLoc, vtEmpty, SWC_DESKTOP, lhwnd, SWFO_NEEDDISPATCH, spdisp);

  spdisp.QueryInterface(IServiceProvider, spBrowser);
  spBrowser.QueryActiveShellView(spView);

  spView.QueryInterface(riid, ppv);
end;

procedure GetDesktopAutomationObject(const riid: TGUID; var ppv: Pointer);
var
  spsv: IShellView;
  spdispView: IDispatch;
begin
  FindDesktopFolderView(IID_IShellView, spsv);
  spsv.GetItemObject(SVGIO_BACKGROUND, riid, spdispView);
  spdispView.QueryInterface(riid, ppv);
end;

procedure ShellExecuteFromExplorer(const pszFile, pszParameters, pszDirectory, pszOperation: PWideChar; nShowCmd: Integer = SW_SHOWNORMAL);
var
  spFolderView: IShellFolderViewDual;
  spdispShell: IDispatch;
  spShellDispatch: IShellDispatch2;
begin
  GetDesktopAutomationObject(IID_IShellFolderViewDual, spFolderView);
  spFolderView.get_Application(spdispShell);
  spdispShell.QueryInterface(IShellDispatch2, spShellDispatch);

  spShellDispatch.ShellExecute(pszFile, pszParameters, pszDirectory, pszOperation, nShowCmd);
end;

begin
  if ParamCount < 1 then
    Exit;
    
  CoInitialize(nil);
  try
    ShellExecuteFromExplorer(PWideChar(ParamStr(1)),
      PWideChar(IfThen(ParamCount >= 2, ParamStr(2), '')),
      PWideChar(IfThen(ParamCount >= 3, ParamStr(3), '')),
      PWideChar(IfThen(ParamCount >= 4, ParamStr(4), '')),
      IfThen(ParamCount >= 5, StrToInt(ParamStr(5)), SW_SHOWNORMAL));
  finally
    CoUninitialize;
  end;
end.

0

OK, raport...

  1. brak modułów ExDisp, ShlDisp -> trzeba dodać moduł SHDocVw

  2. GUID CLSID_ShellWindows jest niezdefiniowany -> trzeba dodać definicje:
    const
    CLSID_ShellWindows : TGuid = '{9BA05972-F6A8-11CF-A442-00A0C90A8F39}';

  3. Problem z parametrem procedury FindDesktopFolderView
    Linia nie kompiluje się (za dużo parametrów) spShellWindows.FindWindowSW(vtLoc, vtEmpty, SWC_DESKTOP, lhwnd, SWFO_NEEDDISPATCH, spdisp);
    Usunięcie parametru spdisp pomaga - ale czy czegoś nie psuje?

  4. Procedura GetDesktopAutomationObject się nie kompiluje (parametr ppv)

procedure GetDesktopAutomationObject(const riid: TGUID; var ppv: Pointer);
var
  spsv: IShellView;
  spdispView: IDispatch;
begin
  FindDesktopFolderView(IID_IShellView, spsv);
  spsv.GetItemObject(SVGIO_BACKGROUND, riid, spdispView);
  spdispView.QueryInterface(riid, ppv);
end;

[dcc64 Error] ShellExecAsUser.pas(66): E2033 Types of actual and formal var parameters must be identical

Wniosek. GPT jest głupi :p
Jak można naprawić te problemy?
Ktoś ma jakiś pomysł?

-Pawel

1 użytkowników online, w tym zalogowanych: 0, gości: 1