Передайте объект Parameter (PSCredential) внутри ScriptBlock программно на C#

Я пытаюсь программно запустить командлет 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 внутри команды. Как я могу это сделать? Это может выглядеть примерно так, за исключением того, что мне нужно передать учетные данные как объект, привязанный к параметру 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();

person Ching Chang    schedule 18.10.2010    source источник


Ответы (2)


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

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

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

person Keith Hill    schedule 18.10.2010

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 — это объект С# PSCredential

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

person d.g    schedule 14.12.2012