需要提升权限但不弹出UAC提示

7
我有一个应用程序,它是另一个应用程序(我的主要应用程序)的启动器。启动器会去FTP服务器下载更新并安装它们。然而,更新可执行文件需要将一些DLL和EXE文件复制到主应用程序的安装目录中,该目录位于Program Files中。因此,我目前需要提升更新程序的权限。
这是一个问题,因为我的应用程序在启动时会自动加载到系统托盘中(该应用程序类似于Messenger/Skype)。如果我在试图“静默”更新应用程序时弹出UAC警告,那么它就不再是静默的了。
我目前唯一看到避免这个问题的方法是给所有用户授予程序文件安装目录的权限,但我不愿意这样做。还有其他想法吗?
我使用的是Windows 7,应用程序是用C#编写的。

3
可以使用计划任务来运行它们,并且需要使用管理员账户来运行。而需要绕过的问题是,要创建计划任务需要使用提升权限的账户。 - Hans Passant
4个回答

13

这样做将违反用户访问控制的基本原则。

根据设计,无法在规避提示的情况下提升权限。如果存在这样的方式,那么用户访问控制将变得无用。


话虽如此,您可以尝试解决这个问题并绕过它。相比于将程序作为启动/系统托盘应用程序,您可以考虑创建一个Windows服务来进行更新。该服务可以在启动时以管理员身份运行(而不是登录时),且已经具备升级权限。

如果您需要一个系统托盘应用程序,则可以创建一个单独的应用程序与该服务“通信”。


谢谢。我认为从我的问题中可以清楚地看出,我试图吃掉整个蛋糕,因为我不想破坏UAC,但我确实希望进行静默更新。虽然我非常喜欢服务解决方案。我可能会选择那个解决方案。 - Eldad Mor

2
整个UAC的意义在于,应用程序不能在未经用户批准的情况下进行特权更改。与其尝试自动更新您的应用程序,也许您可以简单地让用户知道有可用的更新,并等待他们要求更新(此时将期望出现UAC提示,因为许多应用程序都是通过这种方式更新的)。

0

正如其他人所说,UAC是为了防止这种行为的发生,但您可以尝试在安装后禁用UAC,然后启用UAC,因为我假设您的“用户”是本地业务。您可以将此推送到批处理文件中,并使用psexec执行它,因为我认为您可以在客户端机器上远程执行它,而无需安装任何东西。

禁用UAC

C:\Windows\System32\cmd.exe /k %windir%\System32\reg.exe ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v EnableLUA /t REG_DWORD /d 0 /f

启用UAC

C:\Windows\System32\cmd.exe /k %windir%\System32\reg.exe ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v EnableLUA /t REG_DWORD /d 1 /f

-1

我点赞了被接受的答案,因为它是正确的,但有时我们确实需要两全其美。

我发现这个工具可以很好地从批处理文件或启动中使用:

https://github.com/alexey-gusarov/elevate

可以通过chocolatey安装:
choco install elevate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接