Gérer des systèmes distants peut rapidement devenir un casse-tête, surtout lorsque vous devez exécuter plusieurs commandes sur différentes machines. Le va-et-vient constant de la reconnexion aux systèmes peut faire perdre du temps et ralentir votre flux de travail. Cela vous semble familier ? Ne vous inquiétez pas, il existe une meilleure méthode !
Dans ce guide, vous apprendrez à utiliser des sessions de téléadministration PowerShell réutilisables pour rendre la gestion des systèmes distants plus rapide, plus facile et plus efficace.
Prêt à améliorer vos compétences en téléadministration PowerShell ? Plongeons-y !
Créer et utiliser une session
Lorsque vous travaillez avec des systèmes distants, l’une des tâches les plus fastidieuses peut être de se reconnecter à chaque fois que vous exécutez une commande. Dans de tels cas, les sessions réutilisables entrent en jeu.
Créer une session persistante maintient une connexion continue. Cela élimine le besoin de se connecter et de se déconnecter à chaque fois que vous exécutez plusieurs commandes répétées.
Pour commencer, vous devrez créer une session réutilisable.
La commande New-PSSession
établit une connexion persistante à l’ordinateur distant :
$session = New-PSSession -ComputerName SRV2
Cette objet de session peut être passé à des commandes comme Invoke-Command
, vous permettant de réutiliser la même session tout au long de votre script.
Par exemple, vous pouvez tester la connexion en exécutant une commande basique :
Invoke-Command -Session $session -ScriptBlock { hostname }
Une session réutilisable vous permet également de stocker et de récupérer des variables sur le système distant :
Invoke-Command -Session $session -ScriptBlock { $foo = 'Please be here next time' } Invoke-Command -Session $session -ScriptBlock { $foo }
Cette capacité de stockage persistant est un avantage significatif des sessions réutilisables, vous permettant de maintenir l’état à travers plusieurs commandes.
Adapter la fonction pour une utilisation à distance
Adaptation de la fonction d’inventaire pour fonctionner avec des sessions réutilisables.
Tout d’abord, nous ajoutons un paramètre Session
pour accepter un objet session, où le cmdlet Get-Member
aide à identifier le type d’objet session :
$session | Get-Member
Après avoir identifié que l’objet session est de type System.Management.Automation.Runspaces.PSSession
, l’étape suivante consiste à définir la fonction Get-WmiObjectValue
.
Cette fonction utilise le paramètre de session pour permettre l’exécution à distance, lui permettant d’exécuter un bloc de script sur le système distant et de récupérer une propriété WMI spécifique.
function Get-WmiObjectValue { [CmdletBinding()] param( # Specify the name of the WMI property to query [Parameter(Mandatory)] [string]$PropertyName, # Specify the name of the WMI class to query [Parameter(Mandatory)] [string]$WmiClassName, # Specify the remote session object to use for invoking the command [Parameter(Mandatory)] [System.Management.Automation.Runspaces.PSSession]$Session ) # Define the script block to execute on the remote machine $scriptBlock = { # Get the sum of the specified property from the WMI class $number = (Get-CimInstance -ClassName $using:WmiClassName | Measure-Object -Property $using:PropertyName -Sum).Sum # Convert the sum to gigabytes $numberGb = $number / 1GB # Round the result to 2 decimal places [math]::Round($numberGb, 2) } # Execute the script block on the remote machine using the provided session Invoke-Command -Session $Session -Scriptblock $scriptBlock }
Essayons cette fonction et voyons ce qui se passe.
Get-WmiObjectValue -PropertyName Capacity -WmiClassName Win32_PhysicalMemory -Session $session
Vous rencontrerez cette erreur à un moment donné. Mais pas de souci. Lisez la suite et vous apprendrez comment résoudre cette erreur.
Résolution des problèmes d’authentification
Si vous rencontrez des erreurs « Accès refusé », cela est probablement dû à des permissions insuffisantes. Par défaut, les sessions réutilisables héritent des informations d’identification utilisées pour les créer.
Vérifiez le nom d’utilisateur de l’utilisateur actuellement authentifié sur le système :
whoami
Si l’utilisateur de domaine, appelé utilisateur, n’a pas la permission de consulter WMI sur l’ordinateur distant, élevez le Invoke-Command
pour utiliser un compte administrateur.
Tout d’abord, créez un objet d’identification avec le cmdlet Get-Credential
pour spécifier des informations d’identification alternatives lors de la création de la session :
$adminCred = Get-Credential -UserName adam
Une fois authentifié, testez la session :
Invoke-Command -Session $session -Scriptblock {hostname} -Credential $adminCred
Ce test garantit que la session fonctionne comme prévu avant d’exécuter votre fonction d’inventaire.
Mais si la session ne fonctionnait pas, c’était déjà créé avec des informations d’identification incorrectes. Si tel est le cas, vous devez supprimer la session actuelle:
Remove-PSSession -Session $session
La cmdlet Remove-PSSession
supprime la session à la fois sur les ordinateurs locaux et distants.
Avec l’ancienne session supprimée, créez une nouvelle session. Mais cette fois, créez la session authentifiée en tant qu’utilisateur administrateur:
$session = New-PSSession -ComputerName SRV2 -Credential $adminCred
Essayez à nouveau la commande Invoke-Command
en utilisant la nouvelle session et voyez ce qui se passe.
Invoke-Command -Session $session -Scriptblock {hostname} -Credential $adminCred
Maintenant que vous êtes sûr que la nouvelle session fonctionne, essayons à nouveau la fonction.
Get-WmiObjectValue -PropertyName Capacity -WmiClassName Win32_PhysicalMemory -Session $session
Rassemblons Tout
Le travail difficile est terminé, il est temps de tout combiner dans un script unique.
Ce script final rassemble les informations d’inventaire, affiche les résultats et nettoie la session:
function Get-WmiObjectValue { [CmdletBinding()] param( # Specify the name of the WMI property to query [Parameter(Mandatory)] [string]$PropertyName, # Specify the name of the WMI class to query [Parameter(Mandatory)] [string]$WmiClassName, # Specify the remote session object to use for invoking the command [Parameter(Mandatory)] [System.Management.Automation.Runspaces.PSSession]$Session ) # Define the script block to execute on the remote machine $scriptBlock = { # Get the sum of the specified property from the WMI class $number = (Get-CimInstance -ClassName $using:WmiClassName | Measure-Object -Property $using:PropertyName -Sum).Sum # Convert the sum to gigabytes $numberGb = $number / 1GB # Round the result to 2 decimal places [math]::Round($numberGb, 2) } # Execute the script block on the remote machine using the provided session Invoke-Command -Session $Session -Scriptblock $scriptBlock } ## Grab the alternate credential: Get-CimInstance will work on the remote computer $adminCred = Get-Credential -UserName adam ## Create a session authenticating as the adam (admin) user $session = New-PSSession -ComputerName SRV2 -Credential $adminCred ## Find the total memory and total volume storage space on the remote computer $totalMemoryGb = Get-WmiObjectValue -PropertyName Capacity -WmiClassName Win32_PhysicalMemory -Session $session $totalStorageGb = Get-WmiObjectValue -PropertyName FreeSpace -WmiClassName Win32_LogicalDisk -Session $session Write-Host "The computer $($session.ComputerName) has $totalMemoryGb GB of memory and $totalStorageGb GB of free space across all volumes." ## Remove the shared session Remove-PSSession -Session $session
Enregistrez et exécutez le script (Get-InventoryInfo.ps1) pour vérifier qu’il fonctionne comme prévu.
Conclusion
Dans ce tutoriel, vous avez appris à construire une fonction robuste qui utilise des sessions réutilisables pour gérer efficacement les ordinateurs distants. Vous savez maintenant comment maintenir une connexion persistante à travers plusieurs commandes et exécuter des tâches complexes sur des systèmes distants sans vous déconnecter à chaque fois.
À l’avenir, vous pouvez bâtir sur ces connaissances en incorporant des sessions réutilisables dans des flux de travail d’automatisation plus importants. Un exemple serait d’étendre la fonction d’inventaire pour recueillir des métriques système supplémentaires ou automatiser des tâches de maintenance sur plusieurs machines distantes.
Combinez des sessions réutilisables avec d’autres fonctionnalités PowerShell. Rationalisez vos efforts de gestion et d’automatisation informatiques pour gagner du temps et réduire les interventions manuelles.
Source:
https://adamtheautomator.com/powershell-reusable-sessions/