• 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

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

  • 相关阅读:
    vue实现类似c#一样,鼠标指到方法或者变量上,能显示自己备注的信息
    02.线性回归算法
    tiup dm disable
    小程序中自定义组件
    vue 组件拖拽vue-slicksort应用
    mysql升级
    ubuntu下vscode+cmake实现gtest(cmake引入gtest,glog)
    Jtti:微信小程序怎么连接云主机数据库
    SOLIDWORKS功能布局实用技巧之保存实体技术
    react setupProxy.js导致项目无法启动
  • 原文地址:https://blog.csdn.net/a10750/article/details/134312973