我有这个应用程序需要在受保护的路径中做一些事情(如%PROGRAMFILES%),我知道我应该使用%APPDATA%,但我现在无法改变它.我已经隔离了所有可能需要UAC出现在另一个项目上的东西,这里是一个示例代码:
using System; using System.Diagnostics; using System.IO; using System.Windows.Forms; class Class1 { static void Main(string[] args) { try { File.CreateText(Path.Combine(Application.StartupPath,"something.txt")); } catch (UnauthorizedAccessException ex) { MessageBox.Show(ex.Message,"UnauthorizedAccessException",MessageBoxButtons.OK,MessageBoxIcon.Error); if (args.Length == 0) { Process proc = new Process(); proc.StartInfo.FileName = Application.ExecutablePath; proc.StartInfo.Arguments = "not again"; proc.StartInfo.Verb = "runas"; proc.Start(); } else { MessageBox.Show("Exit to avoid loop."); } } catch (Exception ex) { MessageBox.Show(ex.Message,"Exception",MessageBoxIcon.Error); } } }
所以,我从我的主程序中调用这个可执行文件,如果由于未经授权的访问而失败,它将自动启动显示UAC请求.
我的问题是:
1)我不得不将项目输出从DLL转换为EXE,因为我找不到任何方法从DLL请求UAC提升,有没有简单的方法呢?
2)我还注意到有些程序显示了个性化的UAC消息,带有程序徽标和所有这些东西,让我给大家展示一个例子:
我怎么能为我的程序做到这一点?
3)为了避免在使用提升的权限运行时进入循环,它会获得另一个UnauthorizedAccessException我做了那个传递任何args的东西.你会做些什么来实现同样的目标?
我想这就是现在.谢谢你的时间.
解决方法
1您无法控制托管DLL的进程的提升模式.如果您可以控制安装过程,则可以为每个人
during the install process提供
grant permission to the target folder or registry.
2您需要sign the program with a certificate published by a certificate authority that would be trusted by the client.访问您当地的证书商店(控制面板 – >互联网选项,内容标签,发布商)以查看常见的证书颁发机构.
3当您获得UnauthorizedAccessExceotion时,将其抛给托管exe或返回指示安全问题的错误值.然后,DLL的调用者决定要做什么,例如显示安全错误对话框以通知用户程序是否已被提升(域控制器未授予权限?),如果未提升,则为restarting the process in elevated mode using the runas command.