Exemplo n.º 1
0
 internal Connection(ConnectionManager manager)
 {
     _manager = manager;
     _tracer.WriteMessage("PSW Conn: Creating new connection");
 }
Exemplo n.º 2
0
		internal Connection(ConnectionManager manager)
		{
			this._syncObject = new object();
			this._instanceId = Guid.NewGuid();
			this._tracer = PowerShellTraceSourceFactory.GetTraceSource();
			this._structuredTracer = new Tracer();
			this._retryInterval = 1;
			this._manager = manager;
			this._tracer.WriteMessage("PSW Conn: Creating new connection");
		}
Exemplo n.º 3
0
		private bool ServiceOneRequest(ConnectionManager.RequestInfo requestInfo)
		{
			int num;
			ConcurrentDictionary<Guid, Connection> orAdd;
			ConcurrentDictionary<Guid, Connection> item;
			bool flag;
			string computerName = requestInfo.ConnectionInfo.ComputerName;
			string shellUri = requestInfo.ConnectionInfo.ShellUri;
			if (!this._cleanupComputers.ContainsKey(computerName))
			{
				num = 0;
				ConnectionManager._perfCountersMgr.UpdateCounterByValue(PSWorkflowPerformanceCounterSetInfo.CounterSetId, 25, (long)1, true);
				ConcurrentDictionary<string, ConcurrentDictionary<Guid, Connection>> strs = this._connectionPool.GetOrAdd(computerName, new ConcurrentDictionary<string, ConcurrentDictionary<Guid, Connection>>());
				num = strs.Keys.Sum<string>((string key) => this.table[key].Count);
				orAdd = strs.GetOrAdd(shellUri, new ConcurrentDictionary<Guid, Connection>());
				ICollection<Connection> values = orAdd.Values;
				IEnumerator<Connection> enumerator = values.Where<Connection>((Connection connection) => !connection.Busy).Where<Connection>((Connection connection) => ConnectionManager.ValidateConnection(requestInfo, connection)).GetEnumerator();
				using (enumerator)
				{
					if (enumerator.MoveNext())
					{
						Connection current = enumerator.Current;
						this._tracer.WriteMessage("PSW ConnMgr: Assigning existing connection to request");
						this.AssignConnection(requestInfo, current);
						ConnectionManager._perfCountersMgr.UpdateCounterByValue(PSWorkflowPerformanceCounterSetInfo.CounterSetId, 25, (long)-1, true);
						flag = true;
					}
					else
					{
						goto Label0;
					}
				}
				return flag;
			}
			else
			{
				return false;
			}
		Label0:
			if (num >= this._maxOutBoundConnections)
			{
				Connection connection1 = null;
				IEnumerator<string> enumerator1 = strs.Keys.GetEnumerator();
				using (enumerator1)
				{
					do
					{
						if (!enumerator1.MoveNext())
						{
							break;
						}
						string str = enumerator1.Current;
						item = strs[str];
						ICollection<Connection> connections = item.Values;
						connection1 = connections.Where<Connection>((Connection connection) => !connection.Busy).FirstOrDefault<Connection>();
					}
					while (connection1 == null);
				}
				if (connection1 != null)
				{
					if (!ConnectionManager.ValidateConnection(requestInfo, connection1))
					{
						item.TryRemove(connection1.InstanceId, out connection1);
						this._tracer.WriteMessage("PSW ConnMgr: Closing potential connection and creating a new one to service request");
						ConnectionManager connectionManager = this;
						connectionManager._createdConnections = connectionManager._createdConnections - 1;
						Connection connection2 = this.CreateConnection(requestInfo, orAdd);
						ConnectionManager._perfCountersMgr.UpdateCounterByValue(PSWorkflowPerformanceCounterSetInfo.CounterSetId, 29, (long)1, true);
						this.SubmitOperation(new CloseOneAndOpenAnotherOperation(connection1, connection2));
						ConnectionManager._perfCountersMgr.UpdateCounterByValue(PSWorkflowPerformanceCounterSetInfo.CounterSetId, 25, (long)-1, true);
						return true;
					}
					else
					{
						this._tracer.WriteMessage("PSW ConnMgr: Assigning potential connection to service request");
						this.AssignConnection(requestInfo, connection1);
						ConnectionManager._perfCountersMgr.UpdateCounterByValue(PSWorkflowPerformanceCounterSetInfo.CounterSetId, 25, (long)-1, true);
						return true;
					}
				}
				else
				{
					ConnectionManager._perfCountersMgr.UpdateCounterByValue(PSWorkflowPerformanceCounterSetInfo.CounterSetId, 25, (long)-1, true);
					return false;
				}
			}
			else
			{
				this._tracer.WriteMessage("PSW ConnMgr: Creating new connection to service request");
				Connection connection3 = this.CreateConnection(requestInfo, orAdd);
				this.SubmitOperation(new OpenOperation(connection3));
				ConnectionManager._perfCountersMgr.UpdateCounterByValue(PSWorkflowPerformanceCounterSetInfo.CounterSetId, 25, (long)-1, true);
				return true;
			}
		}
Exemplo n.º 4
0
		private Connection CreateConnection(ConnectionManager.RequestInfo requestInfo, ConcurrentDictionary<Guid, Connection> connections)
		{
			Connection connection = new Connection(this);
			connection.ConnectionInfo = requestInfo.ConnectionInfo;
			connection.RetryCount = requestInfo.RetryCount;
			connection.RetryInterval = requestInfo.RetryInterval;
			connection.RetryAttempt = 0;
			connection.AsyncResult = requestInfo.AsyncResult;
			connection.Busy = true;
			Connection connection1 = connection;
			connections.TryAdd(connection1.InstanceId, connection1);
			ConnectionManager connectionManager = this;
			connectionManager._createdConnections = connectionManager._createdConnections + 1;
			ConnectionManager._perfCountersMgr.UpdateCounterByValue(PSWorkflowPerformanceCounterSetInfo.CounterSetId, 27, (long)1, true);
			return connection1;
		}
Exemplo n.º 5
0
		private void AssignConnection(ConnectionManager.RequestInfo requestInfo, Connection connection)
		{
			IAsyncResult asyncResult = requestInfo.AsyncResult;
			GetRunspaceAsyncResult getRunspaceAsyncResult = asyncResult as GetRunspaceAsyncResult;
			connection.Busy = true;
			connection.AsyncResult = getRunspaceAsyncResult;
			getRunspaceAsyncResult.Connection = connection;
			this.AddToPendingCallback(getRunspaceAsyncResult);
		}
Exemplo n.º 6
0
		private static bool ValidateConnection(ConnectionManager.RequestInfo requestInfo, Connection connection)
		{
			if (connection.Runspace.RunspaceStateInfo.State == RunspaceState.Opened)
			{
				WSManConnectionInfo connectionInfo = requestInfo.ConnectionInfo;
				WSManConnectionInfo originalConnectionInfo = connection.Runspace.OriginalConnectionInfo as WSManConnectionInfo;
				if (originalConnectionInfo != null)
				{
					if (WorkflowUtils.CompareConnectionUri(connectionInfo, originalConnectionInfo))
					{
						if (WorkflowUtils.CompareShellUri(connectionInfo.ShellUri, originalConnectionInfo.ShellUri))
						{
							if (WorkflowUtils.CompareAuthentication(connectionInfo.AuthenticationMechanism, originalConnectionInfo.AuthenticationMechanism))
							{
								if (WorkflowUtils.CompareCredential(connectionInfo.Credential, originalConnectionInfo.Credential))
								{
									if (WorkflowUtils.CompareCertificateThumbprint(connectionInfo.CertificateThumbprint, originalConnectionInfo.CertificateThumbprint))
									{
										if (WorkflowUtils.CompareProxySettings(connectionInfo, originalConnectionInfo))
										{
											if (WorkflowUtils.CompareOtherWSManSettings(connectionInfo, originalConnectionInfo))
											{
												if (originalConnectionInfo.IdleTimeout >= connectionInfo.IdleTimeout)
												{
													return true;
												}
												else
												{
													return false;
												}
											}
											else
											{
												return false;
											}
										}
										else
										{
											return false;
										}
									}
									else
									{
										return false;
									}
								}
								else
								{
									return false;
								}
							}
							else
							{
								return false;
							}
						}
						else
						{
							return false;
						}
					}
					else
					{
						return false;
					}
				}
				else
				{
					return false;
				}
			}
			else
			{
				return false;
			}
		}