【问题标题】:Powershell remote access to nanoserver on dockerPowershell远程访问docker上的nanoserver
【发布时间】:2016-08-28 19:37:05
【问题描述】:

我创建了一个运行 docker 的 W10 VM(来宾),提取了 microsoft/nanoserver 映像并托管了该映像的容器。

(此处教程:https://msdn.microsoft.com/en-us/virtualization/windowscontainers/quick_start/quick_start_windows_10

一切运行良好,甚至主机也可以 ping 在来宾 W10 下运行的容器。但我不能做的是将远程PowerShell连接到容器。

Enter-PSSession -ComputerName "<container ip>" -Credential ~\Administrator

这会弹出一个对话框,询问用户和密码。我不能将其留空或等等 - 结果是访问被拒绝。任何想法如何连接或设置 nanoserver 容器的密码?

【问题讨论】:

  • 它仍然需要某种我没有设置的凭据
  • @RassK 您是否尝试在运行docker run -it microsoft/nanoserver cmd 后出现的提示中设置管理员密码?
  • @MathiasR.Jessen:我添加了密码(net user 列出用户,然后net user Administrator password 设置密码),但我仍然无法远程进入。我得到了PSRemotingTransportException .似乎 https 和 TrustedHosts 是问题所在。
  • @JohnnyOshika,您是否将客户端添加到trustedhosts? Set-Item WSMan:\localhost\Client\TrustedHosts -Value "servername or IP" ?

标签: powershell docker nano-server


【解决方案1】:

我已经为此苦苦挣扎了几天。但是,认为我的问题略有不同,因为我正在尝试对 windows docker 容器执行 Enter-PSSession,但来自另一台机器,而不是容器主机。

在本教程 (http://dinventive.com/blog/2016/01/30/windows-server-core-hello-container/) 中,这个家伙在主机 PSSession 中创建了一个嵌套容器 PSSession。

他使用这个命令,该命令仅在最新版本的 Powershell 中可用。 (不在 v3 中)

Enter-PSSession -ContainerId "<container ID>"

通过以下方式获取 ID:

Get-Container | fl

您还必须检查您的 Powershell 版本并在需要时进行升级。

查看 PS 版本:

$PSVersionTable

并下载 Powershell 最新版本:https://www.microsoft.com/en-us/download/details.aspx?id=50395

【讨论】:

  • 要明确:这是PSv5.1中引入的-ContainerId参数(msdn.microsoft.com/en-us/powershell/reference/5.1/…); Enter-PSSession 本身自(至少)v3 以来就已经存在。如果确实使用-ContainerId 消除了指定凭据的需要,我建议您更清楚地说明。
  • 感谢您的澄清。事实上,-ContainerId 不需要凭据我怀疑选项-ComputerName 不适用于容器
【解决方案2】:

当使用 IP 地址连接到 PS-Session 时,它会增加一些要求,您必须将远程设备配置为使用 ssl,或者将 IP 地址列在受信任的主机中。

解决方案是尝试使用设备的主机名,我已经取得了巨大的成功。或者使用受信任的主机列表。根据我的经验,如果您在您的机器和远程机器上添加受信任的列表条目,它会始终如一地工作。您还可以指定:

Set-Item WSMan:\localhost\Client\TrustedHosts -Value "*"

这基本上会将所有机器都设置在受信任的主机列表中,它有它的缺点,就像所有机器都受信任一样,但在某些受限网络中它是可以接受的。在主机和客户端计算机上执行此操作似乎会产生最佳结果。

当指定 -Credentials 时,它需要一个凭证对象,您可以在 cmdlet 之前制作一个,以避免每次都像这样输入它:

$secpass = convertto-securestring "Password Here" -asplaintext -force
$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist "Username Here", $secpass 
Enter-PSSession -ComputerName "<container ip>" -Credential $cred

在脚本中编写这样的凭据是不好的做法,您应该考虑在脚本中正确存储凭据,上面有很多好的资源。

【讨论】:

  • 您好,尼克,感谢您的回复。抱歉,如果不清楚(这不是我的问题,我只是添加了赏金)我已经将受信任的主机设置为“*”,并且还尝试将容器名称和 IP 地址添加到本地主机(%windir%/system32/etc/hosts) 以便提供名称解析。当您未向“-Credential”参数提供完整凭据时,系统会提示您输入它们。我相信这与传递完整参数一样。您是否在 docker 容器中成功使用了带有 Nanoserver 的 Enter-PSSession?
  • 尼克,我不赞成你的回答,因为我认为这与我遇到的问题无关,即在 docker 中运行时使用 Enter-PSSession 连接到 microsoft/nanoserver 映像 容器.
  • 这就是使用 ps 远程处理的全部内容。听起来在这种情况下还有一个单独的问题,也许如果这个问题被标记为 Docker 或 nanoserver 更多的人会加入。
  • 尼克,我认为你是正确的,因为我在虚拟机而不是 docker 中运行时设法连接到 Nanoserver。也许我会问我自己的问题,并用你建议的标签提供另一个赏金。感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
  • 2020-04-22
  • 1970-01-01
  • 2017-10-25
  • 2021-09-12
  • 1970-01-01
  • 2011-10-28
相关资源
最近更新 更多