IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Script lecture de plusieurs clés de registre [PowerShell]


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de pendoRa
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mai 2007
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 317
    Par défaut Script lecture de plusieurs clés de registre
    Bonjour a tous,

    je souhaites effectuer un reporting sur mon parc via la lecture d'une liste de postes dans une fichier .txt de deux clés de registre puis exporter le résultat dans un csv.

    Cela fonctionne bien pour 1 clé (1 application). Mais je coince pour lire une seconde clé. tout ceci dans un array si possible.

    J'ai déjà ce script fonctionnel :

    Code Powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    $computers = get-content "C:\Scripts\Get-InstalledApplications\pdt_gtal.txt"
    $i = 0
    $total = $computers.Count
     
    $propertynames = 'DisplayName','DisplayVersion'  # you may use wildcards here
     
    # loop over the computers
    $result = foreach ($computer in $computers) {
    $i++
                Write-Host "Connexion au $computer..." -ForegroundColor Yellow
                Write-Host "Checking $comp" -ForegroundColor Green
                Write-Host "$i sur $total verifiés."     -ForegroundColor Green
     
     
        if (!(Test-Connection -ComputerName $computer -Count 1 -Quiet)) {
            Write-Warning "Poste '$computer' non joignable"
            $hash = "null"
            continue   # skip this computer and proceed with the next
        }
        Invoke-Command -ComputerName $computer -ScriptBlock {
            $regPath_o365 = 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\O365ProPlusRetail - fr-fr'
            $regPath_o13 = 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Office15.STANDARD'
            # create a temporary Hashtable to store the items
            $hash = [ordered]@{}
            # loop over the properties
            foreach ($prop in $using:propertynames) {
                $entry = Get-ItemProperty -Path $regPath_o365 -Name $prop -ErrorAction SilentlyContinue
                $entry2 = Get-ItemProperty -Path $regPath_o13 -Name $prop -ErrorAction SilentlyContinue
                if ($entry) {
     
                    $hash['ComputerName'] = $using:computer
                    $entry = $entry | Select-Object * -ExcludeProperty PS*
     
                    foreach ($item in $entry.PsObject.Properties) {
                        $hash[$item.Name] = $item.Value
     
                        Write-Host "Office 365 Detecté" -ForegroundColor White
     
                    }
              } elseif($entry2) {
     
                    $hash['ComputerName'] = $using:computer
                    $entry2 = $entry2 | Select-Object * -ExcludeProperty PS*
     
                    foreach ($item in $entry.PsObject.Properties) {
                        $hash[$item.Name] = $item.Value
     
                        Write-Host "Office 2013 Detecté" -ForegroundColor White
     
                }
                else {
                    Write-Warning "Propriete non trouvee : '$prop'"
                }
            }
            if ($hash.Count) {
                # output the hash converted to PSObject
                [PsCustomObject]$hash
            }
        }
      }
    }
    # remove the properties added by Invoke-Command
    $result = $result | Select-Object * -ExcludeProperty PS*,RunspaceId
     
    # output to gridview
    $result | Out-GridView
     
     
    # output to CSV file
    $result | Export-Csv -Path "C:\Scripts\Get-InstalledApplications\export_get_installedApps2.csv" -NoTypeInformation -Append

    Nous pouvons voir les deux entrées de registre qui concerne O365 et Office 2013, je souhaite interroger les postes pour qu'il renvoit la valeur situé dans la clé s'il la trouve.

    Peut-être changer de mode de recherche et dans le CSV mettre en colonne "Computer","O365","Office 2013" et mettre des "true" or "false".. ?
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ComputerName	O365	Office 2013
    Computer1	True	False
    Computer2	True	True
    Computer3	False	True
    Avez vous des conseils pour améliorer mon script ?

    Merci

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Salut,


    si le contenu des propriétés des clés importe peu, quelque chose dans le genre :
    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $O=[PsCustomObject]@{Computer='$using:computer';O365O=$false;Office2013=$false}
    $O.O365O=Test-Path $regPath_o365
    $O.Office2013=Test-Path $regPath_o13
    return $o
    Sinon crée une fonction Test-ItemProperty -path.
    A mon avis dans le Invoke-Command c'est l'appelant qui devrait déclencher le warning, car le distant peut configurer son comportement via un prof

  3. #3
    Membre éprouvé
    Avatar de troxsa
    Inscrit en
    Novembre 2004
    Messages
    388
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Novembre 2004
    Messages : 388
    Par défaut
    Bonjour,

    Je propose aussi un truc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $propertynames = 'DisplayName','DisplayVersion'  # you may use wildcards here
    $AddRemovePrograms64 = Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | select $propertynames
    $AddRemovePrograms32 = Get-ItemProperty HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | select $propertynames
    
    $ProgramsInstall = $AddRemovePrograms64 + $AddRemovePrograms32
    
    $ProgramsInstall | ? {$_.DisplayName -match "Microsoft 365"}
    

  4. #4
    Membre éclairé Avatar de pendoRa
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mai 2007
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 317
    Par défaut
    Merci pour vos réponses

    @Laurent : Je n'ai pas compris ce que tu disais a propos du Invoke-Command.

    Effectivement un customObject semble la bonne solution.

    J'ai finalement opté pour un script qui liste toutes les applis, puis fait un "like" pour filtrer sur ce que j'ai besoin. C'est peut etre pas le plus opti mais je n'ai pas réussi a obtenir mon résultats sur les deux produits Office (O365 et/ou Office 2013).

    @troska : Bonne idée mais je n'arrive pas a l'utiliser en remote (invoke-command). Je regarde pour adapter ^^

    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    $computers = Import-Csv "C:\Scripts\Get-InstalledApplications\pdt_gtal.csv"
     
    $array = @()
     
    foreach($pc in $computers){
     
        $computername=$pc.computername
     
     
        $UninstallKey=”SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall” 
     
     
        $reg=[microsoft.win32.registrykey]::OpenRemoteBaseKey(‘LocalMachine’,$computername) 
     
     
        $regkey=$reg.OpenSubKey($UninstallKey) 
     
     
        $subkeys=$regkey.GetSubKeyNames() 
     
     
     
        foreach($key in $subkeys){
     
            $thisKey=$UninstallKey+”\\”+$key 
     
            $thisSubKey=$reg.OpenSubKey($thisKey) 
     
            $obj = New-Object PSObject
     
            $obj | Add-Member -MemberType NoteProperty -Name “ComputerName” -Value $computername
     
            $obj | Add-Member -MemberType NoteProperty -Name “DisplayName” -Value $($thisSubKey.GetValue(“DisplayName”))
     
            $obj | Add-Member -MemberType NoteProperty -Name “DisplayVersion” -Value $($thisSubKey.GetValue(“DisplayVersion”))
     
            $obj | Add-Member -MemberType NoteProperty -Name “InstallLocation” -Value $($thisSubKey.GetValue(“InstallLocation”))
     
            $obj | Add-Member -MemberType NoteProperty -Name “Publisher” -Value $($thisSubKey.GetValue(“Publisher”))
     
            $array += $obj
     
        } 
     
    }
     
    $array | Where-Object { $_.DisplayName -like "Microsoft%"} | select ComputerName, DisplayName, DisplayVersion, Publisher | ft -auto
     
    $array | Export-CSV -Path "C:\Scripts\Get-InstalledApplications\export_final.csv" -Append -NoTypeInformation

    Bon bizarrement le script retourne bien toutes les applis présentent dans la clé \Uninstall\ mais dans le CSV les ComputerName ne s'affiche pas. Je vais poursuivre dans ce sens.

    En fait le script li ma propre base de registre en boucle, je ne comprend pas. Pourtant pas à pas en utilisant le
    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    $reg=[microsoft.win32.registrykey]::OpenRemoteBaseKey('LocalMachine',$computername)
    cela fonctionne ..

  5. #5
    Membre éprouvé
    Avatar de troxsa
    Inscrit en
    Novembre 2004
    Messages
    388
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Novembre 2004
    Messages : 388
    Par défaut
    Il y a plusieurs paramètre pour utiliser Winrm avec Invoke-Command, avez vous les droits suffisant ?

    Faite le test simple suivant : (faire un changement du nom de serveur et les credential sauf si le compte courant que vous utiliser a déjà les droits)

    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $Resultat = Invoke-Command -ComputerName Server01 -Credential Domain01\User01 -ScriptBlock { Get-Culture } 
    $Resultat

    En cas d'erreur il est possible que vos droits soit pas suffisant, ou que le service WinRM ne soit pas démarré ou configuré correctement.

    Il est aussi possible d'utiliser Remote Registry pour ne pas utiliser WinRM, vous avez un exemple : https://superuser.com/questions/1521...-in-powershell
    Il faudra faire pour un traitement en lot utiliser job ou un workflow avec foreach -Paralell, exemple : https://docs.microsoft.com/fr-fr/pow...powershell-5.1

  6. #6
    Membre éclairé Avatar de pendoRa
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mai 2007
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 317
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    S C:\Windows\system32> $Resulat = Invoke-Command -ComputerName GTAL500 -Credential domain\xxx -ScriptBlock {Get-Culture}
    
    PS C:\Windows\system32> $Resulat
    
    LCID             Name             DisplayName                                                                PSComputerName                                                           
    ----             ----             -----------                                                                --------------                                                           
    1036             fr-FR            Français (France)                                                          xxxx500
    J'ai bien les droits suffisant et j'ai bien activé le winRM sur mes postes distants pour pouvoir faire cet inventaire.


    Est-ce qu'il faut ajouter un INvoke-Command dans le foreach .? En plus du "OpenRemoteBaseKey" ?

    Merci

  7. #7
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par pendoRa Voir le message
    @Laurent : Je n'ai pas compris ce que tu disais a propos du Invoke-Command.
    Le serveur distant peut configurer le comportement de Write-Warning via un fichier de profile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $WarningPreference='stop'
    Il est préférable d'utiliser -NoProfile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Invoke-Command -ComputerName $computer -NoProfile -ScriptBlock {...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PowerShell] Suppression de clés de registre spécifique via un script.
    Par Trebor dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 07/10/2021, 07h03
  2. script suppression clés de registre
    Par bluedark dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 04/07/2015, 11h00
  3. Script Lecture Registre
    Par fouji dans le forum VBScript
    Réponses: 5
    Dernier message: 09/02/2014, 06h12
  4. [Batch] Script pour les clés de registre
    Par Lud0o dans le forum Scripts/Batch
    Réponses: 18
    Dernier message: 08/02/2012, 12h36
  5. Probleme de lecture de clés de registre
    Par Mac Twist dans le forum MFC
    Réponses: 1
    Dernier message: 06/05/2006, 19h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo