我目前正在迁移应用程序以使其与UAC兼容。此应用程序提供给非管理员用户,以便他们可以执行非常集中的管理任务(重新启动一项服务,运行安装程序更新...)。
我小心翼翼地红Chris Jackson's blog entry并创建了一个引导程序:
以下是我根据自己的情况调整此博客的方法:
应用程序A使用以下调用启动引导程序:
var processStartInfo = new ProcessStartInfo("ApplicationA")
{
WorkingDirectory = "Path to Application A",
Arguments = "bootstrapper",
UseShellExecute = false,
UserName = credentials.UserName,
Password = credentials.Password,
Domain = credentials.Domain,
CreateNoWindow = true
};
var p = Process.Start(processStartInfo);
Bootstrapper与Application A的可执行文件相同,并以清单文件中定义的 asInvoker 高程启动。它以一个参数开始,该参数告诉Program.cs该进程已在引导程序模式下启动。它没有使用ShellExecute模式(如博客中所述......因此我们可以使用其他帐户启动该过程)。这是Program.cs中启动应用程序B的代码片段:
if (Environment.GetCommandLineArgs().Any(a => "bootstrapper".Equals(a)))
{
var processStartInfo = new ProcessStartInfo(fileName)
{
WorkingDirectory = Path.GetDirectoryName(fileName),
Verb = "runas", // Tried with or without runas...
UseShellExecute = true
};
var p = Process.Start(processStartInfo);
}
应用程序B通过其清单文件以 requireAdministrator 启动。
它在Windows Server 2012 R2上运行正常,但它不在Windows 7下,除非我与管理员帐户同时打开其他会话。这意味着除非我有两个活动会话(一个用于当前用户,一个用于管理员用户),引导程序在Windows 7上调用ShellExecute时失败,但在Windows Server 2012 R2上调用。以下是我在Windows 7下获得的错误消息:
System.ComponentModel.Win32Exception (0x80004005): Unknown error (0xfffffffe)
à System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo)
à System.Diagnostics.Process.Start()
à System.Diagnostics.Process.Start(ProcessStartInfo startInfo)
à ProgramA.Program.StartBootstrapper() dans c:\...\Program.cs:ligne 82
您知道是否有必须启用的魔术政策规则?或者如果我直接使用Win32 API,那么会有一个标志可以解决这个问题吗?