• 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

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

  • 相关阅读:
    MySql索引
    m基于MATLAB的上行链路MIMO关键技术的研究与性能分析
    对指针的深入理解
    【华为机考题】最少任务处理时常
    Leetcode_C++之525. Contiguous Array(连续子数组)
    Java诊断怎么搞?Arthas技能必不可少
    【shell】 1、bash语法超详细介绍
    【Linux】Ubuntu20.04版本配置pytorch环境2023.09.05【教程】
    【C/C++】动态库和静态库
    2022年8月初济南某外包公司全栈开发面试题整理
  • 原文地址:https://blog.csdn.net/a10750/article/details/134312973