Ik ben bezig om een applicatie te maken die een powershell connectie naar 64 systemen moet gaan onderhouden. In deze applicatie komt een service te draaien waar weer andere applicaties tegenaan kunnen praten (noem het een Powershell Proxy). Het doel hiervan is om commando's tegen meerdere systemen uit te voeren en direct een weergave hiervoor te maken (dit wordt een WPF webapplicatie). Dit alles is voor intern gebruik ten behoeve van beheer.
Nu ben ik eigenlijk van plan een thread per connectie op te starten, zodat commando's ook tegelijkertijd ook uitgevoerd kunnen worden (deze moeten uit een queue gelepeld worden, maar zover ben ik nog niet). De reden hiervoor is dat sommige commando's lang kunnen duren voordat ze uitgevoerd zijn.
Eerst wil ik per thread een connectie opzetten en controleren of er een resultaat terug komt:
Bovenstaande code wordt dus Parallel uitgevoerd (op dit moment nog door een simpele thread.start, maar als ik later verder ben in het TPL / .NET 4.5 veranderd dit nog), maar het Pipeline object kan hier slecht tegen. Op bovenstaande code wordt het commando gewoon niet gerunt (Wireshark laat geen verkeer zien richting de betreffende systemen). Als ik voor 1 systeem bovenstaande code in de main thread run wordt er netjes een verbinding opgezet.
* 1 Runspace per thread;
* Iedere call maakt een nieuwe pipeline aan.
Overigens ben ik al weken met bovenstaand probleem bezig (Iedere Google term die er bij zou komen ondertussen gehad).
Iemand enig idee hoe ik dit anders kan aanpakken?
Nu ben ik eigenlijk van plan een thread per connectie op te starten, zodat commando's ook tegelijkertijd ook uitgevoerd kunnen worden (deze moeten uit een queue gelepeld worden, maar zover ben ik nog niet). De reden hiervoor is dat sommige commando's lang kunnen duren voordat ze uitgevoerd zijn.
Eerst wil ik per thread een connectie opzetten en controleren of er een resultaat terug komt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
| // Connect public override Boolean Connect() { Pipeline pl = rs.CreatePipeline(); pl.Commands.AddScript("Add-PSSnapin VMware.VimAutomation.Core"); pl.Commands.AddScript("Set-ExecutionPolicy RemoteSigned -Scope CurrentUser"); //pl.Commands.AddScript("Set-PowerCLIConfiguration -InvalidCertificateAction \"Ignore\" -Confirm:$false"); pl.Commands.AddScript("Connect-VIServer -Verbose -Server " + sys.strName + " -Protocol https -User " + sys.strUsername + " -Password " + sys.strPassword); wOutput(pl); return true; } // Execute command with output public override void wOutput(object oCommand) { Pipeline pl = (Pipeline)oCommand; // Return values List<PSObject> lPSOObjects = new List<PSObject>(); // Event when pipeline is ready pl.Output.DataReady += Output_DataReady; // Invoke pipeline pl.Invoke(); } // Data ready to read void Output_DataReady(object sender, EventArgs e) { PipelineReader<PSObject> output = sender as PipelineReader<PSObject>; } |
Bovenstaande code wordt dus Parallel uitgevoerd (op dit moment nog door een simpele thread.start, maar als ik later verder ben in het TPL / .NET 4.5 veranderd dit nog), maar het Pipeline object kan hier slecht tegen. Op bovenstaande code wordt het commando gewoon niet gerunt (Wireshark laat geen verkeer zien richting de betreffende systemen). Als ik voor 1 systeem bovenstaande code in de main thread run wordt er netjes een verbinding opgezet.
* 1 Runspace per thread;
* Iedere call maakt een nieuwe pipeline aan.
Overigens ben ik al weken met bovenstaand probleem bezig (Iedere Google term die er bij zou komen ondertussen gehad).
Iemand enig idee hoe ik dit anders kan aanpakken?