c# - Microsoft ActiveDirectory PowerShell 模块(Microsoft RSAT 下载)不是线程安全的(“无效枚举上下文”异常)- 补救措施?
问题描述
PowerShell ActiveDirectory 模块似乎不是线程安全的。
我们编写了一个 .NET Framework 服务。该代码打开一个 PowerShell 运行空间(NuGet 包System.Management.Automation.dll
),该运行空间正在执行一个 PowerShell 脚本,该脚本通过Active Directory Web Services (ADWS)查询 Active Directory 。
我们的服务产生了许多线程,因此可以并行处理任务。如果两个线程并行查询 Active Directory(例如,通过同时运行Get-ADUser
Cmdlet),Active Directory Web 服务 (ADWS) 将引发“ invalid enumeration context
” SOAP 异常。
我们是否可能错误地配置了我们的 Windows 域控制器?或者这是一个应该报告给微软的错误?我会在哪里报告这个错误?
在GitHub 上,我创建了一个包含示例控制台应用程序的存储库,以便轻松重现此问题。在UserVoice上,我提交了相应的 "idea"。
解决方案
我今天早些时候在我们的 PS 脚本上遇到了同样的错误,这些脚本也使用 RSAT 并并行运行。我们的解决方案是简单地在 RSAT cmdlet 周围使用互斥锁。
$mutex = New-Object Threading.Mutex($false, "AD Operation");
$mutex.WaitOne();
try {
Get-ADObject ...
}
finally {
$mutex.ReleaseMutex();
$mutex.Dispose();
}
在这种情况下,互斥由 SO (Windows) 在 SO 本身的上下文中处理,因此它将跨线程和进程工作。
推荐阅读
- c# - SSIS 或 Sql 作业动态开始时间
- coding-style - 怎样做才能成为高效的程序员?
- python - 是否有人在加载 Keras 保存的模型时得到“AttributeError: 'str' object has no attribute 'decode'”
- database - 我想创建一个数据库表,哪种数据类型更适合存储字母数字值?
- javascript - Chart.js 中不同数量的标签和数据
- powerbi - Power BI 显示前几天的值
- docker - Docker 边缘门户
- java - Java android机房二外键
- php - 如何在新的多维数组中分离具有相同索引的键值
- node.js - Loopback 4 调试器 nodemon 解决方案