【发布时间】:2010-09-06 06:17:06
【问题描述】:
对于我的 C# 应用程序,我不想总是在应用程序启动时提示提升,但如果他们选择受 UAC 保护的输出路径,那么我需要请求提升。
那么,如何检查路径是否受 UAC 保护,然后如何在执行过程中请求提升?
【问题讨论】:
标签: c# .net windows-vista uac elevated-privileges
对于我的 C# 应用程序,我不想总是在应用程序启动时提示提升,但如果他们选择受 UAC 保护的输出路径,那么我需要请求提升。
那么,如何检查路径是否受 UAC 保护,然后如何在执行过程中请求提升?
【问题讨论】:
标签: c# .net windows-vista uac elevated-privileges
检测他们是否无法执行某项操作的最佳方法是尝试并捕获UnauthorizedAccessException。
但是,作为@DannySmurf correctly points out,您只能提升 COM 对象或单独的进程。
Windows SDK 交叉技术示例中有一个名为UAC Demo 的演示应用程序。此演示应用程序显示了一种使用提升的进程执行操作的方法。它还演示了如何确定用户当前是否是管理员。
【讨论】:
在执行过程中请求提升要求您:
在 .NET 中,目前没有办法提升正在运行的进程;你必须做上面的一件骇人听闻的事情,但所做的只是给用户一个当前进程正在被提升的外观。
我能想到的检查路径是否被 UAC 提升的唯一方法是在您处于未提升状态时尝试对其进行一些琐碎的写入,捕获异常,提升并重试。
【讨论】:
我不确定它是否对你有任何帮助,但你可以看看这篇博文:
http://haishibai.blogspot.com/2010/01/tiy-try-out-windows-7-uac-using-c-part_26.html
【讨论】:
您可能希望通知用户该路径受到保护,并要求他们将文件输出到“更安全”的区域。这样你的应用就不需要提升了。我确信这取决于您的用户以及您想要做什么,但是我认为让用户知道您将 xyz 转储到 Windows/System32 文件夹中感觉不好,这并不过分。
【讨论】:
如果您的辅助驱动器拥有自己的文件权限,例如您安装了其他 Windows 副本。它会提示。
它还会提示文件是否正在使用,如果您将 Windows 资源管理器打开到同一目录并且使用显示内容的文件预览器选择的文件,有时会出现这种情况......还有一些其他的奇怪之处,但通常你会得到如果文件正在使用或它是敏感目录,则要求文件权限。
如果您确实循环了 FolderBrowserDialog ,请务必通知用户原因,以免他们对您的应用生气。
注意:没有 .net 请求权限的方式确实很臭,也许 p/invoke win32 api...?
【讨论】:
UAC 可以根据其 GUID 提升对象,这(理论上)意味着任何具有 GUID 的类都可以提升,UACDemo 还应该展示如何做到这一点
【讨论】: