以管理员身份运行 Powershell 命令 - 命令本身不会加载

本文关键字:命令 加载 身份 运行 Powershell 管理员 | 更新日期: 2023-09-27 18:20:29

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;

namespace WindowsFormsApplication
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            var newProcessInfo = new System.Diagnostics.ProcessStartInfo();
            newProcessInfo.FileName = @"C:'Windows'SysWOW64'WindowsPowerShell'v1.0'powershell.exe";
            newProcessInfo.Verb = "runas";
            System.Diagnostics.Process.Start(newProcessInfo);
            newProcessInfo.Arguments = @"sfc /scannow";
        }
    }
}

所以我的代码在一定程度上工作。 您单击Windows表单应用程序按钮,它将以管理员身份以64位运行Windows Powershell,但不会运行.ps1脚本"c:''path''script.ps1"或直接写出的命令,如上面的"sfc/scannow"。

我读到,如果"设置执行策略不受限制"未在代码开头的某个位置加载,则 powershell 命令有时不起作用。

请帮忙! 我一直在到处寻找答案。

以管理员身份运行 Powershell 命令 - 命令本身不会加载

首先,您需要在开始该过程之前指定 Arguments 属性:

var newProcessInfo = new System.Diagnostics.ProcessStartInfo();
newProcessInfo.FileName = @"C:'Windows'SysWOW64'WindowsPowerShell'v1.0'powershell.exe";
newProcessInfo.Verb = "runas";
newProcessInfo.Arguments = @"sfc /scannow";
System.Diagnostics.Process.Start(newProcessInfo);

其次,你需要告诉PowerShell sfc /scannow是一个命令,而不是命令行开关。

在命令行上,您将执行powershell.exe -Command "sfc /scannow",因此在您的情况下,正确的Arguments值将是

newProcessInfo.Arguments = @"-Command ""sfc /scannow""";

(""是逐字字符串文字中"的转义序列(

对于.ps1文件,请使用-File开关:

newProcessInfo.Arguments = @"-File ""C:'my'script.ps1""";

如果您不知道目标系统上的执行策略,可以使用-ExecutionPolicy Bypass绕过它,而不会影响计算机范围的策略:

newProcessInfo.Arguments = @"–ExecutionPolicy Bypass -File ""C:'my'script.ps1""";