internal void DoInvoke() { #if !CORECLR // TODO:CORECLR - WindowsIdentity.Impersonate() is not available. Use WindowsIdentity.RunImplemented to replace it. // Flow impersonation onto thread if needed. WindowsImpersonationContext impersonationContext = null; if ((_identityToImpersonate != null) && (_identityToImpersonate.ImpersonationLevel == TokenImpersonationLevel.Impersonation)) { impersonationContext = _identityToImpersonate.Impersonate(); } #endif try { _results = _wrappedDebugger.ProcessCommand(_command, _output); } catch (Exception e) { CommandProcessorBase.CheckForSevereException(e); _exception = e; } finally { _commandCompleteEvent.Set(); #if !CORECLR // TODO:CORECLR - WindowsIdentity.Impersonate() is not available. Use WindowsIdentity.RunImplemented to replace it. // Restore previous context to thread. if (impersonationContext != null) { try { impersonationContext.Undo(); impersonationContext.Dispose(); } catch (System.Security.SecurityException) { } } #endif } }
/// <summary> /// Process debugger command. /// </summary> /// <param name="command">Debugger PSCommand</param> /// <param name="output">Output</param> /// <returns>DebuggerCommandResults</returns> public override DebuggerCommandResults ProcessCommand(PSCommand command, PSDataCollection<PSObject> output) { CheckForValidateState(); _detachCommand = false; if (command == null) { throw new PSArgumentNullException("command"); } if (output == null) { throw new PSArgumentNullException("output"); } if (!DebuggerStopped) { throw new PSInvalidOperationException( DebuggerStrings.CannotProcessDebuggerCommandNotStopped, null, Debugger.CannotProcessCommandNotStopped, ErrorCategory.InvalidOperation, null); } DebuggerCommandResults results = null; // Execute command on server. bool executionError = false; using (_psDebuggerCommand = GetNestedPowerShell()) { foreach (var cmd in command.Commands) { cmd.MergeMyResults(PipelineResultTypes.All, PipelineResultTypes.Output); _psDebuggerCommand.AddCommand(cmd); } PSDataCollection<PSObject> internalOutput = new PSDataCollection<PSObject>(); internalOutput.DataAdded += (sender, args) => { foreach (var item in internalOutput.ReadAll()) { if (item == null) { return; } DebuggerCommand dbgCmd = item.BaseObject as DebuggerCommand; if (dbgCmd != null) { bool executedByDebugger = (dbgCmd.ResumeAction != null || dbgCmd.ExecutedByDebugger); results = new DebuggerCommandResults(dbgCmd.ResumeAction, executedByDebugger); } else if (item.BaseObject is DebuggerCommandResults) { results = item.BaseObject as DebuggerCommandResults; } else { output.Add(item); } } }; try { _psDebuggerCommand.Invoke(null, internalOutput, null); } catch (Exception e) { CommandProcessor.CheckForSevereException(e); executionError = true; RemoteException re = e as RemoteException; if ((re != null) && (re.ErrorRecord != null)) { // Allow the IncompleteParseException to throw so that the console // can handle here strings and continued parsing. if (re.ErrorRecord.CategoryInfo.Reason == typeof(IncompleteParseException).Name) { throw new IncompleteParseException( (re.ErrorRecord.Exception != null) ? re.ErrorRecord.Exception.Message : null, re.ErrorRecord.FullyQualifiedErrorId); } // Allow the RemoteException and InvalidRunspacePoolStateException to propagate so that the host can // clean up the debug session. if ((re.ErrorRecord.CategoryInfo.Reason == typeof(InvalidRunspacePoolStateException).Name) || (re.ErrorRecord.CategoryInfo.Reason == typeof(RemoteException).Name)) { throw new PSRemotingTransportException( (re.ErrorRecord.Exception != null) ? re.ErrorRecord.Exception.Message : string.Empty); } } // Allow all PSRemotingTransportException and RemoteException errors to propagate as this // indicates a broken debug session. if ((e is PSRemotingTransportException) || (e is RemoteException)) { throw; } output.Add( new PSObject( new ErrorRecord( e, "DebuggerError", ErrorCategory.InvalidOperation, null))); } } executionError = executionError || _psDebuggerCommand.HadErrors; _psDebuggerCommand = null; // Special processing when the detach command is run. _detachCommand = (!executionError) && (command.Commands.Count > 0) && (command.Commands[0].CommandText.Equals("Detach", StringComparison.OrdinalIgnoreCase)); return results ?? new DebuggerCommandResults(null, false); }
private DebuggerCommandResults ProcessDebugCommand(string cmd, out Exception e) { DebuggerCommandResults results = null; try { _parent.DebuggerCanStopCommand = true; // Use PowerShell object to write streaming data to host. using (System.Management.Automation.PowerShell ps = System.Management.Automation.PowerShell.Create()) { PSInvocationSettings settings = new PSInvocationSettings() { Host = _parent }; PSDataCollection<PSObject> output = new PSDataCollection<PSObject>(); ps.AddCommand("Out-Default"); IAsyncResult async = ps.BeginInvoke<PSObject>(output, settings, null, null); // Let debugger evaluate command and stream output data. results = _parent.Runspace.Debugger.ProcessCommand( new PSCommand( new Command(cmd, true)), output); output.Complete(); ps.EndInvoke(async); } e = null; } catch (Exception ex) { ConsoleHost.CheckForSevereException(ex); e = ex; results = new DebuggerCommandResults(null, false); } finally { _parent.DebuggerCanStopCommand = false; } // Exit debugger if command fails to evaluate. return results ?? new DebuggerCommandResults(DebuggerResumeAction.Continue, false); }
/// <summary> /// ProcessCommand /// </summary> /// <param name="command">PowerShell command</param> /// <param name="output">Output</param> /// <returns>DebuggerCommandResults</returns> public override DebuggerCommandResults ProcessCommand(PSCommand command, PSDataCollection<PSObject> output) { if (command == null) { throw new PSArgumentNullException("command"); } if (output == null) { throw new PSArgumentNullException("output"); } if (!DebuggerStopped) { throw new PSInvalidOperationException( DebuggerStrings.CannotProcessDebuggerCommandNotStopped, null, Debugger.CannotProcessCommandNotStopped, ErrorCategory.InvalidOperation, null); } // // Allow an active pushed debugger to process commands // DebuggerCommandResults results = ProcessCommandForActiveDebugger(command, output); if (results != null) { return results; } // // Otherwise let root script debugger handle it. // LocalRunspace localRunspace = _context.CurrentRunspace as LocalRunspace; if (localRunspace == null) { throw new PSInvalidOperationException( DebuggerStrings.CannotProcessDebuggerCommandNotStopped, null, Debugger.CannotProcessCommandNotStopped, ErrorCategory.InvalidOperation, null); } try { using (_psDebuggerCommand = PowerShell.Create()) { if (localRunspace.GetCurrentlyRunningPipeline() != null) { _psDebuggerCommand.SetIsNested(true); } _psDebuggerCommand.Runspace = localRunspace; _psDebuggerCommand.Commands = command; foreach (var cmd in _psDebuggerCommand.Commands.Commands) { cmd.MergeMyResults(PipelineResultTypes.All, PipelineResultTypes.Output); } PSDataCollection<PSObject> internalOutput = new PSDataCollection<PSObject>(); internalOutput.DataAdded += (sender, args) => { foreach (var item in internalOutput.ReadAll()) { if (item == null) { continue; } DebuggerCommand dbgCmd = item.BaseObject as DebuggerCommand; if (dbgCmd != null) { bool executedByDebugger = (dbgCmd.ResumeAction != null || dbgCmd.ExecutedByDebugger); results = new DebuggerCommandResults(dbgCmd.ResumeAction, executedByDebugger); } else { output.Add(item); } } }; // Allow any exceptions to propagate. _psDebuggerCommand.InvokeWithDebugger(null, internalOutput, null, false); } } finally { _psDebuggerCommand = null; } return results ?? new DebuggerCommandResults(null, false); }