前几天,我遇到了一个应用程序,当你运行它时,它会出现UAC屏幕并请求以管理员权限运行。在UAC屏幕上单击“是”会像正常一样运行应用程序。有趣的是,如果单击“否”,应用程序仍会运行,而不是退出,但在有限的用户帐户中运行(当然功能较少)。
我的问题是,如何配置我的C#应用程序来执行此操作?我知道我的应用程序可以有一个应用程序清单,可以在提升的权限下运行,但是我如何复制上面刚才解释的那种行为呢?
答案 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文件来运行非提升和提升的实例,但您必须实现通信机制,以便非提升的实例可以提供所有数据来执行用户请求的操作。一旦启动了提升实例,就可以使其保持运行并退出非提升实例,这样就可以在不提升的情况下执行其他操作。
因此,它意味着更多努力,但更多更好的用户体验。