c# - 脚本通过 PowerShell 控制台正确运行,通过 C# 运行时失败

标签 c# .net powershell .net-core

当我通过 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/

相关文章:

c# - ASP.NET UDP 套接字代码适用于开发,但不适用于 IIS 的生产

c# - 未找到 DBSet<entity> 类( Entity Framework 加载错误的 DLL?)

powershell - Azure 自动化中的自定义 PowerShell DSC 复合资源

powershell - 如何使用 Windows Azure Powershell 命令获取 Azure 角色实例

c# - 在 Entity Framework 中手动为单个表创建模型

c# - 如何在 Razor 中转义 html 标签

c# - 获取 Microsoft Live 帐户的电子邮件地址

c# - 如何以编程方式发现我的 C# 应用程序的当前端点?

c# - System.Net.WebException:无法解析远程名称:

powershell - Powershell 中未处理异常的默认行为