2

我正在尝试在 C# 代码中从我的机器 A 与远程主机 B 建立会话。我正在为此使用运行空间 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(该部分在当前代码中被注释掉,因为我无法进入与远程主机的会话)。

现在的问题是我无法使用 -Session 参数进入会话 $s(在 scripttext3 突出显示)但是我可以使用 -Computername 参数进入它。

在 scripttext3 中使用 -Session 参数时出现的错误是:

在调用System.Management.Automation.Internal.Host.InteralHost.GetIHostSupportsInteractiveSession()

在调用System.Management.Automation。Internal.Host.InteralHost.PushRunspace(运行空间运行空间)

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

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

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

内部异常堆栈跟踪结束


这是否意味着我必须编写一个自定义 PSHost 并使用此参数添加对 Enter-PSSession cmdlet 的支持?

有没有其他方法可以使这个命令起作用?

任何帮助都感激不尽。

谢谢,

马尼什

4

3 回答 3

8

打开远程会话的最简单方法是这样的:

    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 中,您可以只新建 aWSManConnectionInfo并设置ComputerName属性,因为其他属性采用与上述相同的默认值。不幸的是,这些属性在 v2 中是只读的,您必须像上面那样传递最小值。构造函数的其他变体将允许您使用 kerberos/negotiate/credssp 等进行身份验证。

-Oisin

于 2012-01-19T02:58:39.303 回答
1

我想对解决方案发表评论,因为它对我也有很大帮助,

但我缺少的一件事是 WSMan 的端口是 5985

所以这个 var target = new Uri(" http://myserver/wsman "); 应该是 var target = new Uri(" http://myserver:5895/wsman "); 就我而言

于 2015-07-10T14:48:24.443 回答
0

你试过Invoke-Command吗?Enter-PsSession是否用于交互使用。(见help Enter-PsSession -online)。

于 2012-01-18T16:37:48.883 回答