对于我的C#应用程序,我不想总是在应用程序启动时提示提升,但如果他们选择了受UAC保护的输出路径,那么我需要请求提升。
那么,我如何检查路径是否受到UAC保护,然后如何请求提升执行?
答案 0 :(得分:26)
检测他们是否无法执行操作的最佳方法是尝试并捕获UnauthorizedAccessException
。
但是,作为@ DannySmurf correctly points out,您只能提升COM对象或单独的进程。
Windows SDK Cross Technology Samples中有一个名为UAC Demo的演示应用程序。此演示应用程序显示了使用提升的进程执行操作的方法。它还演示了如何确定用户当前是否为管理员。
答案 1 :(得分:16)
请求提升中期执行要求您:
在.NET中,目前无法提升正在运行的进程;你必须做一件上面的hackery事情,但所有这一切都会给用户提供当前进程升级的外观。
我能想到的唯一方法是检查一个路径是否是UAC升级的,就是在你处于未升级状态时尝试对它进行一些简单的写操作,捕获异常,提升并重试。
答案 2 :(得分:3)
我不确定这对你有什么帮助,但你可以看一下这篇博文:
http://haishibai.blogspot.com/2010/01/tiy-try-out-windows-7-uac-using-c-part_26.html
答案 3 :(得分:1)
您可能希望通知用户该路径受到保护,并要求他们将文件输出到“更安全”的区域。这样您的应用就不需要提升了。我确定这取决于你的用户以及你想要做什么,但我不认为让用户知道你不能将xyz转储到Windows / System32文件夹中是太多了。
答案 4 :(得分:-1)
如果您的辅助驱动器拥有自己的文件权限,比如说您安装了其他Windows副本。它会提示。
它还会提示文件是否正在使用中,如果您将Windows资源管理器打开到同一目录并且文件预览器显示内容选择了文件,有时会出现这种情况...还有一些其他的奇怪之处,但通常会得到如果文件正在使用或者它是敏感目录,则询问文件权限。
如果您循环使用FolderBrowserDialog,请务必通知用户原因,以免他们对您的应用感到生气。
注意:它确实没有.net方式请求许可,也许p /调用win32 api ...?
答案 5 :(得分:-1)
UAC可以根据他们的GUID提升对象,这(理论上)意味着任何具有GUID的类都可以提升,UACDemo也应该显示如何执行此操作