在 vista 中避免 UAC

Posted

技术标签:

【中文标题】在 vista 中避免 UAC【英文标题】:Avoiding UAC in vista 【发布时间】:2009-01-15 01:13:26 【问题描述】:

我正在编写一个应用程序,该应用程序为需要将数据保存到程序文件(用于相关程序)的程序下载和安装插件。现在这在禁用 uac 的 xp 和 vista 上工作正常,但是由于虚拟文件夹,它在普通 vista 上失败。

如果每次应用启动时都不需要请求管理员权限,如何解决这个问题?

附:程序是用 c++ 编写的,vis 2005

编辑:文件系统虚拟文件夹:http://www.codeproject.com/KB/vista-security/MakingAppsUACAware.aspx

【问题讨论】:

究竟是什么触发了 UAC?嗯,请原谅我的无知,但什么是虚拟文件夹? 为什么每次应用启动时插件都需要写入 Program Files 中的其他文件夹?不是只有在安装附加组件时才会发生吗?您可能希望更清楚地了解您正在尝试做的事情......绕过 UAC 似乎是更大设计问题的症状。 虚拟文件夹是 vista 保存文件的地方,而不是普通文件夹。例如,当保存到程序文件时,vista 会将其重定向到用户文档设置中的文件夹,因此对于系统的其他用户,该文件永远不会存在。 Romandas,这是真的,但是,该应用程序会自动更新插件,并可能导致提示经常出现,因此想要避免它。 @Lodle - 对,但 UAC 的目的是警告用户您正在设计产品的行为。写入其他程序安装区域的程序是一种经典的恶意软件技术。 【参考方案1】:

仅在安装期间写入程序文件。之后,写入用户文件夹。

您可以稍后提升应用权限,但只会延迟提示。 UAC 的全部意义在于防止随机应用程序写入需要管理员权限的文件夹。 (好吧,不是全部,而是很大一部分。)

您可以创建一个具有管理员权限的服务并向其发送命令以将下载的文件移动到所需的目标目录中,但是如果您没有非常仔细地设计它,这会使用户的系统被其他应用程序滥用。

This article talks 关于如何让应用与 UAC 完美配合。另外,see this article 在这里。

【讨论】:

我不能,因为我需要在程序文件中为其他程序安装插件 您可以将插件存储在另一个不需要管理员权限的目录中吗?【参考方案2】:

当我与他们交谈时,Microsoft 向我建议必须编写第二个应用程序,这表明您需要管理权限。您使用此应用程序将文件从安全位置(例如用户程序数据目录)部署到程序文件目录(请注意,如果您的 DLL 未签名,那么这是一个巨大的安全漏洞,因为病毒/恶意用户可以操纵函数调用之前的文件)。

您的非管理应用程序可以调用此应用程序,该应用程序将触发 UAC。懂UAC的人不会在意,会开心的点击你的应用。讨厌它的人会关掉它。如果用户取消 UAC 对话框,则启动新进程(需要管理员权限)的调用将引发 win32 异常,因此请注意捕捉它。

vista 的问题在于,如果您不是管理员,它会尝试通过虚拟化程序文件目录来帮助您。按照设计,除非您是管理员,否则您无法写入程序文件目录。

另一种选择是将所有“更新”创建为 MSI 更新。这样,Windows 安装程序将为您触发 UAC,您可以为您的软件等提供徽标。

选项 3 是使用 clickonce 部署,这将允许您在没有 UAC 的情况下自动更新您的程序,但您生活在用户系统上的沙箱中,这可能不适用于您的应用程序的当前设计。

【讨论】:

服务在 uac 方面与普通应用程序有什么不同吗?也许这会是一种更好的方式来提供一个更新的服务。【参考方案3】:

我通过创建一个可以完成我需要的工作并且只在应用程序运行时运行的 Windows 服务来绕过 uac。

【讨论】:

以上是关于在 vista 中避免 UAC的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# 调用另一个进程时避免 UAC 提示

如果路径受到保护,请求 Windows Vista UAC 提升?

Vista/7 UAC:如何降低进程权限

vista下开机启动 简单绕过UAC的方法(自己使用runas参数重新启动自己,有点意思)

在带有 UAC 的 Vista 上使用带有 Windows AccessCheck() 的 SSPI (NTLM) Api

遍历窗口权限问题