2017-03-14 59 views
1

我有这种情况的一个问题: 我做了2个节目:C#程序如何以管理员权限运行另一个程序?

第一个只是打印输出称与管理provileges推出与否,和第二个,执行第一条程序拥有管理员权限且不使用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

据我所知,你不能以这种方式绕开UAC。如果正在运行的程序没有管理权限,则被调用的程序需要请求将触发UAC的管理权限。 – itsme86

+0

你有没有尝试使密码'SecureString'只读? –

+0

@ BenVoigt,“SecureString”工作正常,因为当我写一个错误的密码它会引发一个异常。 – suffuko

回答

2

你有一半的答案。另一半是程序必须请求以提升的特权执行。默认情况下,Windows程序以“基本”信任级别运行,而不管用户可能的真实权限级别如何。为了获得行政权力,该计划必须要求提升,根据定义将涉及UAC。

程序像你可使用在的ProcessStartInfo的runas动词,或通过在任一应用程序的清单指定requireAdministrator提升权限(假设控制它们)请求高程。无论哪种方式,如果启用UAC,用户将得到提示。

解决这个问题的唯一方法是设置程序,否则需要提升权限作为Windows服务,在services.msc中配置为使用管理权限运行。在安装/注册服务以便以这种方式运行时,您将得到一个UAC提示,并且从此服务可以执行该任务而无需进一步的UAC操作。然后,您可以使用各种通信技术,从命名管道到像TCP这样的真正的网络通信,向服务发出信号,表明它应该做你想做的事。

+3

一个比服务更简单的替代方案是计划任务,其权限设置为允许非特权用户触发它。然后你可以运行任何命令,它不必在主循环中拥有所有的服务管理工具。 –

+1

@KeithS令人惊叹的是,我会牢记这一点。 – suffuko

相关问题