как установить и войти в удаленный сеанс, используя runspace в powershell - PullRequest
2 голосов
/ 18 января 2012

Я пытаюсь установить сеанс с удаленным хостом 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)

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

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

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

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


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

Есть ли альтернатива, чтобы эта команда работала?

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

Спасибо,

Маниш

Ответы [ 3 ]

7 голосов
/ 19 января 2012

Самый простой способ открыть удаленный сеанс выглядит примерно так:

    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

1 голос
/ 10 июля 2015

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

, но мне не хватало одного порта для WSMan, который равен 5985

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

0 голосов
/ 18 января 2012

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

...