权限只能在进程启动时提升;无法提升正在运行的进程的权限。为了提升现有应用程序,必须使用动词“runas”创建应用程序进程的新实例:
private static string ElevatedExecute(NameValueCollection parameters)
{
string tempFile = Path.GetTempFileName();
File.WriteAllText(tempFile, ConstructQueryString(parameters));
try
{
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.UseShellExecute = true;
startInfo.WorkingDirectory = Environment.CurrentDirectory;
Uri uri = new Uri(Assembly.GetExecutingAssembly().GetName().CodeBase);
startInfo.FileName = uri.LocalPath;
startInfo.Arguments = "\"" + tempFile + "\"";
startInfo.Verb = "runas";
Process p = Process.Start(startInfo);
p.WaitForExit();
return File.ReadAllText(tempFile);
}
catch (Win32Exception exception)
{
return exception.Message;
}
finally
{
File.Delete(tempFile);
}
}
用户确认以管理员身份执行程序后,在没有UI的情况下执行同一应用程序的另一个实例;一个可以显示在没有提升权限的情况下运行的 UI,另一个可以在后台运行并具有提升的权限。第一个进程一直等到第二个进程完成执行。有关更多信息和工作示例,您可以查看MSDN 存档。
为了防止在一些冗长的过程中出现所有这些对话框恶作剧,您需要通过在应用程序中嵌入适当的清单以要求“highestAvailable”执行级别来以提升的权限运行整个主机进程:这将导致 UAC 提示在您的应用程序启动后立即出现,并导致所有子进程以提升的权限运行而无需额外提示。