配置应用程序以提升和非提升权限运行

时间:2012-09-20 15:33:24

标签: c# winforms uac

前几天,我遇到了一个应用程序,当你运行它时,它会出现UAC屏幕并请求以管理员权限运行。在UAC屏幕上单击“是”会像正常一样运行应用程序。有趣的是,如果单击“否”,应用程序仍会运行,而不是退出,但在有限的用户帐户中运行(当然功能较少)。

我的问题是,如何配置我的C#应用​​程序来执行此操作?我知道我的应用程序可以有一个应用程序清单,可以在提升的权限下运行,但是我如何复制上面刚才解释的那种行为呢?

2 个答案:

答案 0 :(得分:1)

要使用不同的提升的应用程序执行此操作,您可以使用“启动器”(或启动器是“普通”应用程序)。

如果你想要三个应用程序,你可能会有一个WinForms启动器:

[STAThread]
static void Main()
{
    const int ERROR_CANCELLED = 1223;
    try
    {
        Process.Start("el.exe");
        // ran el in elevated node...
    }
    catch (Win32Exception ex)
    {
        if (ex.NativeErrorCode == ERROR_CANCELLED)
        {
            Process.Start("normal.exe");
        }
    }
}

如果您正在执行两个应用程序,则可以执行以下操作:

[STAThread]
static void Main()
{
    const int ERROR_CANCELLED = 1223;
    try
    {
        Process.Start("el.exe");
        // ran el in elevated node...
    }
    catch (Win32Exception ex)
    {
        if (ex.NativeErrorCode == ERROR_CANCELLED)
        {
            // "continue" as un-elevated app.
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

答案 1 :(得分:0)

您可以将所有代码保存在一个应用程序中。应用程序清单不会请求运行应用程序升级,它使用asInvoker级别。

当应用程序启动时,它会尝试重新启动自身。我的意思是它用runas动词开始另一个过程。如果成功,则第一个实例就存在。

如果提升不成功,则会继续以有限的功能运行。


但请考虑用户体验:

并非世界上每个人都以管理员身份工作。对于他们来说,提升看起来不像点击Continue按钮,UAC会要求他们提供管理员的用户名和密码。

从这个角度来看,微软推荐的方法效果很好:以普通用户身份运行,直到真正需要提升为止。应在UI中清楚地标记所有高程点。您仍然可以使用相同的exe文件来运行非提升和提升的实例,但您必须实现通信机制,以便非提升的实例可以提供所有数据来执行用户请求的操作。一旦启动了提升实例,就可以使其保持运行并退出非提升实例,这样就可以在不提升的情况下执行其他操作。

因此,它意味着更多努力,但更多更好的用户体验