我们开发了一个安装在IE8 +中的ActiveX窗体控件。 此控件检查注册表项,然后根据需要下载并安装一个小设置。 对于管理员而言,所有IE 8+版本的Windows 7和8都可以正常工作。它将下载可执行文件client_setup.exe
,路径为C:\ users \ user \ AppData \ Local \ Temp \ Low \,但是当使用非管理员用户时,控制器将运行(它必须由管理员安装,但是没问题)它尝试运行可执行文件(shellexec或createprocess产生相同的结果)需要一个管理帐户,并出现UAC提升提示。ActiveX无法运行.exe但无权限提升
如果非管理员用户下载并安装相同的设置,则不需要管理权限(我们在exe文件中声明了此权限)。此设置完全安装在用户配置文件和HKCU注册表中。
我知道ActiveX控件像IE进程一样以低权限运行。但为什么在这种情况下需要提升?我们的设置不需要特权。
我试图在低海拔人权政策的例外这里
HKEY_LOCAL_MACHINE\SOFTWARE\\Microsoft\Internet Explorer\Low Rights\ElevationPolicy
但仍然出现UAC提示添加ActiveX控件。
我想允许为所有用户运行此设置。我们可以以管理员身份运行一次脚本来授予整个系统的权限。有人可以帮助完成这项任务吗?
TEST 1
以非管理员用户,我试图手动安装由ActiveX下载的.exe和我得到一个系统错误,不能写入到临时目录。如果我用Internet Explorer下载相同的exe文件,我可以安装这个没有问题。
我检查与ICACLS和exe文件通过ActiveX控件下载有强制性标签\低强制性级别:(I)(NW)
TEST 2
网站添加到受信任的站点为Taxilian建议。作为非管理员用户,ActiveX现在将.exe安装程序保存到C:\ users \ user \ AppData \ Local \ Temp(不低),.exe不再具有低级别标签。但是,CreateProcess引发UAC提示并失败。
这是我的CreateProcess代码。它是Delphi代码,但它应该是可读的。
function RunProcess(FileName: string; ShowCmd: DWORD; wait: Boolean; ProcID: PDWORD): Longword;
var
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
begin
FillChar(StartupInfo, SizeOf(StartupInfo), #0);
StartupInfo.cb := SizeOf(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
StartupInfo.wShowWindow := ShowCmd;
if not CreateProcess(nil,
@Filename[1],
nil,
nil,
False,
CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
nil,
nil,
StartupInfo,
ProcessInfo)
then
Result := WAIT_FAILED
else
begin
if wait = FALSE then
begin
if ProcID <> nil then
ProcID^ := ProcessInfo.dwProcessId;
result := WAIT_FAILED;
exit;
end;
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
GetExitCodeProcess(ProcessInfo.hProcess, Result);
end;
if ProcessInfo.hProcess <> 0 then
CloseHandle(ProcessInfo.hProcess);
if ProcessInfo.hThread <> 0 then
CloseHandle(ProcessInfo.hThread);
end;
这是.exe清单。这是一个简单的设置,将一些文件复制到用户配置文件并在HKCU中添加注册表项。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity name="JR.Inno.Setup" processorArchitecture="x86" version="1.0.0.0" type="win32" />
<description>Inno Setup</description>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*" />
</dependentAssembly>
</dependency>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
</windowsSettings>
</application>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />
</application>
</compatibility>
</assembly>
当您使用'CreateProcess'尝试启动可执行文件时会发生什么? 'CreateProcess'是否返回错误代码?您是否尝试过使用Process Monitor来跟踪事件的顺序? –
CreateProcess返回错误代码1,这对我没有意义。实际上,由于UAC提示,CreateProcess失败。 – Ghigo
也许没有主题,但: - 为什么当CreateProcess失败时调用'CloseHandle'事件? - 当Wait = False时,你不会调用'CloseHandle' - 如果你的'Filename'将包含空格,并且它不会被双引号,那么你将失败 – kibab