/// <summary> /// Creates a new instance of the RunspaceDetails class. /// </summary> /// <param name="runspace"> /// The runspace for which this instance contains details. /// </param> /// <param name="sessionDetails"> /// The SessionDetails for the runspace. /// </param> /// <param name="powerShellVersion"> /// The PowerShellVersionDetails of the runspace. /// </param> /// <param name="runspaceLocation"> /// The RunspaceLocation of the runspace. /// </param> /// <param name="runspaceContext"> /// The RunspaceContext of the runspace. /// </param> /// <param name="connectionString"> /// The connection string of the runspace. /// </param> public RunspaceDetails( Runspace runspace, SessionDetails sessionDetails, PowerShellVersionDetails powerShellVersion, RunspaceLocation runspaceLocation, RunspaceContext runspaceContext, string connectionString) { this.Runspace = runspace; this.SessionDetails = sessionDetails; this.PowerShellVersion = powerShellVersion; this.Location = runspaceLocation; this.Context = runspaceContext; this.ConnectionString = connectionString; }
/// <summary> /// Creates and populates a new RunspaceDetails instance for the given runspace. /// </summary> /// <param name="runspace"> /// The runspace for which details will be gathered. /// </param> /// <param name="sessionDetails"> /// The SessionDetails for the runspace. /// </param> /// <param name="logger">An ILogger implementation used for writing log messages.</param> /// <returns>A new RunspaceDetails instance.</returns> internal static RunspaceDetails CreateFromRunspace( Runspace runspace, SessionDetails sessionDetails, ILogger logger) { Validate.IsNotNull(nameof(runspace), runspace); Validate.IsNotNull(nameof(sessionDetails), sessionDetails); var runspaceLocation = RunspaceLocation.Local; var runspaceContext = RunspaceContext.Original; var versionDetails = PowerShellVersionDetails.GetVersionDetails(runspace, logger); string connectionString = null; if (runspace.ConnectionInfo != null) { // Use 'dynamic' to avoid missing NamedPipeRunspaceConnectionInfo // on PS v3 and v4 try { dynamic connectionInfo = runspace.ConnectionInfo; if (connectionInfo.ProcessId != null) { connectionString = connectionInfo.ProcessId.ToString(); runspaceContext = RunspaceContext.EnteredProcess; } } catch (RuntimeBinderException) { // ProcessId property isn't on the object, move on. } // Grab the $host.name which will tell us if we're in a PSRP session or not string hostName = PowerShellContextService.ExecuteScriptAndGetItem <string>( "$Host.Name", runspace, defaultValue: string.Empty, useLocalScope: true); // hostname is 'ServerRemoteHost' when the user enters a session. // ex. Enter-PSSession // Attaching to process currently needs to be marked as a local session // so we skip this if block if the runspace is from Enter-PSHostProcess if (hostName.Equals("ServerRemoteHost", StringComparison.Ordinal) && runspace.OriginalConnectionInfo?.GetType().ToString() != "System.Management.Automation.Runspaces.NamedPipeConnectionInfo") { runspaceLocation = RunspaceLocation.Remote; connectionString = runspace.ConnectionInfo.ComputerName + (connectionString != null ? $"-{connectionString}" : string.Empty); } } return (new RunspaceDetails( runspace, sessionDetails, versionDetails, runspaceLocation, runspaceContext, connectionString)); }