AppLocker 阻止 ShellExecute 而不给出错误消息
AppLocker blocks ShellExecute without giving an error message
我们有一个应用程序使用内部更新机制,将我们最新的 setup.exe
下载到 %TEMP%
并在之后执行。我们使用这个 ShellExecuteW 函数:
ShellExecuteW(NULL, "open", filePath, parameters, NULL, SW_SHOWNORMAL);
在没有配置 AppLocker 且没有管理员权限的计算机上使用此命令时,setup.exe
将按预期执行。
在 AppLocker 中进行以下设置并尝试在 运行 没有管理员权限时执行相同操作,AppLocker 会阻止 setup.exe
,这很好。问题是什么也没发生——它不显示对话框,也没有任何信息供用户使用,即使事件查看器显示该应用已被阻止 运行.
AppLocker executable Rules
Event Viewer AppLocker
我怎样才能至少出现错误消息?甚至可以直接以管理员身份启动 setup.exe
,以便出现 UAC 提示符吗?
我得出的结论是,当在系统上使用 AppLocker 时,ShellExecute() 的行为并不可靠。在一种情况下,它会 return 值 42,这表明 setup.exe 成功执行并且日志表示它没有被 运行 阻止,但 setup.exe 仍然会没开。在另一种情况下,它会被阻止,但 return 值 42.
所以我转而使用 CreateProcess(),因为它总是可靠地 returns 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
}
我们有一个应用程序使用内部更新机制,将我们最新的 setup.exe
下载到 %TEMP%
并在之后执行。我们使用这个 ShellExecuteW 函数:
ShellExecuteW(NULL, "open", filePath, parameters, NULL, SW_SHOWNORMAL);
在没有配置 AppLocker 且没有管理员权限的计算机上使用此命令时,setup.exe
将按预期执行。
在 AppLocker 中进行以下设置并尝试在 运行 没有管理员权限时执行相同操作,AppLocker 会阻止 setup.exe
,这很好。问题是什么也没发生——它不显示对话框,也没有任何信息供用户使用,即使事件查看器显示该应用已被阻止 运行.
AppLocker executable Rules
Event Viewer AppLocker
我怎样才能至少出现错误消息?甚至可以直接以管理员身份启动 setup.exe
,以便出现 UAC 提示符吗?
我得出的结论是,当在系统上使用 AppLocker 时,ShellExecute() 的行为并不可靠。在一种情况下,它会 return 值 42,这表明 setup.exe 成功执行并且日志表示它没有被 运行 阻止,但 setup.exe 仍然会没开。在另一种情况下,它会被阻止,但 return 值 42.
所以我转而使用 CreateProcess(),因为它总是可靠地 returns 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
}