我遇到这种情况的问题: 我制作了两个节目:
第一个只打印输出说明是否使用管理员文件启动,第二个,执行第一个具有管理员权限的程序不使用UAC 。麻烦的是,第二个程序无法启动第一个具有管理员权限的程序,我不知道为什么。 这是我的代码:
第一个程序的代码:
// This only prints if you start as administrator or not.
bool isElevated;
WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
isElevated = principal.IsInRole(WindowsBuiltInRole.Administrator);
Console.WriteLine("I got admin privileges?: "+isElevated);
第二个程序的代码:
// This execute the first program with admin privileges without UAC
string username = "myuser";
SecureString userpass = new SecureString();
userpass.AppendChar('m');
userpass.AppendChar('y');
userpass.AppendChar('p');
userpass.AppendChar('a');
userpass.AppendChar('s');
userpass.AppendChar('s');
Process program = new Process();
program.StartInfo.UserName = username;
program.StartInfo.Password = userpass;
program.StartInfo.FileName = "Path/First_program.exe";
program.StartInfo.UseShellExecute = false;
program.Start();
PD:我不希望用户打开UAC,这就是我已插入用户名和密码的原因。
提前谢谢。
答案 0 :(得分:2)
你有一半的答案。另一半是程序必须请求以提升的权限执行。默认情况下,Windows程序在" Basic"信任级别,无论用户下可能的真实权限级别如何。为了获得行政权力,该计划必须要求提升,根据定义,该提升将涉及UAC。
像您这样的程序可以使用ProcessStartInfo中的runas
谓词请求提升,或者在任一应用程序的清单中指定requireAdministrator
提升的权限(假设您控制它们)。无论哪种方式,如果启用了UAC,用户将收到提示。
规避这一点的唯一方法是设置程序,否则需要提升权限作为Windows服务,在services.msc中配置以使用管理权限运行。安装/注册服务以便以这种方式运行时,您将获得一个UAC提示,从那时起服务可以执行该任务而无需任何进一步的UAC操作。然后,您可以使用各种通信技术,从命名管道到TCP等真正的网络通信,向服务发出信号,表明它应该按照您的意愿行事。