• C#调用管理员身份运行程序


    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 += ("获取管理员权限失败!");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    关于以管理员身份执行命令这一块,这段时间总算是搞明白了。

  • 相关阅读:
    得物Java开发面试题
    Docker的网络模式
    【C++】SLT 六大组件之一:容器总结
    地方(少数民族)节假日
    一个项目的带宽流量是如何计算的?
    net-java-php-python-伊犁旅游网站计算机毕业设计程序
    玩转代码|分享一些实用的Vue 前端代码(三)
    postgresql 15源码浅析(5)—— pg_control
    Haproxy负载均衡
    Python3高级特性(三)之列表生成式和迭代器(Iterator)
  • 原文地址:https://blog.csdn.net/a10750/article/details/134312973