Как запустить процесс с повышенными правами в Windows? - PullRequest
0 голосов
/ 04 июля 2018

Я использую вызов Windows API для создания процесса в простой учетной записи в качестве администратора с помощью CreateProcessWithLogonW

createprocesswithLogonW('admin',
                        nil,
                        'Pa$$w0rd',
                        LOGON_WITH_PROFILE,
                        'cmd.exe',
                        nil,
                        0,
                        nil,
                        nil,
                        Si,
                        Pi);

но иногда возвращается

Ошибка 5 Доступ запрещен

, а когда это не так, он не запускается как администратор, даже если эта учетная запись является администратором

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Если вы не возражаете против UAC (но я боюсь, что вы делаете это), то вы можете просто сделать, например:

HINSTANCE hInst = ShellExecuteW (NULL, L"runas",
    L"notepad.exe", NULL, NULL, SW_SHOWDEFAULT);

Проверьте документацию для значений, возвращаемых в hInst. Извините, пример написан на C ++, но я уверен, что вы можете перевести.

Если вы хотите обойти UAC, то вы действительно должны запустить свое приложение из службы, чтобы оно работало с повышенными правами. Пример кода здесь , опять же на C ++, извините, и он мог бы немного доработать, но он, безусловно, работает. Я предполагаю, что вы хотите запустить процесс в контексте текущего пользователя, как этот код. Пожалуйста, проголосуйте за этот ответ (или этот, или оба), если это поможет U.


Редактировать: (поскольку ОП все еще явно борется с этим).

Знаете что? Я мог бы дать вам главу и стих о том, как решить эту проблему , но я не собираюсь , потому что вы просто создадите одну большую, огромную лазейку безопасности, когда ваше программное обеспечение будет установлено. Это тоже разрешимо, но вы бы на самом деле беспокоились?

В любом случае, поставьте себя на место ваших пользователей на мгновение. Как вы думаете, они будут чувствовать, когда программа начнет делать то, что обычно может быть сделано только программой, выполняющейся от имени администратора, без предварительного отображения ожидаемого приглашения UAC? Если бы это был я, я бы взбесился.

Так что нет, просто используйте трюк ShellExecute, который я сначала рекомендовал, и оставьте его на этом. Это более чем достаточно.

0 голосов
/ 04 июля 2018

Если вы хотите, чтобы процесс был повышен (или процесс требует повышения), вы не можете сделать это с CreateProcessWithLogon.

Я не могу проверить это сейчас, но я думаю, что вам нужно:

  1. Позвоните LogonUser , чтобы получить основной токен
  2. Вызовите GetTokenInformation с TokenLinkedToken Информационным классом для получения связанного (повышенного) токена.
  3. Вызов CreateProcessAsUser со связанным токеном.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...