/// <summary> /// Perform runspace disconnect processing on all input. /// </summary> protected override void ProcessRecord() { Dictionary <Guid, PSSession> psSessions; List <IThrottleOperation> disconnectOperations = new List <IThrottleOperation>(); try { // Get all remote runspaces to disconnect. if (ParameterSetName == DisconnectPSSessionCommand.SessionParameterSet) { if (Session == null || Session.Length == 0) { return; } psSessions = new Dictionary <Guid, PSSession>(); foreach (PSSession psSession in Session) { psSessions.Add(psSession.InstanceId, psSession); } } else { psSessions = GetMatchingRunspaces(false, true); } // Look for local sessions that have the EnableNetworkAccess property set and // return a string containing all of the session names. Emit a warning for // these sessions. string cnNames = GetLocalhostWithNetworkAccessEnabled(psSessions); if (!string.IsNullOrEmpty(cnNames)) { WriteWarning( StringUtil.Format(RemotingErrorIdStrings.EnableNetworkAccessWarning, cnNames)); } // Create a disconnect operation for each runspace to disconnect. foreach (PSSession psSession in psSessions.Values) { if (ShouldProcess(psSession.Name, VerbsCommunications.Disconnect)) { // PS session disconnection is not supported for VM/Container sessions. if (psSession.ComputerType != TargetMachineType.RemoteMachine) { // Write error record. string msg = StringUtil.Format(RemotingErrorIdStrings.RunspaceCannotBeDisconnectedForVMContainerSession, psSession.Name, psSession.ComputerName, psSession.ComputerType); Exception reason = new PSNotSupportedException(msg); ErrorRecord errorRecord = new ErrorRecord(reason, "CannotDisconnectVMContainerSession", ErrorCategory.InvalidOperation, psSession); WriteError(errorRecord); continue; } // Can only disconnect an Opened runspace. if (psSession.Runspace.RunspaceStateInfo.State == RunspaceState.Opened) { // Update the connectionInfo object with passed in session options. if (_sessionOption != null) { psSession.Runspace.ConnectionInfo.SetSessionOptions(_sessionOption); } // Validate the ConnectionInfo IdleTimeout value against the MaxIdleTimeout // value returned by the server and the hard coded minimum allowed value. if (!ValidateIdleTimeout(psSession)) { continue; } DisconnectRunspaceOperation disconnectOperation = new DisconnectRunspaceOperation(psSession, _stream); disconnectOperations.Add(disconnectOperation); } else if (psSession.Runspace.RunspaceStateInfo.State != RunspaceState.Disconnected) { // Write error record. string msg = StringUtil.Format(RemotingErrorIdStrings.RunspaceCannotBeDisconnected, psSession.Name); Exception reason = new RuntimeException(msg); ErrorRecord errorRecord = new ErrorRecord(reason, "CannotDisconnectSessionWhenNotOpened", ErrorCategory.InvalidOperation, psSession); WriteError(errorRecord); } else { // Session is already disconnected. Write to output. WriteObject(psSession); } } } } catch (PSRemotingDataStructureException) { // Allow cmdlet to end and then re-throw exception. _operationsComplete.Set(); throw; } catch (PSRemotingTransportException) { // Allow cmdlet to end and then re-throw exception. _operationsComplete.Set(); throw; } catch (RemoteException) { // Allow cmdlet to end and then re-throw exception. _operationsComplete.Set(); throw; } catch (InvalidRunspaceStateException) { // Allow cmdlet to end and then re-throw exception. _operationsComplete.Set(); throw; } if (disconnectOperations.Count > 0) { // Make sure operations are not set as complete while processing input. _operationsComplete.Reset(); // Submit list of disconnect operations. _throttleManager.SubmitOperations(disconnectOperations); // Write any output now. Collection <object> streamObjects = _stream.ObjectReader.NonBlockingRead(); foreach (object streamObject in streamObjects) { WriteStreamObject((Action <Cmdlet>)streamObject); } } }
protected override void ProcessRecord() { List<IThrottleOperation> operations = new List<IThrottleOperation>(); try { Dictionary<Guid, PSSession> matchingRunspaces; if (base.ParameterSetName == "Session") { if ((this.remotePSSessionInfo == null) || (this.remotePSSessionInfo.Length == 0)) { return; } matchingRunspaces = new Dictionary<Guid, PSSession>(); foreach (PSSession session in this.remotePSSessionInfo) { matchingRunspaces.Add(session.InstanceId, session); } } else { matchingRunspaces = base.GetMatchingRunspaces(false, true); } string localhostWithNetworkAccessEnabled = this.GetLocalhostWithNetworkAccessEnabled(matchingRunspaces); if (!string.IsNullOrEmpty(localhostWithNetworkAccessEnabled)) { base.WriteWarning(StringUtil.Format(RemotingErrorIdStrings.EnableNetworkAccessWarning, localhostWithNetworkAccessEnabled)); } foreach (PSSession session2 in matchingRunspaces.Values) { if (base.ShouldProcess(session2.Name, "Disconnect")) { if (session2.Runspace.RunspaceStateInfo.State == RunspaceState.Opened) { if (this.sessionOption != null) { session2.Runspace.ConnectionInfo.SetSessionOptions(this.sessionOption); } if (this.ValidateIdleTimeout(session2)) { DisconnectRunspaceOperation item = new DisconnectRunspaceOperation(session2, this.stream); operations.Add(item); } } else if (session2.Runspace.RunspaceStateInfo.State != RunspaceState.Disconnected) { Exception exception = new RuntimeException(StringUtil.Format(RemotingErrorIdStrings.RunspaceCannotBeDisconnected, session2.Name)); ErrorRecord errorRecord = new ErrorRecord(exception, "CannotDisconnectSessionWhenNotOpened", ErrorCategory.InvalidOperation, session2); base.WriteError(errorRecord); } else { base.WriteObject(session2); } } } } catch (PSRemotingDataStructureException) { this.operationsComplete.Set(); throw; } catch (PSRemotingTransportException) { this.operationsComplete.Set(); throw; } catch (RemoteException) { this.operationsComplete.Set(); throw; } catch (InvalidRunspaceStateException) { this.operationsComplete.Set(); throw; } if (operations.Count > 0) { this.operationsComplete.Reset(); this.throttleManager.SubmitOperations(operations); foreach (object obj2 in this.stream.ObjectReader.NonBlockingRead()) { base.WriteStreamObject((Action<Cmdlet>) obj2); } } }
/// <summary> /// Perform runspace disconnect processing on all input. /// </summary> protected override void ProcessRecord() { Dictionary<Guid, PSSession> psSessions; List<IThrottleOperation> disconnectOperations = new List<IThrottleOperation>(); try { // Get all remote runspaces to disconnect. if (ParameterSetName == DisconnectPSSessionCommand.SessionParameterSet) { if (Session == null || Session.Length == 0) { return; } psSessions = new Dictionary<Guid, PSSession>(); foreach (PSSession psSession in Session) { psSessions.Add(psSession.InstanceId, psSession); } } else { psSessions = GetMatchingRunspaces(false, true); } // Look for local sessions that have the EnableNetworkAccess property set and // return a string containing all of the session names. Emit a warning for // these sessions. string cnNames = GetLocalhostWithNetworkAccessEnabled(psSessions); if (!string.IsNullOrEmpty(cnNames)) { WriteWarning( StringUtil.Format(RemotingErrorIdStrings.EnableNetworkAccessWarning, cnNames)); } // Create a disconnect operation for each runspace to disconnect. foreach (PSSession psSession in psSessions.Values) { if (ShouldProcess(psSession.Name, VerbsCommunications.Disconnect)) { // PS session disconnection is not supported for VM/Container sessions. if (psSession.ComputerType != TargetMachineType.RemoteMachine) { // Write error record. string msg = StringUtil.Format(RemotingErrorIdStrings.RunspaceCannotBeDisconnectedForVMContainerSession, psSession.Name, psSession.ComputerName, psSession.ComputerType); Exception reason = new PSNotSupportedException(msg); ErrorRecord errorRecord = new ErrorRecord(reason, "CannotDisconnectVMContainerSession", ErrorCategory.InvalidOperation, psSession); WriteError(errorRecord); continue; } // Can only disconnect an Opened runspace. if (psSession.Runspace.RunspaceStateInfo.State == RunspaceState.Opened) { // Update the connectionInfo object with passed in session options. if (_sessionOption != null) { psSession.Runspace.ConnectionInfo.SetSessionOptions(_sessionOption); } // Validate the ConnectionInfo IdleTimeout value against the MaxIdleTimeout // value returned by the server and the hard coded minimum allowed value. if (!ValidateIdleTimeout(psSession)) { continue; } DisconnectRunspaceOperation disconnectOperation = new DisconnectRunspaceOperation(psSession, _stream); disconnectOperations.Add(disconnectOperation); } else if (psSession.Runspace.RunspaceStateInfo.State != RunspaceState.Disconnected) { // Write error record. string msg = StringUtil.Format(RemotingErrorIdStrings.RunspaceCannotBeDisconnected, psSession.Name); Exception reason = new RuntimeException(msg); ErrorRecord errorRecord = new ErrorRecord(reason, "CannotDisconnectSessionWhenNotOpened", ErrorCategory.InvalidOperation, psSession); WriteError(errorRecord); } else { // Session is already disconnected. Write to output. WriteObject(psSession); } } } } catch (PSRemotingDataStructureException) { // Allow cmdlet to end and then re-throw exception. _operationsComplete.Set(); throw; } catch (PSRemotingTransportException) { // Allow cmdlet to end and then re-throw exception. _operationsComplete.Set(); throw; } catch (RemoteException) { // Allow cmdlet to end and then re-throw exception. _operationsComplete.Set(); throw; } catch (InvalidRunspaceStateException) { // Allow cmdlet to end and then re-throw exception. _operationsComplete.Set(); throw; } if (disconnectOperations.Count > 0) { // Make sure operations are not set as complete while processing input. _operationsComplete.Reset(); // Submit list of disconnect operations. _throttleManager.SubmitOperations(disconnectOperations); // Write any output now. Collection<object> streamObjects = _stream.ObjectReader.NonBlockingRead(); foreach (object streamObject in streamObjects) { WriteStreamObject((Action<Cmdlet>)streamObject); } } }
protected override void ProcessRecord() { List <IThrottleOperation> operations = new List <IThrottleOperation>(); try { Dictionary <Guid, PSSession> matchingRunspaces; if (base.ParameterSetName == "Session") { if ((this.remotePSSessionInfo == null) || (this.remotePSSessionInfo.Length == 0)) { return; } matchingRunspaces = new Dictionary <Guid, PSSession>(); foreach (PSSession session in this.remotePSSessionInfo) { matchingRunspaces.Add(session.InstanceId, session); } } else { matchingRunspaces = base.GetMatchingRunspaces(false, true); } string localhostWithNetworkAccessEnabled = this.GetLocalhostWithNetworkAccessEnabled(matchingRunspaces); if (!string.IsNullOrEmpty(localhostWithNetworkAccessEnabled)) { base.WriteWarning(StringUtil.Format(RemotingErrorIdStrings.EnableNetworkAccessWarning, localhostWithNetworkAccessEnabled)); } foreach (PSSession session2 in matchingRunspaces.Values) { if (base.ShouldProcess(session2.Name, "Disconnect")) { if (session2.Runspace.RunspaceStateInfo.State == RunspaceState.Opened) { if (this.sessionOption != null) { session2.Runspace.ConnectionInfo.SetSessionOptions(this.sessionOption); } if (this.ValidateIdleTimeout(session2)) { DisconnectRunspaceOperation item = new DisconnectRunspaceOperation(session2, this.stream); operations.Add(item); } } else if (session2.Runspace.RunspaceStateInfo.State != RunspaceState.Disconnected) { Exception exception = new RuntimeException(StringUtil.Format(RemotingErrorIdStrings.RunspaceCannotBeDisconnected, session2.Name)); ErrorRecord errorRecord = new ErrorRecord(exception, "CannotDisconnectSessionWhenNotOpened", ErrorCategory.InvalidOperation, session2); base.WriteError(errorRecord); } else { base.WriteObject(session2); } } } } catch (PSRemotingDataStructureException) { this.operationsComplete.Set(); throw; } catch (PSRemotingTransportException) { this.operationsComplete.Set(); throw; } catch (RemoteException) { this.operationsComplete.Set(); throw; } catch (InvalidRunspaceStateException) { this.operationsComplete.Set(); throw; } if (operations.Count > 0) { this.operationsComplete.Reset(); this.throttleManager.SubmitOperations(operations); foreach (object obj2 in this.stream.ObjectReader.NonBlockingRead()) { base.WriteStreamObject((Action <Cmdlet>)obj2); } } }