调用方法时如何在c#代码中激活UAC?

时间:2011-11-14 14:49:22

标签: c# uac

我有一个方法在调用C:\驱动器时修改或保存文件,但是如果用户没有访问权限,则抛出异常。

如果允许该方法在C:\驱动器上进行更改而不是抛出异常,如何向用户询问UAC?

3 个答案:

答案 0 :(得分:5)

请参阅SO上的this post。为了方便起见,我发布了部分已接受的解决方案。

我认为不可能提升当前正在运行的流程。它内置于Windows Vista / Seven中,管理员权限在启动时提供给进程 如果您查看使用UAC的各种程序,您应该看到每次需要执行管理操作时它们实际上都会启动一个单独的进程(任务管理器是一个,Paint.NET是另一个,后者实际上是.NET应用程序) )。

此问题的典型解决方案是在启动提升的进程时指定命令行参数,以便启动的进程只知道显示某个对话框,然后在此操作完成后退出。因此,用户几乎不会注意到新进程已经启动然后退出,而是看起来好像在同一个应用程序中打开了一个新对话框(特别是如果你有一些hackery来制作主窗口)提升过程父进程的子进程)。如果您不需要用于提升访问的UI,那就更好了。

您可以通过将startInfo对象的Verb属性设置为'runas'来指示应使用提升的权限启动新进程,如下所示:

startInfo.Verb = "runas";

这将导致Windows的行为就像使用“以管理员身份运行”菜单命令从资源管理器启动进程一样。

答案 1 :(得分:2)

正如Marco所说,它不能。

你也无法阻止提升过程。

UAC的安全改进是为了扼杀程序化提升,因为它是一个巨大的(并且被彻底利用的)威胁载体。

一种很好的方法是将您的过程重新设置为一系列任务。确定需要提升的那些,运行“TaskProcessor”,将任务传递给它。 调用程序然后检查它们是否已经发生,如果是这样的话。 你可以用这个做分组,依赖等等,如果你考虑一下,这很好,可以重复使用。

对于一个文件,似乎有点过分。

请记住,只是请求提升并不意味着它将被授予,甚至提升的帐户具有所需的权限。因此,如果您无法将该文件放在根目录上,那么您的应用程序是否处于有效状态。

此外,如果您支持pre-vista操作系统,XP低权限用户,终端服务等,甚至UAC在W7中关闭,您仍然可以获得一些看似不合逻辑的行为。

答案 2 :(得分:1)

我强烈建议您不要将文件保存到Windows团队所说的需要额外权限的位置。

换句话说,在“文档”区域中启动“另存为”对话框,让它们从那里进行选择。然后,捕获异常并向用户显示缺少写入这些特殊目录的特权。

我认为用户更愿意知道您没有绕过内置安全性。相信我,我认为IIS不允许我打开记事本并在我的本地inetpub目录下编辑文件是一种痛苦,但与此同时我很高兴它会阻止我。