PSSession 作为登录用户

PSSession 作为登录用户

我正在尝试设置一个 Powershell 脚本,用于监控在我们的其中一台构建服务器上运行的 VirtualBox VM(即“Builder4”)。它偶尔会断开连接,我已经有一个脚本(服务器上本地)可以重新加载网络适配器,但我想让它完全自动化。

我已经通过服务器正确地验证了 PSSession,成功连接,并且我可以从服务器运行命令,进行交互式会话(Enter-PSSession)等。但是,这是一个“新”会话,因此我无法管理任何已经运行的虚拟机。

服务器设置是带有单个帐户的 Windows Server 2012 机箱。该帐户位于服务器本地,而不是公司域中(“pc-name\user”与“company.na.com\user”),只要服务器正在运行,它就会保持登录状态。通常,我们通过 RemoteDesktop 连接到服务器。即使我使用相同的 pc-name、用户名和凭据连接到 PSSession,它似乎也没有连接到服务器上的现有登录名,尽管我对此的唯一支持证据是VBoxManage list runningvms返回一个空列表。例如,运行以下命令(“test.ps1”的基本内容):

whoami
VBoxManage list vms
echo -----
VBoxManage list runningvms

输出结果如下:

从远程会话

PS ...> test.ps1
win-*******\jenkins
"Builder1" {vm-hash-code}
"Builder2" {vm-hash-code}
"Builder3" {vm-hash-code}
"Builder4" {vm-hash-code}
"Builder5" {vm-hash-code}
"Builder6" {vm-hash-code}
-----
PS ...>

从服务器(本地)

PS ...> test.ps1
win-*******\jenkins
"Builder1" {vm-hash-code}
"Builder2" {vm-hash-code}
"Builder3" {vm-hash-code}
"Builder4" {vm-hash-code}
"Builder5" {vm-hash-code}
"Builder6" {vm-hash-code}
-----
"Builder1" {vm-hash-code}
"Builder2" {vm-hash-code}
"Builder3" {vm-hash-code}
"Builder4" {vm-hash-code}
"Builder5" {vm-hash-code}
PS ...>

就像whoami提示的那样,我似乎以正确的帐户/用户身份登录。但是,正如VBoxManage list runningvms提示的那样,Windows 将其视为“其他用户”(因为是runningvms特定于用户的)。

有没有办法连接到现有登录名而无需注销并使用 CLI 重新登录?远程桌面似乎只需在启动新的远程会话(或在物理机器上解锁)时切换会话控制即可工作,因此我认为此功能是存在的。

为了完成并澄清,我需要通过 CLI 远程连接到现有的登录会话不是只是现有用户。到目前为止,我还没有能够做到这一点。

答案1

PSSession 使用 WinRM 在远程服务器上执行 PS 命令。这里的会话只是已建立的会话,与 RD 会话无关。

如果您需要提取正在运行的 RD/终端会话所特有的变量信息,您可以查看 PSExec。

答案2

我将重述一些现有的信息,但希望这可以澄清事情。

您的问题不是脚本将 PSSession 视为不同的用户。而是 Windows 在远程连接方面是基于会话的。一个用户可能在一台服务器上有多个会话,这些会话具有无法轻松交互的独立进程。有些工具可以在会话之间进行访问,这对于与会话 0 中运行的系统服务进行交互是必需的。出于安全目的,这些会话是隔离的。远程桌面将连接到您正在运行的会话,以便您管理正在运行的虚拟机。

PSSession 也不是完整的交互式登录。它不会创建完整的 Windows“会话”。您可以在 PSSession 内部使用tasklist或查看我所说的内容query session。您将看到控制台的会话 0 和另一个会话 ID,但 PSSession 没有任何会话 ID。它还会在您当前所在的会话旁边显示一个箭头。在 PSSession 中时,它将是会话services

现在,为了能够让您的虚拟机远程显示,您可以尝试从 PSSession 内部启动它们。然后,您可以稍后连接并检查它们,同时重新连接到控制台会话。

答案3

来自的答案乌尔菲科里·克努森成功地为我指明了正确的方向,让我找到了适合我需要的解决方案。

不幸的是,使用 PSSession 启动虚拟机不是一个选项,因为我们仍然需要能够经常以图形方式访问它们。我曾尝试通过 PSSession 启动其中一台虚拟机,确实成功了,但无法通过远程桌面或本地登录(又称“登录会话”)物理访问服务器。

同样,我尝试使用 PSExec,我发现它可以在特定会话下运行(可通过 获取query session)。我能够在与登录会话相同的会话 ID 下启动其中一个虚拟机。我只能通过检查并看到它列在该会话 ID 下才能知道这一点,tasklist因为它从未在视觉上出现过。

最终,我加入了一个StackOverflow 答案放入我正在编写的脚本中。使用的代码片段为远程计算机上的指定用户创建计划任务,运行它,然后删除该任务。正如答案作者所说,确实有点黑客,但它可以很好地满足我在这种情况下的需要。

相关内容