【问题标题】:ActiveX cannot run .exe without privilege elevationActiveX 无法在没有特权提升的情况下运行 .exe
【发布时间】:2014-03-05 10:33:01
【问题描述】:

我们开发了一个 ActiveX 表单控件,可以安装在 IE8+ 中。 此控件检查注册表项,然后在需要时下载并安装一个小型设置。 对于管理员来说,在任何 IE 版本 8+ 的 Windows 7 和 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 提示。

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

测试 1

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

我检查了 ICACLS,在 ActiveX 控件下载的 exe 上有一个 Mandatory Label\Low Mandatory Level:(I)(NW)

测试 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>

【问题讨论】:

  • 当您使用CreateProcess 尝试启动可执行文件时会发生什么? CreateProcess 是否返回错误代码?您是否尝试过使用 Process Monitor 来跟踪事件序列?
  • CreateProcess 返回错误代码 1,这对我来说没有意义。事实上,由于 UAC 提示,CreateProcess 失败。
  • 也许题外话了,但是: - 当CreateProcess 失败时,你为什么要调用CloseHandle 事件? - 当Wait=False 时你没有调用CloseHandle - 如果你的Filename 将包含空格,并且不会被双引号,那么你它将失败
  • 感谢您的提示。文件名已经在别处被双引号引起来。 CloseHandle 仅在有要关闭的内容时调用。应该没问题。
  • CreateProcess 首先不应该生成 UAC 提示。如果需要提升,CreateProcess 应该立即失败。你确定 UAC 提示没有在之后可执行文件已经启动?

标签: windows delphi internet-explorer activex uac


【解决方案1】:

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

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

操作系统决定应用程序看起来像安装程序 或更新程序,并会自动调用提升来运行程序 当用户运行它时具有管理权限/特权。这 决策基于启发式。这里有一些启发式 检测点,尽管此列表并不详尽:

  1. 文件名检测 - 查找单词“setup”、“update”、 文件名中的“安装”

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

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

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

【讨论】:

  • &lt;requestedExecutionLevel level="asInvoker"/&gt; 行应该足以绕过启发式。我认为trustInfo 元素必须在 v2 命名空间中,而不是 v3 命名空间中。
  • 似乎 exe 名称覆盖了清单执行级别。为什么是 v2 而不是 v3?一些文档?
  • 好吧,我可以问你同样的问题。您是否尝试过使用 v2?从some MSDN docs 我可以找到,示例如下:trustInfosecurityv2requestedPrivilegesv3requestedExecutionLevel.
  • 我们阅读不同的文件。在我发现的例子中,v3.你知道有什么区别吗?
  • 并非如此。我对此的唯一线索是this,但我认为这是application manifests 的实际架构。
【解决方案2】:

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

【讨论】:

  • 但是你如何解释activeX保存exe时设置了Low Mandatory Level呢?在我看来,ActiveX 的运行级别很低。
  • 是的,如果您启用了 UAC,ActiveX 始终作为低完整性进程运行。对此,您无能为力
  • 所以您确认管理员绝对无法将特定 ActiveX 从低级提升到中级?一些注册表设置、IE 设置、域策略?
  • 您可以将运行它的域添加为受信任域
  • (我的意思是把它添加到受信任的站点列表中)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-19
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
  • 2016-08-22
相关资源
最近更新 更多