Sous ce titre un peu barbare, je vais partager un script que j’ai brodé aujourd’hui. En local sur ma station, j’utilisais un script Powershell me permettant de fermer des sessions RDP simplement déconnectées (que j’ai d’ailleurs publié dans cet article 😉). Seulement, il a été décidé de le modifier de manière à ce que le script ne demande plus un nom de machine particulière, mais de simplement s’occuper de la machine sur laquelle il est exécuté. En contrepartie, l’idée était de le déployer sur tous les serveurs, afin de pouvoir l’appeler via une tâche planifiée de manière à ce que tous les jours les sessions RDP inactives soient shuntées.
Le script ci-dessous va donc effectuer les tâches suivantes :
- demander un nom de serveur
- créer un répertoire sur le disque local C:
- copier le script dans le répertoire fraîchement créé
- créer une tâche planifiée, exécutée par l’utilisateur SYSTEM, avec une élévation de droits, qui va donc appeler le script qui a été copié.
Plusieurs choses :
- Les instructions propres au planificateur de tâches ne fonctionnent qu’à partir de Windows 2012 R2 ou 8.1, indépendamment de la version de PS.
- J’ai utilisé les partages administratifs au lieu d’un PS-Session pour la copie car un Copy-Item -ToSession nécessite PowerShell V5, or mon environnement est hybride V4 et V5 et je ne peux pas tout déployer directement depuis un hôte en V5.
- Les commandlets du planificateur de tâches ne fonctionnent qu’en local, il faut donc les appeler sur le système distant via Invoke-Command.
$RemoteServer = Read-Host "Destination Server to install script and create scheduled task ?"
$ScriptDir = "\\"+$RemoteServer+"\c$\"
New-Item -Path $ScriptDir -Name "Scripts" -ItemType "directory"
$FinalDest = "\\"+$RemoteServer+"\c$\Scripts"
Copy-Item "script.ps1" -Destination $FinalDest -Force
if ($?){ Write-Host "Copy successful." }
else { Write-Host "Copy failed." ; break }
Invoke-Command -ComputerName $RemoteServer -ScriptBlock {
$TaskDetails = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount -RunLevel Highest
$TaskAction = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "C:\Scripts\script.ps1"
$TaskSched = New-ScheduledTaskTrigger -Daily -At 4am
$TaskName = "AutoDisconnectSession"
Register-ScheduledTask -Action $TaskAction -Principal $TaskDetails -Trigger $TaskSched -TaskName $TaskName }
if ($?) { Write-Host "Task successfully created." }
else { "There was an error creating the task." }