使用 Powershell 中的异步 API 的运行空间问题
Posted
技术标签:
【中文标题】使用 Powershell 中的异步 API 的运行空间问题【英文标题】:Runspace issus using async APIs from Powershell 【发布时间】:2015-07-11 19:30:41 【问题描述】:我正在调用 Powershell 中的一个库,该库使用 .NET HttpClient 发出 POST 请求。客户端调用在后台线程上运行。它适用于 HTTP。但是,当我使用 HTTPS 时,我遇到了问题。服务器未使用有效的签名证书。我使用以下方法正确禁用了该检查:
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = $true
仅遇到与运行空间相关的此错误:
System.Management.Automation.PSInvalidOperationException:没有 可用于在此线程中运行脚本的运行空间。你可以提供一个 在 DefaultRunspace 属性中 System.Management.Automation.Runspaces.Runspace 类型。脚本块 你试图调用的是:$true
通过一些研究,这似乎与 API 是异步/使用任务的事实有关。
任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:尝试改用证书策略?
add-type @"
using System.Net;
using System.Security.Cryptography.X509Certificates;
public class NoSSLCheckPolicy : ICertificatePolicy
public NoSSLCheckPolicy()
public bool CheckValidationResult(
ServicePoint sPoint, X509Certificate cert,
WebRequest wRequest, int certProb)
return true;
"@
[System.Net.ServicePointManager]::CertificatePolicy = new-object NoSSLCheckPolicy
【讨论】:
【参考方案2】:请注意,当您关闭验证时,您将关闭所有内容——我会比@Trondh 的建议更仔细地编写一个验证器——不要只返回 true,确保证书至少是有效的(即使是自签名的),并且只允许特定域的自签名证书。
FWIW,我在 Splunk 工作时为 .Net 编写了一个 Tuneable SSL Validator,以处理 Splunk 默认使用自签名证书的事实。它有一个带有命令的 PowerShell 模块,可以让您信任会话的证书,或者只是禁用证书链验证(这样您就可以信任没有证书链的有效自签名证书)......它有 Invoke-WebRequest
周围的包装器和Invoke-RestMethod
甚至 Export-ODataEndpointProxy
添加一个 Insecure
开关,这样您就可以为单个请求禁用 SSL。
https://github.com/Jaykul/Tunable-SSL-Validator
【讨论】:
以上是关于使用 Powershell 中的异步 API 的运行空间问题的主要内容,如果未能解决你的问题,请参考以下文章
如何在 PowerShell 中使用 Rest API 创建服务更改
powershell 在异步模式下使用Start-BitsTransfer下载文件
使用Powershell管理Linux 下的 SQL Server