设计流程: 非管理员用户---->程序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)
答案 0 :(得分:1)
我猜您指的是在新创建的进程上触发UAC提示。如果是这样,只需几行即可,特别是删除用户/通行证属性(因为Windows会询问它们)并将UseShellExecute
设置为true
:
ProcessStartInfo myProcess = new ProcessStartInfo(path);
myProcess.WorkingDirectory = @"C:\Windows\System32";
myProcess.UseShellExecute = true;
myProcess.Verb = "runas";
Process.Start(myProcess);
我注意到这种方法的两个注意事项是,如果用户取消提示,则会抛出一个异常,说用户已取消(您必须准备好取消处理)。此外,如果系统上禁用/不存在UAC,则不会提升该过程。为了解决这个问题,已启动的程序必须准备好检查它是否真的获得了管理员权限。
完全不同的方法是只向目标应用程序添加清单(如果你能够重新编译它),指明它需要管理员权限。