web-dev-qa-db-fra.com

Obtenir toutes les sessions PS ouvertes sur un serveur distant (à partir d'une nouvelle fenêtre de console)

Je peux démarrer 5 nouvelles sessions PS sur un serveur distant et les voir toutes en exécutant Get-PSSession

PS C:\> New-PSSession -ComputerName MyServerName

     Id Name            ComputerName    State         ConfigurationName     Availability
     -- ----            ------------    -----         -----------------     ------------
      1 Session1        MyServerName   Opened        Microsoft.PowerShell     Available

    [repeat 4 more times]

Comme prévu, lorsque j'essaie d'ouvrir une 6ème session, j'obtiens l'erreur disant que c'est un non-non (en raison de la limite par défaut de PoswerShells de 5 sessions PSSessions distantes simultanées). Mais l'exécution de Get-Session affiche les 5 sessions, donc tout fonctionne comme il se doit jusqu'à présent:

PS C:\> New-PSSession -ComputerName MyServerName
    New-PSSession : [......maximum number of 5 concurrent shells]

PS C:\> Get-PSSession

     Id Name            ComputerName    State         ConfigurationName     Availability
     -- ----            ------------    -----         -----------------     ------------
      1 Session1        MyServerName   Opened        Microsoft.PowerShell     Available
      2 Session2        MyServerName   Opened        Microsoft.PowerShell     Available
      3 Session3        MyServerName   Opened        Microsoft.PowerShell     Available
      4 Session4        MyServerName   Opened        Microsoft.PowerShell     Available
      5 Session5        MyServerName   Opened        Microsoft.PowerShell     Available

Cependant, lorsque je ferme cette console et en ouvre une nouvelle, l'exécution de Get-PSSession (avec ou sans le paramètre "-ComputerName" défini) ne montre aucune session ouverte.

PS C:\> Get-PSSession
PS C:\>

Je sais que ces sessions sont toujours ouvertes car lorsque j'essaie d'en ouvrir une nouvelle dans ma nouvelle console, j'obtiens la même erreur concernant plus de 5 sessions simultanées:

PS C:\> New-PSSession -ComputerName MyServerName
    New-PSSession : [......maximum number of 5 concurrent shells]

Selon 'Get-PSSession Get-Help -full' en cours d'exécution 'Get-PSSession -ComputerName MyServerName devrait obtenir toutes les sessions PS distantes sur un serveur particulier, quelle que soit la session ou l'ordinateur à partir duquel elles ont été démarrées (au moins la façon dont je le comprends):

"La commande renvoie toutes les sessions sur [le serveur distant], même si elles ont été créées dans des sessions différentes ou sur des ordinateurs différents."

Alors, existe-t-il un moyen de trouver et/ou de supprimer des sessions PS ouvertes sur un serveur distant - sans avoir à tout faire à partir d'une session de console?

14
Local Needs

D'après ce que je peux dire ...

Les sessions PSSession que vous avez créées sont en direct sur "MyServerName" et, pendant la durée de la session que vous avez créée pour la première fois, seront également renvoyées par Get-PSSession (sans argument, dans la fenêtre PowerShell de la boîte à partir de laquelle vous vous connectez). Lorsque vous fermez la session dans laquelle ils sont créés, les sessions ne sont plus sur votre ordinateur. C'est pourquoi Get-PSSession ne renvoie rien lorsque vous fermez et ouvrez une nouvelle fenêtre PowerShell. Ils n'ont jamais "vécu" sur votre ordinateur, ce sont des sessions distantes, cependant, ils étaient dans la portée dans votre fenêtre PowerShell d'origine car c'est la portée locale que vous les a créés.

Si vos sessions sont toujours sur MyServerName, car il semble qu'elles soient dues à l'erreur que vous mentionnez sur les sessions max, alors la saisie de la commande suivante devrait les répertorier:

Get-PSSession -ComputerName MyServerName

Si vous vouliez tous les reconnecter dans votre session/fenêtre existante, vous pourriez faire:

Get-PSSession -ComputerName MyServerName | Connect-PSSession

Pour les supprimer tous, vous permettant de créer de nouvelles sessions PSSession vers MyServerName

Get-PSSession -ComputerName MyServerName | Remove-PSSession

En regardant un peu plus loin dans les documents, toutes les sessions ne vivent pas indéfiniment lorsque vous fermez votre fenêtre PowerShell. Voir:

Get-Help about_Remote_Disconnected_Sessions -ShowWindow

extrait partiel (avec emphase le mien):

Si vous fermez (quittez) la session dans laquelle une session PSSession a été créée alors que les commandes sont en cours d'exécution dans la session PSSession, Windows PowerShell conserve la session PSSession à l'état déconnecté sur l'ordinateur distant. Si vous fermez (quittez) la session dans laquelle une session PSSession a été créée, mais qu'aucune commande n'est en cours d'exécution dans la session PSSession, Windows PowerShell n'essaie pas de maintenir la session PSSession.

D'après ce que je peux voir, les sessions qui ne sont pas a) déconnectées ou b) occupées à exécuter une commande sont rejetées lorsque vous fermez la fenêtre PowerShell à partir de laquelle vous avez démarré les sessions PSSession. De plus, la documentation semble mentionner qu'il existe également des délais d'attente (qui dépendent probablement des configurations PSSessionConfiguration sur le serveur, mais je ne connais pas encore ces derniers moi-même (autres qu'ils existent).

C'était une bonne excuse pour moi de passer en revue une partie de la documentation de PowerShell Remoting, regardez également:

Get-Help *PSSession*
Get-Help *remote*
12
Joshua McKinnon

D'après mon expérimentation, si les sessions ne font rien, elles se ferment du côté distant. Pour éviter cela, demandez-leur de faire quelque chose, par exemple:

Invoke-Command -Session $s { ... } -AsJob
Invoke-Command server01 { ... } -Disconnected

Ou l'autre option consiste à déconnecter vos sessions:

Disconnect-PSSession -Id (1..5)

Les deux approches entraîneront la survie des sessions à distance.

0
Keith Hill