我使用enter-pssession
在远程服务器上运行脚本。所以我可以远程登录服务器。以交互方式运行命令,关闭powershell控制台,稍后我可以重新连接会话并检查命令输出。
PowerShell中是否有类似Linux screen
的功能?我无法使用Windows远程桌面连接服务器。
答案 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