программно запустить exe файл с правами администратора

yemets63
Дата: 16.07.2019 15:38:06
есть программа, которая запускает некоторые процессы, и один из процессов является запускной файл exe, которая вносит в реестр изменения, допустим 0 или 1,
так вот, если ярлык программы в Windows настроен что запускать от Администратора, то все работает. А если запускаем от обычного, то конечно нет.

Как сказать программе, которая запускает процессы и программы, чтобы некоторые программы запускались от Администратора.

в Delphi.

Спас.
goldmi45
Дата: 16.07.2019 15:44:31
yemets63,

в манифесте программы указать, что необходим запуск от Администратора
Кроик Семён
Дата: 16.07.2019 16:05:47
+ запустить другую программу из-под администратора (если знаешь его пароль :)

function CreateProcessWithLogonW; external 'advapi32.dll' name 'CreateProcessWithLogonW';



procedure ExecAsDifferentUser(const AUserName: string;
                              const ADomain: string;
                              const APassword: string;
                              const ACommand: string;
                              out AProcessInf: TProcessInformation);
var
   bSuccess       : boolean;
   recStartupInfo : TStartupInfoW;
begin
   FillChar(recStartupInfo, SizeOf(recStartupInfo), #0);
   recStartupInfo.cb:= SizeOf(recStartupInfo);
   recStartupInfo.dwFlags:= STARTF_USESHOWWINDOW;
   recStartupInfo.wShowWindow:= 1;

   FillChar(AProcessInf, SizeOf(AProcessInf), #0);

   SetLastError(0);

   bSuccess := CreateProcessWithLogonW(
      StringToOleStr(AUserName),       // lpUsername,
      StringToOleStr(ADomain),         // lpDomain,
      StringToOleStr(APassword),       // lpPassword: PWideChar;
      LOGON_WITH_PROFILE,              // dwLogonFlags: DWORD;
      StringToOleStr(''),              // lpApplicationName,
      StringToOleStr(ACommand),        // lpCommandLine: PWideChar;
      0,                               // dwCreationFlags: DWORD;
      nil,                             // lpEnvironment: pointer;
      StringToOleStr(''),              // lpCurrentDirectory: PWideChar;
      @recStartupInfo,                 // lpStartupInfo: PStartupInfoW;
      @AProcessInf                     // lpProcessInformation: PProcessInformation
      );

   if not bSuccess then
      RaiseLastOSError();
end;
--------------------------------------------------------------------------------
var
   sCmd                : string;
   recProcessInfo      : TProcessInformation;
const
   ANY_EXE_PATH        = 'C:\Windows\Notepad.exe';
   ANY_EXE_PARAM       = 'C:\Windows\System32\tsadmin.msc';
begin
   sCmd := '"'+ANY_EXE_PATH+'" "'+ANY_EXE_PARAM+'"';

   ExecAsDifferentUser('Administrator',
                       ......
                       ......,
                       sCmd,
                       recProcessInfo);

alekcvp
Дата: 16.07.2019 19:51:29
Кроик Семён,

А если на клиентской машине нет пользователя "Administrator"?
alekcvp
Дата: 16.07.2019 19:53:58
Вот тут пример через ShellExecute (правда на сях).
Gator
Дата: 16.07.2019 21:01:42
А на сях Win API отличается?
alekcvp
Дата: 16.07.2019 21:18:25
Gator
А на сях Win API отличается?


Винапи нет, но синтаксис отличается, а уровень вопроса вызывает сомнения в способности в нём разобраться.
Gator
Дата: 16.07.2019 21:26:06
alekcvp,

Ну это эму надо книжки почитать и разобраться в именовании типов данных и структурах.
Короче, пусть он идёт лесом. 😃
ёёёёё
Дата: 16.07.2019 22:23:53
yemets63,

можно в инсталлятор твоего программного комплекса воткнуть специальный сервис, который будет иметь высокие права, а другие программы будут к этому сервису обращаться с просьбой "запусти вот это приложение со своими (тоже высокими) правами, или сразу - "запиши в эту ветку HKLM такое-то значение". Этакая штатная дыра в безопасности. :).
alekcvp
Дата: 16.07.2019 22:46:39
ёёёёё
yemets63,

а другие программы будут к этому сервису обращаться с просьбой "запусти вот это приложение со своими (тоже высокими) правами


Петя и Валера будут в восторге!