Question Erreur parcours registre

Plus d'informations
il y a 11 ans 3 semaines #19104 par Benjamin
Erreur parcours registre a été créé par Benjamin
Bonjour tout le monde!

Je reviens vers vous avec un nouveau soucis qui, après plusieurs jours de recherche intensive, m'a fait perdre tous mes cheveux :P

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.

Plus d'informations
il y a 11 ans 3 semaines #19108 par Laurent Dardenne
Salut,
xakan écrit:

Quelqu'un pourrait-il avoir une idée de l'origine du problème?

Tu supposes que tes variables sont renseignées.
Ceci :
[code:1]
$RegKey = $RemoteRegistry.OpenSubKey($Clef)
[/code:1]
peut renvoyer $Null.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 3 semaines #19110 par Benjamin
Réponse de Benjamin sur le sujet Re:Erreur parcours registre
Laurent Dardenne écrit:

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.

Plus d'informations
il y a 11 ans 3 semaines #19111 par Laurent Dardenne
xakan écrit:

Cependant, ça ne devrait pas gêner pour l'exécution du script si?

Cela dépend des contrôles que tu implémentes...

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 3 semaines #19116 par Benjamin
Réponse de Benjamin sur le sujet Re:Erreur parcours registre
Ok, merci pour l'info ;)

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.

Temps de génération de la page : 0.056 secondes
Propulsé par Kunena