Question
Erreur parcours registre
- Benjamin
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 14
- Remerciements reçus 0
Je reviens vers vous avec un nouveau soucis qui, après plusieurs jours de recherche intensive, m'a fait perdre tous mes cheveux
Je cherche donc à parcourir la liste des programmes installés sur ma machine (sans passer par l'objet wmi car ccleaner ne remonte pas).
J'ai donc ce code-là :
[code:1]
# ========================================================================
# Initialisation de l'ensemble des variables
# ========================================================================
# Récupération du nom de la machine
$Poste = $env:COMPUTERNAME
# Récupération de l'architecture de l'OS, renvoie 4 pour du 32bits et 8 pour du 64bits
$ArchiOS = [IntPtr]::«»Size
# Initialisation des deux listes de programmes
$MesObjets = @()
$MesObjetsBis = @()
# Accès à la base de registre de la machine
$Type = [Microsoft.Win32.RegistryHive]::LocalMachine
$RemoteRegistry = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($Type, $Poste)
# Définition des clés de registre comportant les programmes
$Clef = \"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\"
$ClefBis = \"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"
# Stockage du chemin de registre pour parcours ultérieur
$RegKey = $RemoteRegistry.OpenSubKey($Clef)
$RegKeyBis = $RemoteRegistry.OpenSubKey($ClefBis)
# Nom du logiciel
$Logiciel = \"CCleaner\"
# Variables de test de présence de logiciel, initialisées à faux
$Installe = \"False\"
# Variable de versions des différents logiciels
$Version = \"5.02\"
# Définition du chemin d'accès au fichier de log
$LogFile=\"\\srv\Install\log.txt\"
# Définition du chemin des fichiers exécutables
$FichierInstallation = \"\\srv\Install\prog\ccsetup502.exe\"
$FichierDesinstallation = \"C:\Program Files\CCleaner\uninst.exe\"
# Définition des paramètres d'installation silencieuse pour CCleaner
$ParametreInstallation = \"/S EULA_ACCEPT=YES /L=1036\"
# Présence de Chrome avant l'installation
$ChromePresent = \"False\"
# ========================================================================
# Préparation du fichier de logs
# ========================================================================
# Ajout d'une ligne de séparation pour chaque pc dans le fichier de log
ADD-content -path $LogFile -value \"
\"
# Ajout du nom de l'ordinateur
ADD-content -path $LogFile -value $Poste
# Ajout de l'architecture de l'OS
if ($ArchiOS -eq \"4\"«») { ADD-content -path $LogFile -value \"32 bits\" }
if ($ArchiOS -eq \"8\"«») { ADD-content -path $LogFile -value \"64 bits\" }
# ========================================================================
# Fonction qui vérifie la présence du logiciel et renvoie 0 s'il n'est pas
# présent, 1 s'il est présent dans la mauvaise version, et 2 s'il est
# présent dans la bonne version.
# ========================================================================
function presence_registre {
# Définition des paramètres nécessaires à la fonction
param([String]$logiciel,[String]$version)
# On initialise la variable de retour à 0
$etat = 0
#Parcours des programmes via les clefs de registre
foreach($Key in $RegKey.GetSubKeyNames())
{
$texte = \"Entrée dans la première boucle\"
Write-Output $texte
# Récupération du nom du programmes et de sa version
$SubKey = $RegKey.OpenSubKey($key)
$MonObjet = \"\" | Select DisplayName,Version
$MonObjet.DisplayName = $SubKey.GetValue(\"DisplayName\"«»)
$MonObjet.Version = $SubKey.GetValue(\"DisplayVersion\"«»)
# Vérification de la présence des programmes, et de la présence de la bonne version
if($MonObjet.DisplayName -match $logiciel) { #Si le logiciel est installé, 1
$etat = 1
$etat
if($MonObjet.Version -eq $version) { #Si la version est bonne, 2
$etat = 2
$etat
} #if
#Si le programme a été trouvé, on sort de la fonction et on renvoie son résultat
if ($etat -ne 0) {
return $etat
}#if
} #if
}#foreach
foreach($Key in $RegKeyBis.GetSubKeyNames())
{
$texte2 = \"Entrée dans la seconde boucle\"
# Récupération du nom du programmes et de sa version
$SubKey = $RegKeyBis.OpenSubKey($key)
$MonObjet = \"\" | Select DisplayName,Version
$MonObjet.DisplayName = $SubKey.GetValue(\"DisplayName\"«»)
$MonObjet.Version = $SubKey.GetValue(\"DisplayVersion\"«»)
# Vérification de la présence des programmes, et de la présence de la bonne version
if($MonObjet.DisplayName -match $logiciel) { #Si le logiciel est installé, 1
$etat = 1
$etat
if($MonObjet.Version -eq $version) { #Si la version est bonne, 2
$etat = 2
$etat
} #if
#Si le programme a été trouvé, on sort de la fonction et on renvoie son résultat
if ($etat -ne 0) {
return $etat
}#if
} #if
}#foreach
$sortie = \"Sortie après boucles\"
$sortie
return $etat
} #presence
# ========================================================================
# Parcours de la liste des programmes pour définir les logiciels présents
# ========================================================================
# Pour l'optimisation de la durée d'exécution, tous les tests de présence
# du logiciel et de la version installée se font au cours du parcours
# et non dans une boucle à part
# ========================================================================
$action = presence_registre -logiciel $Logiciel -version $Version
if ($action -eq 0) {
Add-Content -Path $LogFile -Value \"CCleaner absent, installation\"
Start-Process $FichierInstallation $ParametreInstallation
Start-Sleep -Seconds 120
$ActionRealisee = presence_registre -logiciel $Logiciel -version $version
if ($ActionRealisee -eq 2) {
Add-Content -Path $LogFile -Value \"CCleaner est à jour\"
}
}
if ($action -eq 1) {
Add-Content -Path $LogFile -Value \"Version obsolète de CCLeaner, désinstallation\"
Start-Process $FichierDesinstallation \"/S\"
Start-Sleep -Seconds 40
Add-Content -Path $LogFile -Value \"Installation de la version à jour de CCleaner\"
Start-Process $FichierInstallation $ParametreInstallation
Start-Sleep -Seconds 120
$action = presence_registre -logiciel $Logiciel -Version $Version
if ($action -eq 2) {
Add-Content -Path $LogFile -Value \"CCleaner est à jour\"
}
}
if ($action -eq 2) {
Add-Content -Path $LogFile -Value \"CCleaner déjà à jour\"
}
[/code:1]
Cependant, il n'entre pas dans les boucles de parcours des clés de registre, et me renvoie cette erreur :
Vous ne pouvez pas appeler de méthode sur une expression ayant la valeur Null.
Au niveau de C:\Users\xakan\Desktop\Scripts\debugccleaner.ps1 : 80 C
aractère : 43
+ foreach($Key in $RegKey.GetSubKeyNames <<<< ())
+ CategoryInfo : InvalidOperation: (GetSubKeyNames:String) [], Ru
ntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
Quelqu'un pourrait-il avoir une idée de l'origine du problème?
Merci d'avance,
Xakan.
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
xakan écrit:
Tu supposes que tes variables sont renseignées.Quelqu'un pourrait-il avoir une idée de l'origine du problème?
Ceci :
[code:1]
$RegKey = $RemoteRegistry.OpenSubKey($Clef)
[/code:1]
peut renvoyer $Null.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Benjamin
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 14
- Remerciements reçus 0
Ceci :
[code:1]
$RegKey = $RemoteRegistry.OpenSubKey($Clef)
[/code:1]
peut renvoyer $Null.
Ok, je viens de trouver mon erreur. Merci pour la piste.
Cependant, ça ne devrait pas gêner pour l'exécution du script si? C'est en effet ce chemin qui n'existe pas dans le registre de la machine sur laquelle j'effectue des tests.
Merci en tout cas
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Cela dépend des contrôles que tu implémentes...Cependant, ça ne devrait pas gêner pour l'exécution du script si?
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Benjamin
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 14
- Remerciements reçus 0
J'ai juste fait un Test-Path pour voir si le chemin existait bien dans le registre, ainsi s'il n'existe pas je n'entre pas dans le foreach.
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Erreur parcours registre