【发布时间】:2020-12-29 03:18:48
【问题描述】:
首先,关于我正在尝试做的事情的一些背景知识。我正在编写一个 PowerShell 脚本模块,该模块需要在导入模块时设置一些变量并运行一些代码。最终需要发生的事情取决于导入模块的 PowerShell 版本。例如,这需要支持 5.1 及更高版本,但 Invoke-RestMethod 直到 PowerShell 6 才支持 -SkipCertificateCheck 参数,这意味着我需要检查版本,创建一个基本上总是返回 true 的 dummy ICertificatePolicy验证时,并将其存储在某个全局位置,如果用户指示他们希望在调用某些 cmdlet 时跳过安全检查,我可以引用它并设置该策略。到目前为止,我有以下代码:
Add-Type @"
using System.Management.Automation;
using System.Net;
using System.Security.Cryptography.X509Certificates;
namespace MyModuleNamespace {
public struct State {
public static ICertificatePolicy SystemCertificatePolicy;
public static ICertificatePolicy SkipSSLCheckPolicy;
}
public class TrustAllCertsPolicy : ICertificatePolicy {
public bool CheckValidationResult(
ServicePoint srvPoint, X509Certificate certificate,
WebRequest request, int certificateProblem) {
return true;
}
}
}
namespace MyModuleNamespace.SubNamespace {
public class ModuleAssemblyInitializer : IModuleAssemblyInitializer {
public void OnImport() {
// pseudocode of what I'm struggling to define in C#
if( CurrentPSSession.PSVersion.Major -lt 6 ) {
MyModuleNamespace.State.SystemCertificatePolicy = ServicePointManager.CertificatePolicy;
MyModuleNamespace.State.SkipSSLCheckPolicy = new MyModuleNamespace.TrustAllCertsPolicy();
}
// end pseudocode
}
}
}
"@
但是...我正在努力评估当前 PowerShell 会话中的信息,例如评估 $PSVersionTable.PSVersion。我知道如何检查安装了哪些版本的 PowerShell,但我需要能够评估添加了此类的当前运行的 PowerShell 版本。此外,我不希望 entire 模块用 C# 编写,即使这在技术上是一种选择。我团队中的其他人需要维护该模块,虽然他们很了解 PowerShell,但 C# 超出了他们的技能范围。
如果在导入模块时有一种 PowerShell 原生的方式来处理运行代码的情况,我会全力以赴。这是我的第一个 PowerShell 模块,如果我用错误的解决方案来解决这个问题,我不会感到惊讶。
【问题讨论】:
-
在我的脑海中,在
OnImport()中调用System.Reflection.Assembly.GetCallingAssembly()应该会返回导入System.Management.Automation.dll程序集 -
版本信息不是只返回 .NET 程序集版本的信息,而不是 PowerShell 的版本信息吗?
-
System.Management.Automation.dll是 PowerShell -
是的,但如果我检查版本仍然与运行的 .NET PowerShell 版本匹配,除非我遗漏了什么。例如,如果我从我的 PS 会话中运行
[System.Reflection.Assembly]::GetCallingAssembly(),它仍然只显示v4.0.30319,而没有关于我正在运行的 PowerShell 版本。至少无论是通过powershell.exe还是pwsh.exe运行,我都会在Windows 上获得相同的版本。 -
在 Linux 机器上使用 PowerShell 7 进行的快速测试也显示了相同的程序集版本。所以这似乎行不通。它看起来确实像程序集位置在 Windows 上的
PowerShell/7特定路径下,但 Linux 在路径中没有特定版本,至少使用 PowerShell 的snap包。在我的情况下,这将用于在 Windows PS 和 PS Core 之间进行检测,但如果我需要在 PS 6 和 7 之间进行区分,它就不会有效。不过,我确实找到了适合我的解决方案,并将很快将其作为答案发布。
标签: c# powershell powershell-core