1

我们有一个应用程序,它使用内部更新机制,通过下载我们的最新版本并setup.exe%TEMP%之后执行它。我们使用这个 ShellExecuteW 函数:

 

ShellExecuteW(NULL, "open", filePath, parameters, NULL, SW_SHOWNORMAL);

 

在未配置 AppLocker 且没有管理员权限的计算机上使用此命令时,setup.exe将按预期执行。

 

使用 AppLocker 中的以下设置并在没有管理员权限的情况下尝试执行相同操作时,AppLocker 会阻止setup.exe. 问题是什么都没有发生 - 它不显示对话框,并且没有任何信息可供用户使用,即使事件查看器显示应用程序被阻止运行。

AppLocker 可执行规则

事件查看器 AppLocker

我怎样才能做到至少出现错误消息?是否甚至可以直接setup.exe以管理员身份启动,以便出现 UAC 提示?

4

1 回答 1

1

我得出的结论是,当在系统上使用 AppLocker 时,ShellExecute() 并不能真正可靠地运行。在一种情况下,它会返回值 42,这表明 setup.exe 成功执行,并且日志说它没有被阻止运行,但 setup.exe 仍然无法打开。在另一种情况下,它将被阻止,但返回值 42。

所以我改用 CreateProcess(),因为它总是可靠地返回 false,如果 setup.exe 的执行不工作,如果它工作,总是 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
}
于 2019-05-20T07:50:38.360 回答