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

Posted

技术标签:

【中文标题】如果路径受到保护,请求 Windows Vista UAC 提升?【英文标题】:Request Windows Vista UAC elevation if path is protected? 【发布时间】:2010-09-06 06:17:06 【问题描述】:

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

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

【问题讨论】:

Getting Elevated Privileges on Demand using C# (Codeproject) 【参考方案1】:

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

但是,作为@DannySmurf correctly points out,您只能提升 COM 对象或单独的进程。

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

【讨论】:

很好地参考了 UAC 演示,正是我所需要的。非常感谢。希望我有时能提供更多的代表! @Ryan 不客气。我有点沮丧 UAC 在托管环境中的难度。随意浏览我的用户资料并支持我的其他问题! :) 顺便说一句,异常名称是 UnauthorizedAccessException,z 在 Unauthorized。就是这样;)【参考方案2】:

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

    使用提升的 COM 控件,这将显示提示 启动从一开始就提升的第二个进程。

在 .NET 中,目前没有办法提升正在运行的进程;你必须做上面的一件骇人听闻的事情,但所做的只是给用户一个当前进程正在被提升的外观。

我能想到的检查路径是否被 UAC 提升的唯一方法是在您处于未提升状态时尝试对其进行一些琐碎的写入,捕获异常,提升并重试。

【讨论】:

请注意,这不是 .NET 限制——它是用户帐户控制系统的一般限制。 请注意,这不是 UAC 限制——它是 Windows NT 中安全模型的一般限制(正在运行的进程不能更改其安全令牌)。 请注意,这是一件好事——否则恶意攻击者可以将代码注入到预提升进程中,并且此代码将与此进程一起被提升。【参考方案3】:

我不确定它是否对你有任何帮助,但你可以看看这篇博文:

http://haishibai.blogspot.com/2010/01/tiy-try-out-windows-7-uac-using-c-part_26.html

【讨论】:

【参考方案4】:

您可能希望通知用户该路径受到保护,并要求他们将文件输出到“更安全”的区域。这样你的应用就不需要提升了。我确信这取决于您的用户以及您想要做什么,但是我认为让用户知道您将 xyz 转储到 Windows/System32 文件夹中感觉不好,这并不过分。

【讨论】:

【参考方案5】:

如果您的辅助驱动器拥有自己的文件权限,例如您安装了其他 Windows 副本。它会提示。

它还会提示文件是否正在使用,如果您将 Windows 资源管理器打开到同一目录并且使用显示内容的文件预览器选择的文件,有时会出现这种情况......还有一些其他的奇怪之处,但通常你会得到如果文件正在使用或它是敏感目录,则要求文件权限。

如果您确实循环了 FolderBrowserDialog ,请务必通知用户原因,以免他们对您的应用生气。

注意:没有 .net 请求权限的方式确实很臭,也许 p/invoke win32 api...?

【讨论】:

P/Invoking 不会改变任何东西;无论您是托管的还是本地的,UAC 的规则都是相同的。它是 COM、外部进程或 bust。【参考方案6】:

UAC 可以根据其 GUID 提升对象,这(理论上)意味着任何具有 GUID 的类都可以提升,UACDemo 还应该展示如何做到这一点

【讨论】:

以上是关于如果路径受到保护,请求 Windows Vista UAC 提升?的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows Vista 上请求 Java 应用程序的管理员权限

哪里是存储与XP,Vista和Windows 7兼容的日志文件的安全位置?

Windows Vista 中 %allusersprofile% 文件夹的位置?

如果继承类型受到保护,我可以使基类的指针指向派生对象吗? [复制]

vista更新后每次关闭IE总出现数据执行保护怎么解决

在 Windows 2008/7/Vista 中使 Windows 服务蜂鸣