fix: resolve Exchange runspace and PowerShell invoke API mismatches

This commit is contained in:
Meik
2026-02-27 09:26:28 +01:00
parent c842d0e756
commit 47e00b10fa
2 changed files with 13 additions and 21 deletions

View File

@@ -62,32 +62,24 @@ namespace C4IT.LIAM
var runspace = RunspaceFactory.CreateRunspace(connectionInfo); var runspace = RunspaceFactory.CreateRunspace(connectionInfo);
LogEntry($"Opening Exchange runspace (timeout: {RunspaceOpenTimeout.TotalSeconds:0}s) for endpoint '{_exchangeUri}'", LogLevels.Debug); LogEntry($"Opening Exchange runspace (timeout: {RunspaceOpenTimeout.TotalSeconds:0}s) for endpoint '{_exchangeUri}'", LogLevels.Debug);
IAsyncResult openResult = null; var openTask = Task.Run(() => runspace.Open());
try if (!openTask.Wait(RunspaceOpenTimeout))
{ {
openResult = runspace.BeginOpen(null, null); try
if (!openResult.AsyncWaitHandle.WaitOne(RunspaceOpenTimeout))
{ {
try runspace.Dispose();
{ }
runspace.Dispose(); catch (Exception disposeEx)
} {
catch (Exception disposeEx) LogException(disposeEx);
{
LogException(disposeEx);
}
throw new TimeoutException(
$"Timeout while opening Exchange runspace after {RunspaceOpenTimeout.TotalSeconds:0} seconds.");
} }
runspace.EndOpen(openResult); throw new TimeoutException(
} $"Timeout while opening Exchange runspace after {RunspaceOpenTimeout.TotalSeconds:0} seconds.");
finally
{
openResult?.AsyncWaitHandle?.Close();
} }
openTask.GetAwaiter().GetResult();
LogEntry("Exchange runspace opened successfully", LogLevels.Debug); LogEntry("Exchange runspace opened successfully", LogLevels.Debug);
return runspace; return runspace;
} }

View File

@@ -19,7 +19,7 @@ namespace C4IT.LIAM
{ {
private static readonly TimeSpan PowerShellInvokeTimeout = TimeSpan.FromSeconds(120); private static readonly TimeSpan PowerShellInvokeTimeout = TimeSpan.FromSeconds(120);
private static Collection<PSObject> InvokePowerShellWithTimeout(PowerShell ps, TimeSpan timeout, string operationName) private static PSDataCollection<PSObject> InvokePowerShellWithTimeout(PowerShell ps, TimeSpan timeout, string operationName)
{ {
IAsyncResult asyncResult = null; IAsyncResult asyncResult = null;
try try