通过C#调用CMD执行PowerShell命令报错的解决咨询
解决C#调用CMD脚本找不到Set-ProcessMitigation的问题
问题原因
双击CMD文件时,Windows 10 64位系统默认启动64位CMD,对应调用64位PowerShell,而Set-ProcessMitigation是64位系统专属的PowerShell cmdlet。但如果你的C#程序编译为Any CPU且勾选了默认的Prefer 32-bit选项,会以32位进程运行,调用的是32位CMD和32位PowerShell,32位环境中不存在该cmdlet,因此触发错误。
解决方案
方案1:修改C#项目编译设置
- 右键项目 → 属性 → 生成 → 取消勾选Prefer 32-bit
- 将目标平台设置为x64,确保程序以64位进程运行
方案2:修改CMD脚本,强制调用64位PowerShell
直接在脚本中指定64位PowerShell路径,即使C#程序以32位运行也能正常调用:
@echo off %SystemRoot%\Sysnative\WindowsPowerShell\v1.0\powershell.exe "ForEach($v in (Get-Command -Name 'Set-ProcessMitigation').Parameters['Disable'].Attributes.ValidValues){Set-ProcessMitigation -System -Disable $v.ToString() -ErrorAction SilentlyContinue}" pause
说明:
%SystemRoot%\Sysnative是64位系统给32位进程预留的虚拟路径,用于访问64位系统文件。
方案3:C#直接调用PowerShell(无需CMD脚本)
跳过中间的CMD环节,直接用C#调用PowerShell,更简洁可控:
var psi = new ProcessStartInfo { FileName = "powershell.exe", Arguments = @"ForEach($v in (Get-Command -Name 'Set-ProcessMitigation').Parameters['Disable'].Attributes.ValidValues){Set-ProcessMitigation -System -Disable $v.ToString() -ErrorAction SilentlyContinue}", UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, CreateNoWindow = true // 可选,关闭PowerShell窗口 }; using (var process = Process.Start(psi)) { process.WaitForExit(); // 可选:读取输出或错误日志 string output = process.StandardOutput.ReadToEnd(); string error = process.StandardError.ReadToEnd(); }
若需强制调用64位PowerShell,将FileName改为@"C:\Windows\Sysnative\WindowsPowerShell\v1.0\powershell.exe"
额外注意事项
Set-ProcessMitigation需要系统级权限,双击CMD时UAC会自动请求权限,但C#程序默认不会。需确保程序以管理员身份运行:
- 可在项目的
app.manifest中设置requestedExecutionLevel为requireAdministrator,让程序启动时自动弹出权限请求。
内容的提问来源于stack exchange,提问作者Fath Bakri
相关产品推荐
相关产品推荐

