6

我的应用程序包含一个用于更新应用程序的自我更新程序可执行文件。

更新程序执行的第一步是检查它是否具有对应用程序文件夹的写入权限

IPermission perm = new FileIOPermission(FileIOPermissionAccess.AllAccess, _localApplicationCodebase);

        if (!SecurityManager.IsGranted(perm))
        {
            OnProgressChanged("Security Permission Not Granted \n The updater does not have read/write access to the application's files (" +
                              _localApplicationCodebase + ")",MessageTypes.Error);
            return false;
        }

        OnProgressChanged("Updater have read/write access to local application files at " + _localApplicationCodebase);
        return true;

在 Win7/Vista 下执行时,此代码通过(这意味着根据 CAS,代码确实具有写入权限),但是当我尝试写入文件时,我得到了拒绝访问(并且我确认文件未在使用中)

我了解 Vista/Win7 UAC 正在阻止用户在程序文件夹中写入文件。但是,我不明白的是,如果实际上没有授予许可,为什么会授予许可

问候,

埃里克·吉拉德

PS:如果我使用“以管理员身份运行”运行相同的代码,它工作正常

4

3 回答 3

6

关于 UAC 需要了解的重要一点是,默认情况下,没有代码以管理员权限运行,因此无法写入 Program Files 目录。即使您以管理员身份登录,应用程序也会以标准用户权限启动。

有两种方法可以解决这个问题。您可以让用户使用“以管理员身份运行”菜单项启动应用程序。但这依赖于用户记住一些东西。更好的做法是将清单嵌入到请求管理员权限的可执行文件中。在清单中,将 requestedExecutionLevel 设置为 requireAdministrator。这将导致 UAC 在应用程序启动后立即提示用户输入管理员凭据。

正如 Daniel 所说,最好的解决方案是将更新功能放在单独的应用程序中。您的主应用程序将有一个清单,将 requestedExecutionLevel 设置为“asInvoker”,而您的更新程序应用程序将请求“requireAdministrator”。您的主要应用程序可以使用标准权限运行。但是当需要进行更新时,请使用 Process.Start 启动需要用户输入管理员凭据的更新程序应用程序。

于 2009-12-11T02:58:48.260 回答
4

The best way to write an auto updater is to have a secondary application. The first program calls the second with elevated privileges, prompting UAC. Then the second application can install the patches.

于 2009-11-11T13:53:27.383 回答
1

我不确定这是否是你想要做的,但我发现这篇文章很有帮助。包含的代码可让您检测您的应用程序是否在 Vista 上运行、是否启用了 UAC 以及用户是否已提升。

http://www.itwriting.com/blog/198-c-code-to-detect-uac-elevation-on-vista.html

然后使用 runas 重新启动您的应用程序以让用户提升权限

ProcessStartInfo processInfo = new ProcessStartInfo();
processInfo.Verb = "runas";
processInfo.FileName = Application.ExecutablePath;
Process.Start(processInfo);
于 2010-07-05T21:22:33.763 回答