как установить и войти в удаленный сеанс, используя пространство выполнения в powershell

Я пытаюсь установить сеанс с удаленным хостом B с моей машины A в коде С#. Для этого я использую 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:

при вызовеSystem.Management.Automation.Internal.Host.InteralHost.GetIHostSupportsInteractiveSession()

в invokedSystem.Management.Automation. Internal.Host.InteralHost.PushRunspace (пространство выполнения Runspace)

в Microsoft.Powershel.Commands.EnterPSSessionCommand.ProcessRecord()

в System.Management.Automation.Cmdlet.DoProcessRecord()

в System.Management.Automation.CommandProcessor.ProcessRecord()

конец внутренней трассировки стека исключений


означает ли это, что я должен написать собственный PSHost и добавить поддержку командлета Enter-PSSession с этим параметром?

Есть ли альтернатива заставить эту команду работать?

Любая помощь будет высоко ценится.

Спасибо,

Маниш


person user1156612    schedule 18.01.2012    source источник


Ответы (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/negotiate/credssp и т. д.

-Ойсин

person x0n    schedule 19.01.2012
comment
Я использую почти тот же код и продолжаю сталкиваться с проблемами из-за слишком большого количества параллельных оболочек, которые не умирают, и их очень сложно разблокировать. Мой вопрос: вы создаете новый сеанс каждый раз, когда запускаете строку remote.Open()? Можете ли вы как-то перечислить эти открытые сеансы? - person CodingYourLife; 06.03.2018

Я хотел оставить комментарий к решению, так как оно мне тоже очень помогло,

но одна вещь, которую мне не хватало, это порт для WSMan, который составляет 5985.

поэтому эта var target = new Uri("http://myserver/wsman"); должно быть var target = new Uri("http://myserver:5895/wsman"); в моем случае

person Stig    schedule 10.07.2015

Вы пробовали Invoke-Command? Enter-PsSession предназначен для интерактивного использования. (см. help Enter-PsSession -online).

person stej    schedule 18.01.2012