private PSDataCollection <PSObject> InvokePowerShell(PowerShell powershell, RunspaceCreatedEventArgs args) { string str; HostInfo hostInfo = this.remoteHost.HostInfo; IAsyncResult asyncResult = new ServerPowerShellDriver(powershell, null, true, Guid.Empty, this.InstanceId, this, args.Runspace.ApartmentState, hostInfo, RemoteStreamOptions.AddInvocationInfo, false, args.Runspace).Start(); PSDataCollection <PSObject> datas = powershell.EndInvoke(asyncResult); ArrayList dollarErrorVariable = (ArrayList)powershell.Runspace.GetExecutionContext.DollarErrorVariable; if (dollarErrorVariable.Count <= 0) { return(datas); } ErrorRecord record = dollarErrorVariable[0] as ErrorRecord; if (record != null) { str = record.ToString(); } else { Exception exception = dollarErrorVariable[0] as Exception; if (exception != null) { str = (exception.Message != null) ? exception.Message : string.Empty; } else { str = string.Empty; } } throw PSTraceSource.NewInvalidOperationException("RemotingErrorIdStrings", PSRemotingErrorId.StartupScriptThrewTerminatingError.ToString(), new object[] { str }); }
private Task <IEnumerable <PSObject> > RunIndependentCommandAsync(string input) { independentShell.Runspace = host.GetIndependentRunspace(); independentShell.AddScript(input); return(Task.Factory.FromAsync <IEnumerable <PSObject> >(independentShell.BeginInvoke(), (result) => { return independentShell.EndInvoke(result); })); }
private void EndCurrentAsyncResult() { var asyncResult = Interlocked.Exchange(ref _asyncResult, null); if (null == asyncResult) { return; } _powerShell.EndInvoke(asyncResult); }
public static async Task <PSDataCollection <T2> > InvokeAsync <T1, T2>(this System.Management.Automation.PowerShell shell, PSDataCollection <T1> input = null, PSInvocationSettings invocationSettings = null) { var output = new PSDataCollection <T2>(); object state = "none"; await Task.Factory.FromAsync( (t1, t2, callback, obj) => shell.BeginInvoke(t1, t2, invocationSettings ?? new PSInvocationSettings(), callback, obj), (Action <IAsyncResult>)((a) => shell.EndInvoke(a)), input, output, state); return(output); }
public void Run(List <string> Commands) { try { if (Commands?.Count > 0) { using (runSpace = RunspaceFactory.CreateRunspace()) { runSpace.Open(); using (System.Management.Automation.PowerShell pwsh = System.Management.Automation.PowerShell.Create()) { pwsh.Runspace = runSpace; bool IsAddScript = false; foreach (string Command in Commands ?? Enumerable.Empty <string>()) { if (!string.IsNullOrEmpty(Command)) { pwsh.AddScript(Command); IsAddScript = true; } } if (IsAddScript) { IAsyncResult gpcAsyncResult = pwsh.BeginInvoke(); _ = pwsh.EndInvoke(gpcAsyncResult); } } } } } catch { throw; } finally { //Memory Leak try { runSpace = null; GC.Collect(); } catch { } } }
private PSDataCollection <PSObject> EndInvoke(IAsyncResult result) { try { return(_powerShell.EndInvoke(result)); } catch (PipelineStoppedException e) { return(null); } catch (RemoteException e) { // "is not recognized as the name of a cmdlet" - occurs when remote folder deleted but still presents in profile // also happened when tried to use existing remote profile with another VM that has not been initialized throw new RemoteNotInitializedException(e.Message, e); } }
public void AysncSynchronousPipline(int who = 0) { if (ps != null) { IAsyncResult async = ps.BeginInvoke(); ps.Runspace.Debugger.DebuggerStop += Debugger_DebuggerStop; foreach (PSObject result in ps.EndInvoke(async)) { if (result != null) { output.Add(result.BaseObject); } } } }
public void Run(string Command) { string[] PrintCommandLines = Command.Split(new string[] { "\n" }, StringSplitOptions.None); //NCCFramework.Util.Logger.Debug(ref logger, $@"실행전 : Command = {string.Join("\r\n", PrintCommandLines)} / Now : {DateTime.Now}"); try { using (runSpace = RunspaceFactory.CreateRunspace()) { runSpace.Open(); using (System.Management.Automation.PowerShell pwsh = System.Management.Automation.PowerShell.Create()) { pwsh.Runspace = runSpace; pwsh.AddScript(Command); IAsyncResult gpcAsyncResult = pwsh.BeginInvoke(); _ = pwsh.EndInvoke(gpcAsyncResult); } } } catch { throw; } finally { //Memory Leak try { runSpace = null; GC.Collect(); } catch { } } }
private static IEnumerable <PSObject> InvokeTopLevelPowerShell( PowerShell powerShell, CancellationToken cancellationToken, PSCmdlet cmdlet, PSInvocationSettings invocationSettings, string errorMessageTemplate) { using (var mergedOutput = new BlockingCollection <Func <PSCmdlet, IEnumerable <PSObject> > >(s_blockingCollectionCapacity)) { var asyncOutput = new PSDataCollection <PSObject>(); EventHandler <DataAddedEventArgs> outputHandler = GetStreamForwarder <PSObject>( output => mergedOutput.Add(_ => new[] { output }), swallowInvalidOperationExceptions: true); EventHandler <DataAddedEventArgs> errorHandler = GetStreamForwarder <ErrorRecord>( errorRecord => mergedOutput.Add( delegate(PSCmdlet c) { errorRecord = GetErrorRecordForRemotePipelineInvocation(errorRecord, errorMessageTemplate); HandleErrorFromPipeline(c, errorRecord, powerShell); return(Enumerable.Empty <PSObject>()); }), swallowInvalidOperationExceptions: true); EventHandler <DataAddedEventArgs> warningHandler = GetStreamForwarder <WarningRecord>( warningRecord => mergedOutput.Add( delegate(PSCmdlet c) { c.WriteWarning(warningRecord.Message); return(Enumerable.Empty <PSObject>()); }), swallowInvalidOperationExceptions: true); EventHandler <DataAddedEventArgs> verboseHandler = GetStreamForwarder <VerboseRecord>( verboseRecord => mergedOutput.Add( delegate(PSCmdlet c) { c.WriteVerbose(verboseRecord.Message); return(Enumerable.Empty <PSObject>()); }), swallowInvalidOperationExceptions: true); EventHandler <DataAddedEventArgs> debugHandler = GetStreamForwarder <DebugRecord>( debugRecord => mergedOutput.Add( delegate(PSCmdlet c) { c.WriteDebug(debugRecord.Message); return(Enumerable.Empty <PSObject>()); }), swallowInvalidOperationExceptions: true); EventHandler <DataAddedEventArgs> informationHandler = GetStreamForwarder <InformationRecord>( informationRecord => mergedOutput.Add( delegate(PSCmdlet c) { c.WriteInformation(informationRecord); return(Enumerable.Empty <PSObject>()); }), swallowInvalidOperationExceptions: true); asyncOutput.DataAdded += outputHandler; powerShell.Streams.Error.DataAdded += errorHandler; powerShell.Streams.Warning.DataAdded += warningHandler; powerShell.Streams.Verbose.DataAdded += verboseHandler; powerShell.Streams.Debug.DataAdded += debugHandler; powerShell.Streams.Information.DataAdded += informationHandler; try { // TODO/FIXME: ETW event for PowerShell invocation var asyncResult = powerShell.BeginInvoke <PSObject, PSObject>( input: null, output: asyncOutput, settings: invocationSettings, callback: delegate { try { mergedOutput.CompleteAdding(); } catch (InvalidOperationException) // ignore exceptions thrown because mergedOutput.CompleteAdding was called { } }, state: null); using (cancellationToken.Register(powerShell.Stop)) { try { foreach (Func <PSCmdlet, IEnumerable <PSObject> > mergedOutputItem in mergedOutput.GetConsumingEnumerable()) { foreach (PSObject outputObject in mergedOutputItem(cmdlet)) { yield return(outputObject); } } } finally { mergedOutput.CompleteAdding(); powerShell.EndInvoke(asyncResult); } } } finally { asyncOutput.DataAdded -= outputHandler; powerShell.Streams.Error.DataAdded -= errorHandler; powerShell.Streams.Warning.DataAdded -= warningHandler; powerShell.Streams.Verbose.DataAdded -= verboseHandler; powerShell.Streams.Debug.DataAdded -= debugHandler; powerShell.Streams.Information.DataAdded -= informationHandler; } } }
private static IEnumerable <PSObject> InvokeTopLevelPowerShell(PowerShell powerShell, CancellationToken cancellationToken, PSCmdlet cmdlet, PSInvocationSettings invocationSettings, string errorMessageTemplate) { Action <PSObject> action = null; Action <ErrorRecord> action1 = null; Action <WarningRecord> action2 = null; Action <VerboseRecord> action3 = null; Action <DebugRecord> action4 = null; AsyncCallback asyncCallback = null; using (BlockingCollection <Func <PSCmdlet, IEnumerable <PSObject> > > funcs = new BlockingCollection <Func <PSCmdlet, IEnumerable <PSObject> > >(RemoteDiscoveryHelper.BlockingCollectionCapacity)) { PSDataCollection <PSObject> pSObjects = new PSDataCollection <PSObject>(); if (action == null) { action = (PSObject output) => funcs.Add((PSCmdlet argument0) => { PSObject[] pSObjectArray = new PSObject[1]; pSObjectArray[0] = output; return(pSObjectArray); } ); } EventHandler <DataAddedEventArgs> streamForwarder = RemoteDiscoveryHelper.GetStreamForwarder <PSObject>(action, true); if (action1 == null) { action1 = (ErrorRecord errorRecord) => funcs.Add((PSCmdlet c) => { errorRecord = RemoteDiscoveryHelper.GetErrorRecordForRemotePipelineInvocation(errorRecord, errorMessageTemplate); RemoteDiscoveryHelper.HandleErrorFromPipeline(c, errorRecord, powerShell); return(Enumerable.Empty <PSObject>()); } ); } EventHandler <DataAddedEventArgs> eventHandler = RemoteDiscoveryHelper.GetStreamForwarder <ErrorRecord>(action1, true); if (action2 == null) { action2 = (WarningRecord warningRecord) => funcs.Add((PSCmdlet c) => { c.WriteWarning(warningRecord.Message); return(Enumerable.Empty <PSObject>()); } ); } EventHandler <DataAddedEventArgs> streamForwarder1 = RemoteDiscoveryHelper.GetStreamForwarder <WarningRecord>(action2, true); if (action3 == null) { action3 = (VerboseRecord verboseRecord) => funcs.Add((PSCmdlet c) => { c.WriteVerbose(verboseRecord.Message); return(Enumerable.Empty <PSObject>()); } ); } EventHandler <DataAddedEventArgs> eventHandler1 = RemoteDiscoveryHelper.GetStreamForwarder <VerboseRecord>(action3, true); if (action4 == null) { action4 = (DebugRecord debugRecord) => funcs.Add((PSCmdlet c) => { c.WriteDebug(debugRecord.Message); return(Enumerable.Empty <PSObject>()); } ); } EventHandler <DataAddedEventArgs> streamForwarder2 = RemoteDiscoveryHelper.GetStreamForwarder <DebugRecord>(action4, true); pSObjects.DataAdded += streamForwarder; powerShell.Streams.Error.DataAdded += eventHandler; powerShell.Streams.Warning.DataAdded += streamForwarder1; powerShell.Streams.Verbose.DataAdded += eventHandler1; powerShell.Streams.Debug.DataAdded += streamForwarder2; try { PowerShell powerShell1 = powerShell; object obj = null; PSDataCollection <PSObject> pSObjects1 = pSObjects; PSInvocationSettings pSInvocationSetting = invocationSettings; if (asyncCallback == null) { asyncCallback = (IAsyncResult param0) => { try { funcs.CompleteAdding(); } catch (InvalidOperationException invalidOperationException) { } } ; } IAsyncResult asyncResult = powerShell1.BeginInvoke <PSObject, PSObject>((PSDataCollection <PSObject>)obj, pSObjects1, pSInvocationSetting, asyncCallback, null); CancellationTokenRegistration cancellationTokenRegistration = cancellationToken.Register(new Action(powerShell.Stop)); try { try { foreach (Func <PSCmdlet, IEnumerable <PSObject> > func in funcs) { IEnumerator <PSObject> enumerator = func(cmdlet).GetEnumerator(); using (enumerator) { while (enumerator.MoveNext()) { yield return(enumerator.Current); } } } } finally { funcs.CompleteAdding(); powerShell.EndInvoke(asyncResult); } } finally { cancellationTokenRegistration.Dispose(); } } finally { pSObjects.DataAdded -= streamForwarder; powerShell.Streams.Error.DataAdded -= eventHandler; powerShell.Streams.Warning.DataAdded -= streamForwarder1; powerShell.Streams.Verbose.DataAdded -= eventHandler1; powerShell.Streams.Debug.DataAdded -= streamForwarder2; } } }
private void HandleRunspaceCreated(object sender, RunspaceCreatedEventArgs args) { try { string folderPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); args.Runspace.ExecutionContext.EngineSessionState.SetLocation(folderPath); } catch (ArgumentException ex) { } catch (ProviderNotFoundException ex) { } catch (DriveNotFoundException ex) { } catch (ProviderInvocationException ex) { } Command command = (Command)null; if (!string.IsNullOrEmpty(this.configData.StartupScript)) { command = new Command(this.configData.StartupScript, false, false); } else if (!string.IsNullOrEmpty(this.configData.InitializationScriptForOutOfProcessRunspace)) { command = new Command(this.configData.InitializationScriptForOutOfProcessRunspace, true, false); } if (command == null) { return; } HostInfo hostInfo = this.remoteHost.HostInfo; command.MergeMyResults(PipelineResultTypes.Error, PipelineResultTypes.Output); PowerShell powershell = PowerShell.Create(); powershell.AddCommand(command).AddCommand("out-default"); IAsyncResult asyncResult = new ServerPowerShellDriver(powershell, (PowerShell)null, true, Guid.Empty, this.InstanceId, this, args.Runspace.ApartmentState, hostInfo, RemoteStreamOptions.AddInvocationInfo, false, args.Runspace).Start(); powershell.EndInvoke(asyncResult); ArrayList dollarErrorVariable = (ArrayList)powershell.Runspace.GetExecutionContext.DollarErrorVariable; if (dollarErrorVariable.Count > 0) { string str = (dollarErrorVariable[0] as ErrorRecord).ToString(); throw ServerRunspacePoolDriver.tracer.NewInvalidOperationException("RemotingErrorIdStrings", PSRemotingErrorId.StartupScriptThrewTerminatingError.ToString(), (object)str); } if (this.localRunspacePool.RunspacePoolStateInfo.State != RunspacePoolState.Opening) { return; } object valueToConvert = args.Runspace.SessionStateProxy.PSVariable.GetValue("global:PSApplicationPrivateData"); if (valueToConvert == null) { return; } this.applicationPrivateData = (PSPrimitiveDictionary)LanguagePrimitives.ConvertTo(valueToConvert, typeof(PSPrimitiveDictionary), true, (IFormatProvider)CultureInfo.InvariantCulture, (TypeTable)null); }
public DataTable Run_Table(string Command) { string[] PrintCommandLines = Command.Split(new string[] { "\n" }, StringSplitOptions.None); //NCCFramework.Util.Logger.Debug(ref logger, $@"실행전 : Command = {string.Join("\r\n", PrintCommandLines)} / Now : {DateTime.Now}"); DataTable _ret = new DataTable(); try { using (runSpace = RunspaceFactory.CreateRunspace()) { runSpace.Open(); using (System.Management.Automation.PowerShell pwsh = System.Management.Automation.PowerShell.Create()) { pwsh.Runspace = runSpace; pwsh.AddScript(Command); IAsyncResult gpcAsyncResult = pwsh.BeginInvoke(); using (PSDataCollection <PSObject> ps_result = pwsh.EndInvoke(gpcAsyncResult)) { foreach (PSObject psObject in ps_result) { DataRow row = _ret.NewRow(); foreach (PSPropertyInfo prop in psObject.Properties) { if (prop != null) { if (prop.TypeNameOfValue.ToUpper().Contains("STRING[]")) { if (!_ret.Columns.Contains(prop.Name)) { _ret.Columns.Add(new DataColumn(prop.Name, typeof(string))); } string temp_prop_value = string.Empty; for (int temp_i = 0; prop.Value != null && temp_i < ((string[])prop.Value).Length; temp_i++) { temp_prop_value += ((string[])prop.Value)[temp_i] + ", "; } if (temp_prop_value.EndsWith(", ")) { temp_prop_value = temp_prop_value.Substring(0, temp_prop_value.Length - 2); } row[prop.Name] = temp_prop_value; } else if (prop.TypeNameOfValue.ToUpper().Contains("DICTIONARY")) { if (!_ret.Columns.Contains(prop.Name)) { _ret.Columns.Add(new DataColumn(prop.Name, typeof(string))); } string temp_prop_value = string.Empty; row[prop.Name] = temp_prop_value; } else if (prop.TypeNameOfValue.ToUpper().Contains("NULLABLE")) { if (!_ret.Columns.Contains(prop.Name)) { _ret.Columns.Add(new DataColumn(prop.Name, typeof(string))); } try { row[prop.Name] = (prop.Value == null) ? "" : prop.Value; } catch { row[prop.Name] = ""; } } else if (prop.TypeNameOfValue.ToUpper().Contains("INT")) { if (!_ret.Columns.Contains(prop.Name)) { _ret.Columns.Add(new DataColumn(prop.Name, typeof(long))); } row[prop.Name] = prop.Value; } else { if (!_ret.Columns.Contains(prop.Name)) { _ret.Columns.Add(new DataColumn(prop.Name, typeof(string))); } try { row[prop.Name] = (prop.Value == null) ? "" : prop.Value; } catch { row[prop.Name] = ""; } } } } _ret.Rows.Add(row); } } } } } catch { throw; } finally { //Memory Leak try { runSpace = null; GC.Collect(); } catch { } } return(_ret); }
public DataTable Run_Table(List <string> Commands) { DataTable _ret = new DataTable(); try { using (runSpace = RunspaceFactory.CreateRunspace()) { runSpace.Open(); using (System.Management.Automation.PowerShell pwsh = System.Management.Automation.PowerShell.Create()) { pwsh.Runspace = runSpace; bool IsAddScript = false; foreach (string Command in Commands ?? Enumerable.Empty <string>()) { if (!string.IsNullOrEmpty(Command)) { pwsh.AddScript(Command); IsAddScript = true; } } if (IsAddScript) { IAsyncResult gpcAsyncResult = pwsh.BeginInvoke(); using (PSDataCollection <PSObject> ps_result = pwsh.EndInvoke(gpcAsyncResult)) { foreach (PSObject psObject in ps_result) { // Manual(수동풀) 일시 psObject value == Null if (psObject != null) { DataRow row = _ret.NewRow(); foreach (PSPropertyInfo prop in psObject.Properties) { if (prop != null) { if (prop.TypeNameOfValue.ToUpper().Contains("STRING[]")) { if (!_ret.Columns.Contains(prop.Name)) { _ret.Columns.Add(new DataColumn(prop.Name, typeof(string))); } string temp_prop_value = string.Empty; for (int temp_i = 0; prop.Value != null && temp_i < ((string[])prop.Value).Length; temp_i++) { temp_prop_value += ((string[])prop.Value)[temp_i] + ", "; } if (temp_prop_value.EndsWith(", ")) { temp_prop_value = temp_prop_value.Substring(0, temp_prop_value.Length - 2); } row[prop.Name] = temp_prop_value; } else if (prop.TypeNameOfValue.ToUpper().Contains("DICTIONARY")) { if (!_ret.Columns.Contains(prop.Name)) { _ret.Columns.Add(new DataColumn(prop.Name, typeof(string))); } string temp_prop_value = string.Empty; row[prop.Name] = temp_prop_value; } else if (prop.TypeNameOfValue.ToUpper().Contains("NULLABLE")) { if (!_ret.Columns.Contains(prop.Name)) { _ret.Columns.Add(new DataColumn(prop.Name, typeof(string))); } try { row[prop.Name] = (prop.Value == null) ? "" : prop.Value; } catch { row[prop.Name] = ""; } } else if (prop.TypeNameOfValue.ToUpper().Contains("INT")) { if (!_ret.Columns.Contains(prop.Name)) { _ret.Columns.Add(new DataColumn(prop.Name, typeof(long))); } row[prop.Name] = prop.Value; } else { if (!_ret.Columns.Contains(prop.Name)) { _ret.Columns.Add(new DataColumn(prop.Name, typeof(string))); } try { row[prop.Name] = (prop.Value == null) ? "" : prop.Value; } catch { row[prop.Name] = ""; } } } } _ret.Rows.Add(row); } } } } } } } catch { throw; } finally { //Memory Leak try { runSpace = null; GC.Collect(); } catch { } } return(_ret); }