PowerShell关闭打开的会话

时间:2014-06-15 12:28:15

标签: session powershell

我正在处理一个大型脚本,我在其中运行Foreach循环,在该循环中定义变量,然后检查$Server变量是否可ping,以及是否可远程访问。

为此,我使用来自PowerShell帮助的以下函数:

# Function to check if $Server is online
Function CanPing ($Server) {
   $error.clear()
   $tmp = Test-Connection $Server -ErrorAction SilentlyContinue

   if ($?) {
       Write-Host "Ping succeeded: $Server"; Return $true
   }
   else {
        Write-Host "Ping failed: $Server."; Return $false
   }
}

# Function to check if $Server is remotely accessible
Function CanRemote ($Server) {
    $s = New-PSSession $Server -Authentication Credssp -Credential $Credentials -Name "Test" -ErrorAction SilentlyContinue

    if ($s -is [System.Management.Automation.Runspaces.PSSession]) {
        Enter-PSSession -Session $s
        Exit-PSSession
        Write-Host "Remote test succeeded: $Server."; Return $true
    }
    else {
        Write-Host "Remote test failed: $Server."; Return $false
    }
}

# Execute functions to check $Server
if ($Server -ne "UNC") {

    if (CanPing $Server) {
        if (-Not (CanRemote $Server)) {
        Write-Host "Exit loop REMOTE" -ForegroundColor Yellow
        continue
        }
    }
    else {
         Write-Host "Exit loop PING" -ForegroundColor Yellow
         continue # 'continue' to the next object and don't execute the rest of the code, 'break' exits the foreach loop completely
    }
} 

每次运行此代码时,都会在远程服务器上创建一个名为wsmprovhost.exe的进程。如果我在网络上找到的信息正确,则此过程代表PowerShell会话。但是,在执行Get-PSSession $Server时,PowerShell ISE中没有显示打开的会话,即使这些进程在远程服务器上可见,并且只能使用任务管理器终止。

当我经常运行此代码时,会达到开放会话的限制,因为每次将新进程wsmprovhost.exe添加到$Server并且命令错误输出时。我已尝试通过在代码中添加Exit-PSSession来解决此问题,但它并未关闭会话。

非常欢迎任何帮助或想法。

3 个答案:

答案 0 :(得分:4)

问题是Enter-PSSession。 Enter-PSSession只能以交互方式使用,您不能在脚本中使用它。我建议更像这样的事情:

# Function to check if $Server is remotely accessible
Function CanRemote ($Server) {

  Try {
   $s = New-PSSession $Server -Authentication Credssp -Credential $Credentials -Name "Test" -ErrorAction Stop
   Write-Host "Remote test succeeded: $Server."
   $true
   Remove-PSSession $s
   }

  Catch {
          "Remote test failed: $Server."
          $false
        }
 }

答案 1 :(得分:4)

如果我理解正确,您的远程ps-session不会被关闭。

根据我的理解,Get-PSSession会在本地会议之前显示会话 还活着(我的意思是你创建了远程ps-session的会话)但是一旦你的本地会话 结尾Get-PSSession不会显示它们,因为它们不再存在于您的计算机上 而是在远程系统(或)上,它们不再是本地会话范围。

您可以使用命令

获取会话
Get-PSSession -ComputerName server_name

如果你想删除它们,你可以这样做

Get-PSSession -ComputerName server_name | Remove-PSSession

答案 2 :(得分:0)

即使执行以下命令也是如此,如果您无法创建会话

Get-PSSession -ComputerName server_name | Remove-PSSession

请在目标计算机中重新启动服务Windows远程管理(WS-Management)。