我们有一个应用程序,它通过将最新的setup.exe下载到%TEMP%并随后执行它来使用内部更新机制。我们使用这个ShellExecuteW函数:
ShellExecuteW(NULL, "open", filePath, parameters, NULL, SW_SHOWNORMAL);在未配置AppLocker且没有管理员权限的计算机上使用此命令时,setup.exe将按预期执行。
使用AppLocker中的以下设置,并在没有管理员权限的情况下运行时尝试执行相同的操作,AppLocker会阻止setup.exe,这很好。问题是什么都没有发生-它不会显示对话框,也不会为用户提供任何信息,即使事件查看器显示应用程序被阻止运行。
我如何才能做到至少出现错误消息?是否可以以管理员身份直接启动setup.exe,从而显示UAC提示符?
发布于 2019-05-20 15:50:38
我得出的结论是,当在系统上使用AppLocker时,ShellExecute()的行为并不可靠。在一种情况下,它将返回值42,这将指示setup.exe的成功执行,并且日志显示它没有被阻止运行,但setup.exe仍然不会打开。在另一种情况下,它将被阻止,但返回值42。
所以我转而使用CreateProcess(),因为如果setup.exe的执行不起作用,它总是可靠地返回false,如果它起作用,它总是返回true。下面是我的代码:
STARTUPINFO info={sizeof(info)};
PROCESS_INFORMATION processInfo;
if (CreateProcessW(NULL, "filepath + /paremeters", NULL, NULL, true, CREATE_NEW_CONSOLE, NULL, NULL, &info, &processInfo)) {
//Do something
CloseHandle(processInfo.hProcess);
CloseHandle(processInfo.hThread);
} else {
//Do something
}https://stackoverflow.com/questions/56145483
复制相似问题