繁体   English   中英

配置应用程序以在提升特权和非提升特权中运行

[英]Configuring an application to run both in elevated and non-elevated privledges

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

我的问题是,如何配置C#应用程序来执行此操作? 我知道我的应用程序可以使应用程序清单以提升的特权运行,但是我该如何复制上面刚刚解释的行为呢?

要使用其他提升的应用程序执行此操作,可以使用“启动器”(或启动器是“常规”应用程序)。

如果需要三个应用程序,则可能需要一个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());
        }
    }
}

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

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

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


但是考虑一下用户体验:

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

从这个角度来看,Microsoft推荐的方法非常有效:以普通用户身份运行,直到您真正需要提升为止。 用户界面中应清楚标记所有高程点。 您仍然可以使用相同的exe文件来运行非提升实例和提升实例,但是您必须实现一种通信机制,以便非提升实例可以提供所有数据来执行用户请求的操作。 一旦启动高架实例,就可以使其继续运行并退出非高架实例,以便无需高架即可执行其他操作。

因此,这意味着需要更多的精力 ,但要获得更好的用户体验

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM