Bonjour à tous !
Lors d'une migration effectuée à l'aide du produit Quest Migration Manager for Active Directory, vous vous retrouvez souvent en fin de migration avec un nombre conséquent d'agents Quest à désinstaller de tous les postes migrés.
Ce que vous pouvez très bien faire à l'aide de Quest RUM (Resource Updating Manager) via l'option Cleanup :
Mais il peut arriver qu'entre temps que certains postes migrés soient devenus indisponibles. Plutôt que de refaire une passe numéro X pour désinstaller les agents, nous allons voir comment automatiser la désinstallation de ceux-ci.
Prérequis
Pour ce faire, il vous faut :
- Un serveur sur lequel sera placé un partage accessible par toutes les machines ayant un agent Quest
- Un éditeur de script Powershell
- Une console d'édition de stratégies de groupe
Le partage de fichiers
Afin que notre script de désinstallation puisse écrire les logs nécessaire, il doit avoir à disposition un partage sur lequel les machines concernées puissent avoir un droit d'écriture de fichiers.
Par défaut, le script va utiliser le nom de partage QuestUninstallLogs$ mais vous pourrez le modifier via les arguments du script. Nous rajoutons un $ à la fin du nom du partage afin de masquer celui-ci.
Il faut ajouter sur le partage (droit de partage) le droit en modification pour le groupe Everyone.
Il faut ajouter sur le dossier (droit NTFS) le droit en modification et en écriture pour le groupe Authenticated Users.
Une fois cela fait, nous pouvons passer à l'édition du script.
Le script
Arguments
Le script s'appelle à l'aide des arguments suivants :
- -Pole (obligatoire) : Nom du dossier de 1er niveau des logs
- -Site (obligatoire) : Nom du dossier de 2ème niveau des logs
- -LogServer (obligatoire) : Nom du serveur devant recevoir les logs
- -LogShare (facultatif) : Nom du partage devant recevoir les logs
Sortie
Deux types de fichiers de logs vont être générés en sortie dans le chemin indiqué en paramètre du script :
- XXX_SUMMARY.log : Fichier résumant toutes les désinstallations effectuées par le script
- COMPUTERS\PC-XXX.log : Fichier détaillant le déroulement de la désinstallation de l'agent Quest pour le poste concerné
Code
#-------------------#
# Script Parameters #
#-------------------#
# Description
# The Uninstall_Quest_Agent script is uninstalling the Quest RUM Agent
#
# How to use it
#
# .\Uninstall_Quest_Agent.ps1 -Pole "POLE_IDF" -Site "Site_1" -LogServer "LOG_SERVER_1" -LogShare "QuestUninstallLogs$"
#
# -Pole = Targeted Pole
# -Site = Targeted Site
# -LogServer = Server on which the uninstall logs will be stored
# -LogShare (not mandatory) = Network Share on which the uninstall logs will be stored
########## PARAMETERS ##########
[CmdletBinding(DefaultParametersetName="Common")]
param(
#Attribute field to check
[Parameter(Mandatory=$true,Position=1)][string] $Pole = $null,
#Attribute field to check
[Parameter(Mandatory=$true,Position=2)][string] $Site = $null,
#Attributes fields to check
[Parameter(Mandatory=$false,Position=3)][string] $LogServer = $null,
#Attributes fields to check
[Parameter(Mandatory=$false,Position=4)][string] $LogShare = "QuestUninstallLogs$"
)
########## SCRIPT EXECUTION ##########
# Check if script has been executed (log file already exists)
# Define logfile path and name
# Detailed logs
$LogFileDirectoryPath = "\\" + $LogServer + "\" + $LogShare + "\" + $Pole + "\" + $Site + "\COMPUTERS"
$LogFileName = $env:computername + ".log"
$LogFilePath = $LogFileDirectoryPath + "\" + $LogFileName
# Summary logs
$SummaryLogFileDirectoryPath = "\\" + $LogServer + "\" + $LogShare + "\" + $Pole + "\" + $Site
$SummaryLogFileName = $Pole + "_" + $Site + "_" + "SUMMARY.log"
$SummaryLogFilePath = $SummaryLogFileDirectoryPath + "\" + $SummaryLogFileName
# End script if Quest Agent Service is missing
$Service = Get-Service QsRUMAgent -ErrorAction SilentlyContinue
if($Service -eq $null)
{
Exit
}
########## LOG FILES MANAGMENT ##########
# Checking if directories need to be created
# Check if pole directory exists
$PoleFilePath = "\\" + $LogServer + "\" + $LogShare + "\" + $Pole
# If directory don't exist, we create it
if(!(Test-Path $PoleFilePath))
{
New-Item $PoleFilePath -ItemType Directory
}
# Check if site directory exists
$SiteFilePath = "\\" + $LogServer + "\" + $LogShare + "\" + $Pole + "\" + $Site
# If directory don't exist, we create it
if(!(Test-Path $SiteFilePath))
{
New-Item $SiteFilePath -ItemType Directory
}
# Check if COMPUTERS directory exists
$ComputersFilePath = "\\" + $LogServer + "\" + $LogShare + "\" + $Pole + "\" + $Site + "\COMPUTERS"
# If directory don't exist, we create it
if(!(Test-Path $ComputersFilePath))
{
New-Item $ComputersFilePath -ItemType Directory
}
########## UNINSTALLING AGENT ##########
$Date = (Get-Date).ToString()
$ComputerName = "\\" + $env:computername
# Log
$ToWrite = $Date + " - " + "Begining of Quest agent uninstallation"
Add-Content $LogFilePath $ToWrite
# Stopping and Deleting Quest Migration Manager RUM Agent Service
$Service = Get-Service QsRUMAgent -ErrorAction SilentlyContinue
#If service exists
if($Service)
{
Stop-Service $Service.Name
# Log
$ToWrite = $Date + " - " + "Quest Migration Manager RUM Agent Service - Stopped"
Add-Content $LogFilePath $ToWrite
sc.exe $ComputerName delete $Service.Name
# Log
$ToWrite = $Date + " - " + "Quest Migration Manager RUM Agent Service - Deleted"
Add-Content $LogFilePath $ToWrite
# Log Général
$ToWrite = $Date + " - " + $env:computername + " - " + "Agent Deleted"
Add-Content $SummaryLogFilePath $ToWrite
}
else
{
# Log
$ToWrite = $Date + " - " + "ERROR : Quest Migration Manager RUM Agent Service not found !"
Add-Content $LogFilePath $ToWrite
}
# Deleting Quest Migration Manager RUM Agent Directory
$QuestAgentDirectory = "$env:SystemRoot\Quest Resource Updating Agent"
#If directory exists
if(Test-Path $QuestAgentDirectory)
{
Remove-Item $QuestAgentDirectory -Recurse
# Log
$ToWrite = $Date + " - " + "Quest Migration Manager RUM Agent Directory - Deleted"
Add-Content $LogFilePath $ToWrite
}
else
{
# Log
$ToWrite = $Date + " - " + "ERROR : Quest Migration Manager RUM Agent Directory not found !"
Add-Content $LogFilePath $ToWrite
}
# Log
$ToWrite = $Date + " - " + "End of Quest agent uninstallation"
Add-Content $LogFilePath $ToWrite
Utilisation du script
Vous pouvez utiliser ce script directement sur le poste concerné ou par GPO pour une désinstallation groupée.
Par GPO, le script s'utilise dans la section Powershell dans les Paramètres Ordinateurs de la console de configuration des GPO.
Le chemin pour y accéder est Configuration Ordinateur > Stratégies > Paramètres Windows > Arrêt > Scripts Powershell
A minima, le script doit s'appeller à l'aide des paramètres suivants :
Au fur et à mesure que le script est exécuté, vous devriez voir le dossier des logs se remplir, que ce soit pour le log SUMMARY qui résume toutes les désinstallations ou pour les logs individuels par machine.