我正在编写一个应用程序,为需要将数据保存到程序文件的程序下载并安装插件(对于相关程序)。现在这在xp和vista上运行正常,uac已禁用,但由于虚拟文件夹,它在普通vista上失败。
如果每次应用程序启动时都需要请求管理员权限,那么如何解决这个问题呢?
P.S。程序用c ++编写,相对于2005年
编辑:文件系统虚拟文件夹:http://www.codeproject.com/KB/vista-security/MakingAppsUACAware.aspx
答案 0 :(得分:9)
仅在安装期间写入Program Files。之后,写入用户文件夹。
您可以稍后提升应用程序权限,但您只是推迟提示。 UAC的重点是防止随机应用程序写入需要管理员权限的文件夹。 (好吧,不是全部,而是很大一部分。)
您可以创建具有管理员权限的服务并向其发送命令以将下载的文件移动到所需的目标目录中,但如果您不仔细设计,这会打开用户的系统以被其他应用程序滥用。
This article talks关于让应用与UAC很好地协作。此外,see this article此处。
答案 1 :(得分:1)
当我与他们交谈时,Microsoft向我推荐必须编写第二个应用程序,您需要显示该应用程序需要管理权限。您可以使用此应用程序将文件从安全位置(例如用户programdata目录)部署到程序文件目录(请注意,如果您的DLL未签名,那么这是一个巨大的安全漏洞,因为病毒/恶意用户可能会操纵函数调用之前的文件)。
您的非管理应用可以调用此应用程序,该应用程序将触发UAC。了解UAC的人不会关心并乐意点击您的应用程序。那些讨厌它的人会把它关掉。如果用户取消UAC对话框,则启动新进程(需要管理员权限)的调用将抛出win32异常,因此请注意抓住它。
vista中的问题是,如果您不是管理员,它会尝试通过虚拟化您的程序文件目录来帮助您。根据设计,除非您是管理员,否则无法写入程序文件目录。
另一种选择是将所有“更新”创建为MSI更新。这样,Windows安装程序将为您触发UAC,您可以为您的软件等提供徽标。
选项3是使用clickonce部署,它允许您在没有UAC的情况下自动更新您的程序,但您居住在用户系统的沙箱中,这可能不适用于您的应用程序的当前设计。
答案 2 :(得分:0)
我通过制作一个可以完成我需要的工作的Windows服务来解决这个问题,并且只在应用程序运行时运行。