对于我的C#应用程序,我不希望每次启动应用程序时都提示进行提权,但如果他们选择的输出路径受UAC保护,则需要请求提权。
那么,我该如何检查路径是否受UAC保护,然后如何在执行过程中请求提权?
对于我的C#应用程序,我不希望每次启动应用程序时都提示进行提权,但如果他们选择的输出路径受UAC保护,则需要请求提权。
那么,我该如何检查路径是否受UAC保护,然后如何在执行过程中请求提权?
最好的方法是尝试执行操作并捕获 UnauthorizedAccessException
以检测是否无法执行该操作。
然而,正如 @DannySmurf 正确指出 的那样,您只能提升 COM 对象或单独的进程。
Windows SDK Cross Technology Samples 中有一个演示应用程序叫做 UAC Demo。这个演示应用程序展示了一种使用提升进程执行操作的方法。它还演示了如何查找当前用户是否为管理员。
在执行过程中请求提升需要你选择以下方式之一:
在.NET中,目前没有办法提升正在运行的进程;你必须使用上述"hackery"方法之一,但这只是为了让用户看起来当前进程被提升了。
我唯一能想到的检查路径是否UAC提升的方法是,在未提升状态下尝试对其进行一些微不足道的写入,捕获异常,然后提升并再次尝试。
我不确定这对你是否有所帮助,但你可以看一下这篇博客文章:
http://haishibai.blogspot.com/2010/01/tiy-try-out-windows-7-uac-using-c-part_26.html
该文章介绍了如何使用C#尝试Windows 7 UAC,如果你对此感兴趣,可以去阅读。您可能需要通知用户该路径受保护,并要求他们将文件输出到“更安全”的区域。这样,您的应用程序就不需要提升权限。我相信这取决于您的用户和您想要做什么,但是我认为友好地让用户知道您不希望将xyz倾倒到Windows / System32文件夹中并不过分。
如果您的辅助驱动器具有自己的文件权限,比如说您在其上安装了另一个Windows副本,那么它会提示。
如果文件正在使用中,也会提示,这有时会发生,如果您将Windows资源管理器打开到相同的目录并选择了文件预览器以显示内容...还有一些其他奇怪的情况,但通常如果文件正在使用或者它是敏感目录,您需要请求文件权限。
如果您循环使用FolderBrowserDialog,请确保告知用户原因,以免他们对您的应用程序感到不满。
注意:很遗憾没有.NET的方式来请求权限,也许可以使用P/Invoke Win32 API...?
用户账户控制(UAC)可以根据对象的GUID提升权限,这意味着(理论上)任何具有GUID的类都可以被提升权限。 UAC演示还应该展示如何实现此操作。