C# 需要在没有UAC弹出窗口的情况下提升权限

C# 需要在没有UAC弹出窗口的情况下提升权限,c#,uac,C#,Uac,我有一个应用程序,它是另一个应用程序(我的主应用程序)的启动程序。启动器转到FTP服务器,下载并安装更新。但是,更新可执行文件需要将一些DLL和EXE复制到主应用程序的安装目录中,该目录位于程序文件中。因此,我目前需要提升更新程序的权限 这是一个问题,因为我的应用程序是在引导时启动的,通常只会加载到系统托盘(该应用程序与messenger/skype相当)。如果我在尝试“静默”更新应用程序时在屏幕上弹出UAC警告,那么它就不再那么静默了 我现在看到的避免问题的唯一方法是向所有用户授予程序文件安装

我有一个应用程序,它是另一个应用程序(我的主应用程序)的启动程序。启动器转到FTP服务器,下载并安装更新。但是,更新可执行文件需要将一些DLL和EXE复制到主应用程序的安装目录中,该目录位于程序文件中。因此,我目前需要提升更新程序的权限

这是一个问题,因为我的应用程序是在引导时启动的,通常只会加载到系统托盘(该应用程序与messenger/skype相当)。如果我在尝试“静默”更新应用程序时在屏幕上弹出UAC警告,那么它就不再那么静默了

我现在看到的避免问题的唯一方法是向所有用户授予程序文件安装目录的权限,但我不愿意这样做。还有其他想法吗


我使用的是Windows 7,应用程序是C#。

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

通过设计,无法在提升权限的同时避免提示。如果有办法做到这一点,UAC将变得毫无用处


也就是说,你可以试着围绕这个问题进行设计。而不是让你的程序是一个启动/系统托盘应用程序,你可能想考虑做一个Windows服务做更新。这可以在引导时以管理员身份运行(而不是登录),并且它已经以提升的权限运行


如果您需要一个系统托盘应用程序,它可以是一个单独的应用程序,与服务“对话”。

UAC的全部要点是,未经用户批准,应用程序不能进行私有更改。与其尝试自动更新你的应用程序,也许你可以简单地让用户知道有更新可用,并等待他们要求更新(此时UAC提示将是预期的,因为许多应用程序以这种方式更新)。

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

禁用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

我对被接受的答案投了更高的票,因为它是正确的答案,但是,有时我们确实需要吃蛋糕,也需要吃蛋糕

我发现该工具在批处理文件或启动时运行良好:

可通过巧克力安装:

choco install elevate

使用计划任务,您可以使用管理员帐户运行它们。绕过的是它需要一个提升的帐户来创建它们。谢谢。我想,从我的问题中可以清楚地看出,我正试图吃掉蛋糕,让它保持完整,因为我不想破坏UAC,但我确实想要无声的更新。不过,我非常喜欢服务解决方案。我可能真的会选择这个解决方案。