繁体   English   中英

对Program Files文件夹的写访问权限

[英]Write Access to Program Files folder

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

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

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:如果我使用“以管理员身份运行”运行相同的代码,则可以正常运行

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

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

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

编写自动更新程序的最佳方法是拥有辅助应用程序。 第一个程序以提升的特权调用第二个程序,提示UAC。 然后,第二个应用程序可以安装补丁。

我不确定这是否是您要尝试的操作,但是我发现这篇文章很有帮助。 随附的代码可让您检测您的应用程序是否在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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM