2014-03-05 81 views
1

我们开发了一个安装在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> 
+0

当您使用'CreateProcess'尝试启动可执行文件时会发生什么? 'CreateProcess'是否返回错误代码?您是否尝试过使用Process Monitor来跟踪事件的顺序? –

+0

CreateProcess返回错误代码1,这对我没有意义。实际上,由于UAC提示,CreateProcess失败。 – Ghigo

+0

也许没有主题,但: - 为什么当CreateProcess失败时调用'CloseHandle'事件? - 当Wait = False时,你不会调用'CloseHandle' - 如果你的'Filename'将包含空格,并且它不会被双引号,那么你将失败 – kibab

回答

2

Windows UAC使用一些启发式检测安装程序。

http://blogs.msdn.com/b/uac/archive/2006/01/13/512776.aspx

的O/S,使应用程序看起来像一个安装程序 或更新,并会自动调用抬高到具有管理权限/权限运行程序 当用户运行它的决定。这个决定是基于启发式的。下面是一些启发式 检测点,虽然这个名单并不详尽:

  1. 文件名检测 - 查找单词“设置”,“更新”,在文件名 “安装”

我们的设置名称是client_setup.exe,所以即使不需要UAC,也会触发UAC,要求管理权限,完全忽略EXE清单。我们称之为一个功能。

client_setup.exe重命名为client.exe就足够了,然后运行它。没有出现UAC提示并且安装成功完成。

这看起来像是微软最近的一次改变。就在最近4个月前,我们的设置没有错误地启动。

+0

行''requestedExecutionLevel level =“asInvoker”/>'应该足以绕过启发式。我认为'trustInfo'元素必须位于** v2 **名称空间中,而不是** v3 **名称空间中。 – acelent

+0

似乎exe名称覆盖了manifest执行级别。为什么v2改为v3?一些文档? – Ghigo

+0

嗯,我可以问你同样的事情。你尝试过使用** v2 **吗?从[某些](http://msdn.microsoft.com/en-us/library/bb545961.aspx)[MSDN](http://msdn.microsoft.com/en-us/library/bb531381.aspx)[文档(http://msdn.microsoft.com/en-us/library/ws1c2fch。aspx)我可以发现,这些示例如下所示:** v2 **表示'trustInfo'和'security',** v3 **表示'requestedPrivileges'和'requestedExecutionLevel'。 – acelent

0

这并不是说必须是registered to run as a medium integrity process ActiveX控件,它是你从说ActiveX控件启动EXE。

+0

但你如何解释,当activeX保存EXE这个有低强制性设置?在我看来,ActiveX运行的水平很低。 – Ghigo

+0

是的,如果您启用了UAC,则ActiveX始终以低完整性进程运行。对此你可以做任何事情。 – taxilian

+0

因此,您确认管理员完全没有办法将特定ActiveX从低级升级到中级?一些注册表设置,IE设置,域策略? – Ghigo