DarkLite1
DarkLite1

Reputation: 14755

PowerShell Closing open sessions

I'm working on a large script where I run a Foreach loop, define variables in that loop and afterwards check if the $Server variable is pingable and if it is remotely accessible.

For this I use the following functions coming from the PowerShell help:

# 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
    }
} 

Every time when I run this code, there is a process created on the remote server called wsmprovhost.exe. This process represents the PowerShell session, if the info I found on the web is correct. However, when doing Get-PSSession $Server there are no open sessions displayed in the PowerShell ISE, even though the processes are visible on the remote server and can only be killed with the Task Manager.

When I run this code often the limit of open sessions is reached because every time a new process wsmprovhost.exe is added to the $Server and the command errors out. I've tried to solve this by adding Exit-PSSessionto the code, but it doesn't close the session.

Any help or ideas are more than welcome.

Upvotes: 4

Views: 29759

Answers (3)

Venkatakrishnan
Venkatakrishnan

Reputation: 786

Even After executing the below command also, if you are not able to create session

Get-PSSession -ComputerName server_name | Remove-PSSession

Please, Restart the service Windows Remote Management (WS-Management) in the target machine.

Upvotes: 1

Rahul
Rahul

Reputation: 77934

If I have understood correctly, Your remote ps-session are not getting closed.

To my understaning, Get-PSSession will show the session till your local session is alive (I mean the session you created the remote ps-session) but once your local session ends Get-PSSession will not show them cause they are no more live on your computer rather on the remote system (or) they are no more in local session scope.

You can get the session using the command

Get-PSSession -ComputerName server_name

If you want to remove them you can do like

Get-PSSession -ComputerName server_name | Remove-PSSession

Upvotes: 4

mjolinor
mjolinor

Reputation: 68341

The problem is that Enter-PSSession. Enter-PSSession can only be used interactively, you can't use it in a script. I'd suggest something more like this:

# 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
        }
 }

Upvotes: 4

Related Questions