如何从非管理员帐户以管理员用户身份启动需要管理员权限的程序

本文关键字:管理员 启动 权限 程序 身份 用户 | 更新日期: 2023-09-27 18:25:41

设计流程:非管理员用户-->程序A(非管理员)-->程序B(需要管理员)

我正在编写一个程序来启动一个需要非管理员帐户的管理员权限的程序。该程序在任何用户启动时启动,并以具有管理权限的不同用户身份启动第二个程序(需要管理权限)。我遇到的问题是,该程序说,要以不同的用户身份启动程序,需要管理员权限。我知道这不是真的,所以我知道我的代码中有不正确的地方来启动第二个进程。

代码如下:

try
{
    ProcessStartInfo myProcess = new ProcessStartInfo(path);
    myProcess.UserName = username;
    myProcess.Password = MakeSecureString(password);
    myProcess.WorkingDirectory = @"C:'Windows'System32";
    myProcess.UseShellExecute = false;
    myProcess.Verb = "runas"; //Does not work with or without this command
    Process.Start(myProcess);
}

例外情况如下:

System.ComponentModel.Win32Exception (0x80004005): The requested operation requires elevation
   at System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo)
   at System.Diagnostics.Process.Start()
   at System.Diagnostics.Process.Start(ProcessStartInfo startInfo)
   at Loader.Program.RunProgram(String path, String username, String password)

如何从非管理员帐户以管理员用户身份启动需要管理员权限的程序

我猜您所指的是在新创建的进程上触发UAC提示。如果是这样的话,只需几行就可以了,特别是删除用户/通行证属性(因为Windows会要求它们),并将UseShellExecute设置为true:

ProcessStartInfo myProcess = new ProcessStartInfo(path);
myProcess.WorkingDirectory = @"C:'Windows'System32";
myProcess.UseShellExecute = true;
myProcess.Verb = "runas";
Process.Start(myProcess);

我注意到这种方法的两个注意事项是,如果用户取消提示,将抛出一个异常,说明用户已经取消(您必须准备好取消处理)。此外,如果UAC在系统上被禁用/不存在,则进程将不会被提升。为了应对这种情况,启动的程序必须准备好检查它是否真的被授予了管理权限。

一种完全不同的方法是向目标应用程序添加一个清单(如果您能够重新编译它),指定它需要管理员权限。