/// <summary> /// Connect all disconnected sessions. /// </summary> private void ConnectSessions(Collection <PSSession> psSessions) { List <IThrottleOperation> connectOperations = new List <IThrottleOperation>(); // Create a disconnect operation for each runspace to disconnect. foreach (PSSession psSession in psSessions) { if (ShouldProcess(psSession.Name, VerbsCommunications.Connect)) { if (psSession.ComputerType != TargetMachineType.RemoteMachine) { // PS session disconnection is not supported for VM/Container sessions. string msg = StringUtil.Format(RemotingErrorIdStrings.RunspaceCannotBeConnectedForVMContainerSession, psSession.Name, psSession.ComputerName, psSession.ComputerType); Exception reason = new PSNotSupportedException(msg); ErrorRecord errorRecord = new ErrorRecord(reason, "CannotConnectVMContainerSession", ErrorCategory.InvalidOperation, psSession); WriteError(errorRecord); } else if (psSession.Runspace.RunspaceStateInfo.State == RunspaceState.Disconnected && psSession.Runspace.RunspaceAvailability == RunspaceAvailability.None) { // Can only connect sessions that are in Disconnected state. // Update session connection information based on cmdlet parameters. UpdateConnectionInfo(psSession.Runspace.ConnectionInfo as WSManConnectionInfo); ConnectRunspaceOperation connectOperation = new ConnectRunspaceOperation( psSession, _stream, this.Host, null, _failedSessions); connectOperations.Add(connectOperation); } else if (psSession.Runspace.RunspaceStateInfo.State != RunspaceState.Opened) { // Write error record if runspace is not already in the Opened state. string msg = StringUtil.Format(RemotingErrorIdStrings.RunspaceCannotBeConnected, psSession.Name); Exception reason = new RuntimeException(msg); ErrorRecord errorRecord = new ErrorRecord(reason, "PSSessionConnectFailed", ErrorCategory.InvalidOperation, psSession); WriteError(errorRecord); } else { // Session is already connected. Write to output. WriteObject(psSession); } } _allSessions.Add(psSession); } if (connectOperations.Count > 0) { // Make sure operations are not set as complete while processing input. _operationsComplete.Reset(); // Submit list of connect operations. _throttleManager.SubmitOperations(connectOperations); // Write any output now. Collection <object> streamObjects = _stream.ObjectReader.NonBlockingRead(); foreach (object streamObject in streamObjects) { WriteStreamObject((Action <Cmdlet>)streamObject); } } }
/// <summary> /// Connect all disconnected sessions. /// </summary> private void ConnectSessions(Collection<PSSession> psSessions) { List<IThrottleOperation> connectOperations = new List<IThrottleOperation>(); // Create a disconnect operation for each runspace to disconnect. foreach (PSSession psSession in psSessions) { if (ShouldProcess(psSession.Name, VerbsCommunications.Connect)) { if (psSession.ComputerType != TargetMachineType.RemoteMachine) { // PS session disconnection is not supported for VM/Container sessions. string msg = StringUtil.Format(RemotingErrorIdStrings.RunspaceCannotBeConnectedForVMContainerSession, psSession.Name, psSession.ComputerName, psSession.ComputerType); Exception reason = new PSNotSupportedException(msg); ErrorRecord errorRecord = new ErrorRecord(reason, "CannotConnectVMContainerSession", ErrorCategory.InvalidOperation, psSession); WriteError(errorRecord); } else if (psSession.Runspace.RunspaceStateInfo.State == RunspaceState.Disconnected && psSession.Runspace.RunspaceAvailability == RunspaceAvailability.None) { // Can only connect sessions that are in Disconnected state. // Update session connection information based on cmdlet parameters. UpdateConnectionInfo(psSession.Runspace.ConnectionInfo as WSManConnectionInfo); ConnectRunspaceOperation connectOperation = new ConnectRunspaceOperation( psSession, _stream, this.Host, null, _failedSessions); connectOperations.Add(connectOperation); } else if (psSession.Runspace.RunspaceStateInfo.State != RunspaceState.Opened) { // Write error record if runspace is not already in the Opened state. string msg = StringUtil.Format(RemotingErrorIdStrings.RunspaceCannotBeConnected, psSession.Name); Exception reason = new RuntimeException(msg); ErrorRecord errorRecord = new ErrorRecord(reason, "PSSessionConnectFailed", ErrorCategory.InvalidOperation, psSession); WriteError(errorRecord); } else { // Session is already connected. Write to output. WriteObject(psSession); } } _allSessions.Add(psSession); } if (connectOperations.Count > 0) { // Make sure operations are not set as complete while processing input. _operationsComplete.Reset(); // Submit list of connect operations. _throttleManager.SubmitOperations(connectOperations); // Write any output now. Collection<object> streamObjects = _stream.ObjectReader.NonBlockingRead(); foreach (object streamObject in streamObjects) { WriteStreamObject((Action<Cmdlet>)streamObject); } } }