皮条客我的UAC和关于它的几个问题(Pimp my UAC and a few questions

2019-09-01 14:45发布

我有这样的应用程序,需要做保护路径一些事情(如%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", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
}

所以,我把这个可执行文件从我的主程序,如果失败,因为一个未经授权的访问,它会自行启动显示UAC请求。

我的问题是:

1)我不得不从DLL输出的项目转换为一个EXE,因为我找不到任何方式从DLL要求UAC提升,有没有简单的方法来做到这一点?

2)我还注意到,一些程序显示一个个性化的UAC消息,与节目标志和所有这些事情,让我告诉你一个例子:

我该怎么做我的程序?

3)为了避免进入一个循环时,与提升的权限运行它得到另一个UnauthorizedAccessException我做那件事传递任何ARGS。 你会怎么做来达到同样的目标是什么?

我觉得这是现在所有。 谢谢你的时间。

Answer 1:

1,你无法控制你的托管DLL进程的海拔模式。 您可以授予权限到目标文件夹或注册表为大家在安装过程中 ,如果你能控制的安装过程。

2,你需要通过将被客户信任的证书颁发机构发布的证书签名的程序 。 访问你的本地证书存储区(控制面板 - > Internet选项,内容选项卡,出版商),查看常见的证书颁发机构。

3,当你得到UnauthorizedAccessExceotion,丢给托管EXE或返回指示安全问题的错误值。 您的DLL的调用者,然后决定做什么,比如显示安全错误对话框,告知用户如果程序已经升高(不是域控制器授予权限?),或使用runas命令重新启动的过程中提升模式下 ,如果它没有升高。



Answer 2:

我有同样的问题。 周围的Googling约2天,我发现适合我的需要的唯一解决方案 - 启动具有管理权限的应用程序。 我启动应用程序,检查它是否正在以管理员身份运行。 如果没有-拥有管理权限重新启动它。

    static void Main(string[] args)
    {
        if (NeedElevation(args) && Elevate(args))
        { // If elevastion succeeded then quit.
            return;
        }
        // your code here
    }

    public static bool Elevate(string[] args)
    {
        try
        {
            ProcessStartInfo info = Process.GetCurrentProcess().StartInfo;
            info.Verb = "runas";
            info.Arguments = NoElevateArgument;
            foreach (string arg in args)
            {
                info.Arguments += ' ' + arg;
            }
            info.FileName = Assembly.GetEntryAssembly().Location;

            Process process = new System.Diagnostics.Process();
            process.StartInfo = info;

            process.Start();
        }
        catch (Exception)
        {
            MessageBox.Show("You don't have administrative privileges thus the Automatic Application Updates cannot be started. But the rest of application is available as usually.",
                "Not enough user rights", MessageBoxButtons.OK, MessageBoxIcon.Information);
            return false;
        }

        return true;
    }


文章来源: Pimp my UAC and a few questions about it