Как установить и войти в удаленный сеанс, используя runspace в powershell
Я пытаюсь установить сеанс с удаленным хостом B с моей машины A в коде C#. Я использую для этого Runspace API. фрагмент кода приведен ниже
Runspace runspace = RunspaceFactory.CreateRunspace();
runspace.Open();
//constructing the vmname parameter here
vmname = useralias + DateTime.Now.ToString();
Pipeline pipeline = runspace.CreatePipeline();
string scripttext = "$secpasswd = ConvertTo-SecureString '222_bbbb' -AsPlainText –Force";
string scripttext1 = "$mycreds = New-object -typename System.Management.Automation.PSCredential('TS-TEST-09\\Administrator',$secpasswd)";
string scripttext2 = "$s = New-PSSession -ComputerName TS-TEST-09 -Credential $mycreds";
//not accepting session string here, only computername acceptable
**string scripttext3 = "Enter-PSSession -Session $s";**
//Command cmd = new Command(@"C:\mypath\helper.ps1", true);
//cmd.Parameters.Add("local_useralias", useralias);
//cmd.Parameters.Add("local_vmname", vmname);
//cmd.Parameters.Add("local_datastore", datastoredropdown.Text.ToString());
//cmd.Parameters.Add("local_architecture", architecturedropdown.Text.ToString());
pipeline.Commands.AddScript(scripttext);
pipeline.Commands.AddScript(scripttext1);
pipeline.Commands.AddScript(scripttext2);
pipeline.Commands.AddScript(scripttext3);
//pipeline.Commands.Add(cmd);
Collection<PSObject> results = pipeline.Invoke();
runspace.Close();
ожидается, что этот код войдет в сеанс с машиной TS-TEST-09 и вызовет скрипт helper.ps1, существующий на этой машине (эта часть закомментирована в коде в настоящее время, так как я не могу войти в сеанс с удаленным хостом).
Теперь проблема в том, что я не могу войти в сессию $s с помощью параметра -Session (выделено в scripttext3), однако я могу войти в него с помощью параметра -Computername.
ошибка, которую я получаю при использовании параметра -Session в scripttext3:
в invokedSystem.Management.Automation.Internal.Host.InteralHost.GetIHostSupportsInteractiveSession()
в invokedSystem.Management.Automation. Internal.Host.InteralHost.PushRunspace(Runspace Runspace)
в Microsoft.Powershel.Commands.EnterPSSessionCommand.ProcessRecord()
в System.Management.Automation.Cmdlet.DoProcessRecord()
в System.Management.Automation.CommandProcessor.ProcessRecord()
конец внутренней трассировки стека исключений
это значит, что я должен написать свой PSHost и добавить поддержку командлета Enter-PSSession с этим параметром?
Есть ли альтернатива, чтобы заставить эту команду работать?
Любая помощь будет высоко ценится.
Спасибо,
Manish
3 ответа
Самый простой способ открыть удаленный сеанс выглядит примерно так:
string shell = "http://schemas.microsoft.com/powershell/Microsoft.PowerShell";
var target = new Uri("http://myserver/wsman");
var secured = new SecureString();
foreach (char letter in "mypassword")
{
secured.AppendChar(letter);
}
secured.MakeReadOnly();
var credential = new PSCredential("username", secured);
var connectionInfo = new WSManConnectionInfo(target, shell, credential);
Runspace remote = RunspaceFactory.CreateRunspace(connectionInfo);
remote.Open();
using (var ps = PowerShell.Create())
{
ps.Runspace = remote;
ps.Commands.AddCommand("'This is running on {0}.' -f (hostname)");
Collection<PSObject> output = ps.Invoke();
}
Вы также можете создавать удаленные конвейеры из удаленного экземпляра пространства выполнения, но новый PowerShell
объект является гораздо более управляемым способом сделать это (начиная с powershell v2.)
В powershell v3 вы можете просто WSManConnectionInfo
и установить ComputerName
свойство, как и другие свойства, принимает те же значения по умолчанию, что и выше. К сожалению, эти свойства доступны только для чтения в v2, и вы должны передать минимум, как указано выше. Другие варианты конструктора позволят вам использовать kerberos/gotiate/credssp и т. Д. Для аутентификации.
-Oisin
Я хотел оставить комментарий к решению, так как оно мне очень помогло,
но одна вещь, которую я пропустил, был порт для WSMan, который является 5985
так что это var target = new Uri (" http://myserver/wsman"); должно быть var target = new Uri (" http://myserver:5895/wsman"); в моем случае
Ты пытался Invoke-Command
? Enter-PsSession
есть для интерактивного использования. (увидеть help Enter-PsSession -online
).