如果路径受保护,请求Windows Vista的UAC权限提升?

27

对于我的C#应用程序,我不希望每次启动应用程序时都提示进行提权,但如果他们选择的输出路径受UAC保护,则需要请求提权。

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


使用C#获取按需提升权限(Codeproject) - user12031933
6个回答

26

最好的方法是尝试执行操作并捕获 UnauthorizedAccessException 以检测是否无法执行该操作。

然而,正如 @DannySmurf 正确指出 的那样,您只能提升 COM 对象或单独的进程。

Windows SDK Cross Technology Samples 中有一个演示应用程序叫做 UAC Demo。这个演示应用程序展示了一种使用提升进程执行操作的方法。它还演示了如何查找当前用户是否为管理员。


很好的UAC演示参考,正是我所需要的。非常感谢。有时候真希望能够给予更多的声望! - Ryan
@Ryan 不用谢。我有点沮丧,因为在托管环境中,UAC 看起来很难处理。请随意浏览我的用户资料并给我的其他问题点赞! :) - Adrian Clark
顺便提一下,异常名称是UnauthorizedAccessException,其中Unauthorized中的z是小写。就这样;) - Tute

17

在执行过程中请求提升需要你选择以下方式之一:

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

在.NET中,目前没有办法提升正在运行的进程;你必须使用上述"hackery"方法之一,但这只是为了让用户看起来当前进程被提升了。

我唯一能想到的检查路径是否UAC提升的方法是,在未提升状态下尝试对其进行一些微不足道的写入,捕获异常,然后提升并再次尝试。


8
请注意,这不是 .NET 的限制 - 它是用户账户控制系统的普遍限制。 - Billy ONeal
5
请注意,这不是UAC的限制——而是Windows NT安全模型的一般限制(运行中的进程无法更改其安全令牌)。 - Ian Boyd
2
请注意,这是一件好事 - 否则恶意攻击者可能会将代码注入到预提升过程中,而此代码将与该进程一起被提升。 - ghord

4

1

您可能需要通知用户该路径受保护,并要求他们将文件输出到“更安全”的区域。这样,您的应用程序就不需要提升权限。我相信这取决于您的用户和您想要做什么,但是我认为友好地让用户知道您不希望将xyz倾倒到Windows / System32文件夹中并不过分。


-1

如果您的辅助驱动器具有自己的文件权限,比如说您在其上安装了另一个Windows副本,那么它会提示。

如果文件正在使用中,也会提示,这有时会发生,如果您将Windows资源管理器打开到相同的目录并选择了文件预览器以显示内容...还有一些其他奇怪的情况,但通常如果文件正在使用或者它是敏感目录,您需要请求文件权限。

如果您循环使用FolderBrowserDialog,请确保告知用户原因,以免他们对您的应用程序感到不满。

注意:很遗憾没有.NET的方式来请求权限,也许可以使用P/Invoke Win32 API...?


P/Invoking不会改变任何事情;无论您是托管代码还是本机代码,UAC的规则都是相同的。这就是COM、外部进程或失败。 - Chris Charabaruk

-1

用户账户控制(UAC)可以根据对象的GUID提升权限,这意味着(理论上)任何具有GUID的类都可以被提升权限。 UAC演示还应该展示如何实现此操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接