对于我的 C# 应用程序,我不想总是在应用程序启动时提示提升,但如果他们选择受 UAC 保护的输出路径,那么我需要请求提升。

那么,如何检查路径是否受 UAC 保护,然后如何在执行中请求提升?

有帮助吗?

解决方案

检测他们是否无法执行某项操作的最佳方法是尝试该操作并捕获 UnauthorizedAccessException.

然而作为@丹尼·斯莫夫 正确地指出 您只能提升 COM 对象或单独的进程。

Windows SDK 交叉技术示例中有一个演示应用程序,名为 UAC演示. 。该演示应用程序展示了一种使用提升的进程执行操作的方法。它还演示了如何查明用户当前是否是管理员。

其他提示

在执行过程中请求提升需要您:

  1. 使用提升的 COM 控件,这会弹出提示
  2. 启动从一开始就提升的第二个进程。

在 .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/调用win32 api...?

UAC 可以根据 GUID 提升对象,这(理论上)意味着任何具有 GUID 的类都可以提升,UACDemo 还应该展示如何执行此操作

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top