Передать объект Parameter (PSCredential) внутри ScriptBlock программно в C # - PullRequest
2 голосов
/ 18 октября 2010

Я пытаюсь выполнить командлет HPC программно, чтобы изменить учетные данные установки HPC на удаленном компьютере. Если запустить командлет локально, это довольно просто:

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();

Однако, если я хочу сделать то же самое с удаленным PowerShell, мне нужно запустить Invoke-Command и передать учетные данные в ScriptBlock внутри Command. Как я могу это сделать? Это может выглядеть примерно так, за исключением того, что мне нужно передать учетные данные как объект, связанный с параметром InstallCredential внутри ScriptBlock вместо строки:

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();

Ответы [ 2 ]

8 голосов
/ 14 декабря 2012
powershell.AddCommand("Set-Variable");
powershell.AddParameter("Name", "cred");
powershell.AddParameter("Value", Credential);

powershell.AddScript(@"$s = New-PSSession -ComputerName '" + serverName + "' -Credential $cred");
powershell.AddScript(@"$a = Invoke-Command -Session $s -ScriptBlock {" + cmdlet + "}");
powershell.AddScript(@"Remove-PSSession -Session $s");
powershell.AddScript(@"echo $a");

Где Credential - это объект c # PSCredential

Я использую это, может быть, это может помочь вам.

1 голос
/ 18 октября 2010

Я бы продолжил использовать AddCommand для Invoke-Command (вместо AddScript).Добавьте параметры для Invoke-Command и, когда вы получите параметр Scriptblock, убедитесь, что блок сценария определяет блок param (), например:

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

Затем добавьте параметр ArgumentList в Invoke-Commandвведите команду и укажите значение созданной вами учетной записи.

...