【发布时间】:2017-03-14 20:46:30
【问题描述】:
我对这种情况有疑问: 我做了2个程序:
第一个只打印一个输出,说明是否以管理员权限启动,第二个,以管理员权限执行第一个程序和不使用 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,这就是为什么我已经插入了用户名和密码。 提前致谢。
【问题讨论】:
-
据我所知,您无法以这种方式规避 UAC。如果正在运行的程序没有管理员权限,则被调用程序需要请求管理员权限,这将触发 UAC。
-
您是否尝试将密码
SecureString设为只读? -
@BenVoigt,“SecureString”工作正常,因为当我输入错误密码时,它会抛出异常。
-
问题是
Process.Start()使用CreateProcessWithLogonW哪个filters the user token。我不知道有什么好的解决方法,也许是使用计划任务?如果做不到这一点,您最好的选择可能是安装系统服务来代表您启动孩子。 (当然,要适当注意安全问题。)更好的是,重新架构,这样您就不再需要这样做了。无论如何,您不应该将管理员凭据放在可执行文件中。 -
@HarryJohnston:你链接到的那个答案似乎有一个解决方案(LOGON32_LOGON_BATCH 标志),不是吗?
标签: c# windows process privileges