当一个方法被调用时,如何在c#代码中激活UAC
本文关键字:代码 UAC 激活 一个 调用 方法 | 更新日期: 2023-09-27 18:14:25
我有一个方法,当它被调用时修改或保存C:' drive中的文件,但如果用户没有访问权限,它会抛出异常。
如果用户允许该方法在C:' drive上进行更改而不是抛出异常,那么如何使用UAC询问用户?
看这篇文章。为了方便起见,我将部分被接受的解决方案张贴出来。
我认为不可能提升当前运行的进程。在Windows Vista/7中,在启动时赋予进程管理员权限。
如果您查看使用UAC的各种程序,您应该看到它们实际上在每次需要执行管理操作时启动一个单独的进程(任务管理器是一个,Paint。.NET是另一个,后者实际上是一个。NET应用程序)。
这个问题的典型解决方案是在启动一个提升的进程时指定命令行参数,这样被启动的进程只知道显示某个对话框,然后在此操作完成后退出。因此,用户很难注意到一个新进程已经启动并退出,而宁愿在同一个应用程序中出现一个新的对话框(特别是如果你用一些黑客手段使提升进程的主窗口成为父进程的子进程)。如果您不需要UI来提升访问,那就更好了。
您可以通过将startInfo对象的Verb属性设置为'runas'来指示新进程应该以更高的权限启动,如下所示:
startInfo.Verb = "runas";
这将导致Windows的行为,好像进程已经启动从资源管理器与"以管理员身份运行"菜单命令。
正如Marco所说,它不能。
您也不能取消已提升的进程。
UAC的安全改进是为了杀死编程提升,因为它是一个巨大的(并且被彻底利用的)威胁向量。
一个很好的方法是将你的过程重新调整为一系列任务。确定那些需要提升的,运行一个"TaskProcessor",将任务传递给它。然后调用程序检查它们是否发生,如果发生则继续。你可以用它来做分组,依赖等等,如果你花点心思,它是很好的和可重用的。
对于一个文件来说似乎有些多余。
请记住,仅仅请求提升并不意味着它将被授予,甚至不意味着被提升的帐户具有所需的特权。如果你不能把这个文件放在根目录下,你的应用程序是否处于有效状态?
如果你支持pre-vista操作系统,XP低权限用户,终端服务等,甚至在W7中关闭UAC,你可能会得到一些明显不合逻辑的行为
我强烈建议你干脆不允许将文件保存到Windows团队说需要额外权限的位置。
换句话说,在文档区域启动另存为对话框,让他们从那里选择。然后,捕获异常并向用户显示缺乏写这些特殊目录的权限。
我认为用户更愿意知道你没有绕过内置的安全性。相信我,我认为IIS不允许我打开记事本并在本地inetpub目录下编辑文件是一种痛苦,但同时我很高兴它确实阻止了我。