Powershell"屏幕" - 即使连接被丢弃,保持进程运行?

时间:2017-03-27 15:00:08

标签: powershell

我使用enter-pssession在远程服务器上运行脚本。所以我可以远程登录服务器。以交互方式运行命令,关闭powershell控制台,稍后我可以重新连接会话并检查命令输出。

PowerShell中是否有类似Linux screen的功能?我无法使用Windows远程桌面连接服务器。

2 个答案:

答案 0 :(得分:2)

您可以将Invoke-Command-InDisconnectedSession一起使用,它将以异步模式启动会话。在您可以连接到此会话后,从中获取数据等。您可以阅读有关此here.

的更多信息

您可以创建会话,断开与会话的连接,然后再连接回来。

可能对您有用:New-PSSessionOption -IdleTimeout

-IdleTimeout: 确定如果远程计算机未从本地计算机接收任何通信,会话保持打开的时间长度。这包括心跳信号。间隔到期时,会话关闭。 MSDN Link

答案 1 :(得分:1)

我最近遇到了使用PSSessions的双跳问题。我所做的是在远程服务器上创建一个会话配置,使用-RunAs参数来设置我需要执行远程服务器上的命令的凭据。然后连接到远程服务器上的该会话配置,事情应该按预期工作。

$MyCreds = Get-Credential ''
Invoke-Command -ScriptBlock {
    Set-PSSessionConfiguration -Name "My Remote Config" -RunAsCredential $using:MyCreds -Force
} -ComputerName Server01

然后,一旦会话配置存在,我就可以使用该配置启动会话,并且整个双跳问题是无效的。

现在,请注意我添加了一些额外的安全性,以便其他人无法使用我的会话配置,因为该配置将我的凭据缓存在服务器上(加密),如果他们使用该配置,他们可以做任何他们想做的事情像我一样因此,为了实现这一点,我获得了我的域帐户SID,生成SDDL行,并将会话配置的访问权限仅限于我的帐户。

$Searcher = [adsisearcher]"(&(sAMAccountName=$($Creds.UserName.Split('\')[1]))(objectClass=user))"
$Results=$Searcher.FindOne().GetDirectoryEntry()
$MySID = new-object System.Security.Principal.SecurityIdentifier($Results.objectSid.value,0)|% value
$SDDL = "O:NSG:BAD:P(A;;GR;;;BA)(A;;GR;;;IU)(A;;GA;;;$MySID)S:P(AU;FA;GA;;;WD)(AU;SA;GXGW;;;WD)"
$FQDN = $Server.ServerName,$Server.Forest -join '.'
$MySessionName = "DoubleHop-{0}" -f $MyCreds.UserName.Split('\')[1]
Invoke-Command -ScriptBlock {
    Register-PSSessionConfiguration -Name $using:MySessionName -RunAsCredential $using:MyCreds -Force -SecurityDescriptorSddl $using:SDDL
} -ComputerName $FQDN -ea 4