首页 > 解决方案 > 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-ADUserCmdlet),Active Directory Web 服务 (ADWS) 将引发“ invalid enumeration context” SOAP 异常。

我们是否可能错误地配置了我们的 Windows 域控制器?或者这是一个应该报告给微软的错误?我会在哪里报告这个错误?

GitHub 上,我创建了一个包含示例控制台应用程序的存储库,以便轻松重现此问题。在UserVoice上,我提交了相应的 "idea"

标签: c#multithreadingpowershellactive-directorypowershell-5.0

解决方案


我今天早些时候在我们的 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 本身的上下文中处理,因此它将跨线程和进程工作。


推荐阅读