ActiveX无法在没有权限提升的情况下运行.exe

时间:2014-03-05 10:33:01

标签: windows delphi internet-explorer activex uac

我们开发了一个安装在IE8 +中的ActiveX表单控件。 此控件检查注册表项,然后根据需要下载并安装小型安装程序。 对于管理员,一切都在Windows 7和8上按预期工作,任何IE版本8 +。

对于非管理员用户,控件运行(必须由管理员安装,但没关系),它会在路径C:\ users \ user \ AppData \ Local \ Temp \ Low中下载可执行文件client_setup.exe \但是当它尝试运行可执行文件(shellexec或createprocess产生相同的结果)时,需要一个管理帐户并出现UAC提升提示。

如果非管理员用户下载并安装相同的设置,则不需要管理权限(我们在exe清单中声明了这一点)。此设置完全安装在用户配置文件和HKCU注册表中。

据我所知,ActiveX控件以IE进程等低权限运行。但是为什么在这种情况下需要提升?我们的设置不需要特权。

我尝试在低权限提升策略例外中添加ActiveX控件

HKEY_LOCAL_MACHINE\SOFTWARE\\Microsoft\Internet Explorer\Low Rights\ElevationPolicy

但仍会出现UAC提示。

我想允许为所有用户运行此设置。我们可以作为管理员运行一次脚本来授予整个系统权限。有人可以帮忙完成这项任务吗?

TEST 1

作为非管理员用户,我尝试手动安装ActiveX下载的.exe,我收到系统错误,无法写入临时目录。如果我使用Internet Explorer下载相同的exe文件,我可以毫无问题地安装它。

我使用ICACLS检查并通过ActiveX控件下载的exe有一个强制标签\低强制级别:(I)(NW)

TEST 2

Taxilian建议将网站添加到可信站点。作为非管理员用户,ActiveX现在将.exe设置保存到C:\ users \ user \ AppData \ Local \ Temp(no Low),。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>

2 个答案:

答案 0 :(得分:2)

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

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

  

O / S决定应用程序看起来像安装程序   或更新程序,并将自动调用高程来运行该程序   用户运行时具有管理权限/特权。这个   决定是基于启发式的。以下是一些启发式方法   检测点,虽然这个清单并非详尽无遗:

     
      
  1. 文件名检测 - 查找“设置”,“更新”字样,   “安装”文件名
  2.   

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

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

这看起来像微软最近的变化。最近4个月前,我们的设置启动时没有错误。

答案 1 :(得分:0)

不是必须为registered to run as a medium integrity process的activex控件,而是从所述activex控件启动的EXE。