
[英]Launch an application on Vista with non-elevated mode from an elevated application
[英]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.