C#运行ps1文件命令,一般都直接启动进程,以管理员身份调用powershell。
有两种方式,一种直接在ps1文件中指定管理员身份,比如ps1文件为:
Start-Process powershell -ArgumentList 'get-windowsoptionalfeature -online' -verb RunAs
,然后使用process调用即可,但是这种方法无法捕获用户不同意管理员权限的信息。
第二种方法,在代码中指定管理员权限,加上try catch可以捕获用户不同意的信息,需要注意的是,
(1)UseShellExecute属性是获取或设置指示是否使用操作系统 shell 启动进程的值,需要以管理员身份执行命令或执行的命令不是可执行文件时,此值必须为true。
(2)UseShellExecute属性设置为true,重定向输入、输出和错误流属性均无效,所以也不需要设置,由此,无法获取到执行结果。
(3)如果 UseShellExecute 属性为 true,则将忽略 CreateNoWindow 属性值并创建一个新窗口,所以设置窗口不可见属性也是没有用的,必将创建窗口。
(4)Arguments 属性可以是一个文件,也可以是一个命令,但是我如果设置它是一个文件,文件中输入命令,执行时在win10的电脑可以正常执行,但是在win11的电脑,允许管理员权限之后,powershell窗口会闪退,不知道原因是什么,所以还是直接把命令以字符串形式赋予Arguments 属性,或者如果命令在文件中,直接使用ReadAllText属性以字符串读取出来。
代码如下:
try{
Process proc = new Process();
ProcessStartInfo startInfo = new ProcessStartInfo();
proc.StartInfo.FileName = "powershell.exe";
proc.StartInfo.Arguments = "get-windowsoptionalfeature -online";
proc.StartInfo.UseShellExecute = true;
proc.StartInfo.Verb = "runas"; // 请求以管理员权限运行
proc.Start();
proc.WaitForExit();
}
catch{
//弹出UAC窗口时用户点了不同意
textBlock1.Text += ("获取管理员权限失败!");
}
关于以管理员身份执行命令这一块,这段时间总算是搞明白了。