当我通过 PowerShell 控制台运行以下命令时,它工作正常:
Get-ProcessMitigation -Name iexplore.exe | Select-Object -ExpandProperty ASLR | Select-Object -ExpandProperty BottomUp
但是,如果我在 C# 方法中运行相同的命令,如下所示:
public static List<PSObject> RunLocalPowerShellScript(string p_script)
{
using var psInstance = PowerShell.Create();
psInstance.AddScript(p_script);
IEnumerable<PSObject> commandOutput = null;
try
{
commandOutput = psInstance.Invoke();
}
catch (Exception e)
{
var exc = e.Message;
}
if (psInstance.HadErrors)
{
var errorOutput = string.Join(Environment.NewLine, psInstance.Streams.Error.Select(e => e.ToString()));
}
return commandOutput.ToList();
}
并将命令作为参数传递,它会失败(请注意,上面的代码需要 C# 8 才能正常运行,但将其包装在 using
block 中 C# 7 样式会导致相同的问题)。
错误提示 This script must be run on Windows 10 or greater.
。问题是我在 Windows 10 1903 上运行。它既发生在使用 NuGet 的 Microsoft.PowerShell.5.ReferenceAssemblies
包的 .NET Framework 项目中,也发生在使用来自 NuGet 的 Microsoft.PowerShell.SDK
包。其他 PowerShell 命令使用完全相同的方法运行没有任何问题,并且相同的命令在我们的方法的稍微调整的远程版本中运行没有问题,我们将远程运行空间设置为针对远程机器运行。这个问题好像只限于在 native 运行。
有没有人对这个问题有任何见解?这不是我们在办公室的 Get/Set-ProcessMitigation 模块中发现的第一个错误,但我认为让一些外部人士关注事物总是好的。
最佳答案
似乎 Get-ProcessMitigation
cmdlet 在执行前会检查操作系统版本。这是合理的,因为它可能需要一个新库或正在处理一些新功能,但问题是默认情况下您的应用程序被告知它正在 Windows 8 (6.2) 上运行,即使操作系统确实是 Windows 10 :
Targeting your application for Windows
为了解决这个问题,add an app.manifest到您的项目并取消注释此部分:
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
关于c# - 脚本通过 PowerShell 控制台正确运行,通过 C# 运行时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58402748/