tags:

views:

46

answers:

1

I am trying to run an HPC cmdlet programmatically to change HPC install credential on a remote computer. If run the cmdlet locally, it's pretty straightforward:

            Runspace rs = GetPowerShellRunspace();
            rs.Open();

            Pipeline pipeline = rs.CreatePipeline();
            PSCredential credential = new PSCredential(domainAccount, newPassword);
            Command cmd = new Command("Set-HpcClusterProperty");
            cmd.Parameters.Add("InstallCredential", credential);

            pipeline.Commands.Add(cmd);

            Collection<PSObject> ret = pipeline.Invoke();

However, if I want to do the same thing with remote PowerShell, I need to run Invoke-Command and pass in the credential to the ScriptBlock inside the Command. How can I do that? It might look something like this, except I need to pass in the credential as an object binded to the InstallCredential parameter inside the ScriptBlock instead of a string:

                Pipeline pipeline = rs.CreatePipeline();
                PSCredential credential = new PSCredential(domainAccount, newPassword);

                pipeline.Commands.AddScript(string.Format(
                    CultureInfo.InvariantCulture,
                    "Invoke-Command -ComputerName {0} -ScriptBlock {{ Set-HpcClusterProperty -InstallCredential {1} }}",
                    nodeName,
                    credential));

                Collection<PSObject> ret = pipeline.Invoke();
A: 

I would continue to use AddCommand for Invoke-Command (instead of AddScript). Add the parameters for Invoke-Command and when you get to Scriptblock parameter, make sure the scriptblock defines a param() block e.g.:

{param($cred) Set-HpcClusterProperty -InstallCredential $cred}

Then add the ArgumentList parameter to the Invoke-Command command and set the value to the credential you have created.

Keith Hill