Как определить, отменен ли запуск через ShellExecuteEx UAC - PullRequest
3 голосов
/ 18 октября 2011

Я запускаю exe через ShellExecuteEx:

tstring sPath = _T("C:\\Test\\MyApp.exe");
tstring sArgs = _T("/S");
SHELLEXECUTEINFO lpExecInfo = {0,};
lpExecInfo.cbSize  = sizeof(SHELLEXECUTEINFO);
lpExecInfo.lpFile = sPath.c_str();
lpExecInfo.fMask=SEE_MASK_NOASYNC ;     
lpExecInfo.hwnd = NULL;
lpExecInfo.lpVerb = NULL;
lpExecInfo.lpParameters = sArgs.c_str();
lpExecInfo.lpDirectory = NULL;
lpExecInfo.nShow = SW_SHOWNORMAL;

if (!ShellExecuteEx(&lpExecInfo)) {
    // handle the error
    throw CException("Cannot launch an application");
}

int nRes = (int)lpExecInfo.hInstApp; // nRes = 42
DWORD dwErr = GetLastError(); // dwErr = 0

Как я могу определить, отменен ли запуск UAC? ShellExecuteEx успешно в этом случае (hInstApp = 42, GetLastError возвращает 0).

Спасибо

Ответы [ 3 ]

2 голосов
/ 02 июля 2014

FAR Manager может обнаружить отмену UAC даже при использовании ShellExecuteEx.

   ╔════════════ Error ═════════════╗
   ║      Operation cancelled       ║
   ║         Cannot execute         ║
   ║ D:\Downloads\fiddler4setup.exe ║
   ║               OK               ║
   ╚════════════════════════════════╝

Я проверил, что происходит в отладчике, и вот как выглядит структура:

lpVerb = "open";
lpFile = <path to the .exe>;
lpParameters = "";
lpDirectory = <current directory>;
nShow = SW_SHOWNORMAL;
fMask = SEE_MASK_NOCLOSEPROCESS|SEE_MASK_NOASYNC|
   SEE_MASK_FLAG_NO_UI|SEE_MASK_NOZONECHECKS; // 0x800540

Вы можете проверить всю магию, которую они совершают в исходном коде .

2 голосов
/ 18 октября 2011

Если ShellExecuteEx() не возвращает ошибку, то вы ничего не можете сделать, чтобы обнаружить отмену UAC, происходящую вне ShellExecuteEx's элемента управления.

То, что вы должны сделать, это использовать CreateProcess() вместо.Это вернет ошибку, если UAC отклонит новый процесс.Не используйте ShellExecuteEx() для запуска файла .exe, если только вы не используете глагол «runas», чтобы вызвать запрос UAC.

1 голос
/ 19 октября 2011

Теперь проблема в том, что CreateProcess успешно выполняется в обоих случаях, когда запуск отменяется и не отменяется.Вопрос в том, как определить, когда он отменен?

Вероятно, невозможность определить, был ли повышенный запуск успешным или неудачным, является функцией безопасности.В противном случае вы можете проверить систему на наличие установленного программного обеспечения, о котором вы не должны знать.

...