0

您好已经创建了一个安装程序,可以在用户级别安装应用程序。当我从 cab 文件中提取 setup.exe 并在本地运行时,它不会提示我输入 UAC 并正常安装并安装在用户上下文中。

应用程序和驾驶室经过数字签名。

但是,当我使用一键式安装程序安装它时,它会提示我输入 UAC 并将其安装在管理员上下文中。

任何人都可以阐明为什么相同的 setup.exe 表现不同吗?

我能做些什么来避免这种情况?

我希望我的应用程序在没有管理员权限的情况下安装在用户级别?

4

1 回答 1

0

我的猜测是setup.exe触发UAC 设置兼容性启发式。来自 MSDN:

用户帐户控制:检测应用程序安装并提示提升

当检测到需要提升权限的应用程序安装包时,系统会提示用户输入管理用户名和密码。如果用户输入有效的凭证,则操作会以适用的权限继续。

Windows 会尝试检测某些作为安装程序的应用程序(例如,那些在文件名中包含setupinstallupdate的应用程序)并将尝试自动提升它们。微软将此作为兼容性黑客:

  • 大多数用户不会意识到他们应该右键单击设置应用程序并选择以管理员身份运行
  • 更少的开发人员将他们的安装程序正确标记为requireAdministrator
  • 使用 MSI 的开发人员更少,它知道如何/何时/是否提升为管理员

您可以通知 Windows 您的应用程序不应管理员身份运行。您可以通过将asInvoker选项添加到可执行文件的程序集清单中来做到这一点:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <assemblyIdentity 
            version="1.0.0.0"
            processorArchitecture="X86"
            name="client"
            type="win32"
    /> 

    <description>CodeJunkie Widget Installer</description> 

    <!-- Disable Setup elevation compatibility heuristics since we're named setup.exe -->
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
        <security>
            <requestedPrivileges>
                <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
            </requestedPrivileges>
        </security>
    </trustInfo>
</assembly>
于 2013-12-31T21:48:45.683 回答