Bien le bonjour

Je suis en train de développer un script, qui aurait pour but principal de :
Rechercher et énumérer les logiciels installés sur différents postes d'un même domaine Windows
Et ce, en utilisant la fabuleuse base de registre

Le script fonctionne très bien en local, pas de soucis de ce côté.
Je recherche maintenant juste un moyen de se connecter à la base de registre d'un PC distant...

Seulement, le module winreg n'a pas l'air d'être très complet à ce niveau là :/
Je recherche donc une solution, de type WMI ou autre, à savoir que je ne veux pas directement intervenir sur les machines (modification de configuration pour que le script fonctionne, etc.).
Que préconiseriez-vous pour lire des valeurs de clés de registre, sur une machine distante ?

Pour votre plaisir, voici l'avancée de mes travaux :
Code : 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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import winreg, hashlib
sList = {} ; mList = {};
 
print()
print("                     $$\\" +
    "\n                     $$ |" +
    "\n$$$$$$$\\   $$$$$$\\ $$$$$$\\    $$$$$$\\   $$$$$$\\   $$$$$$\\" +
    "\n$$  __$$\\ $$  __$$\\\\_$$  _|  $$  __$$\\ $$  __$$\\ $$  __$$\\" +
    "\n$$ |  $$ |$$$$$$$$ | $$ |    $$ |  \\__|$$$$$$$$ |$$ /  $$ |" +
    "\n$$ |  $$ |$$   ____| $$ |$$\\ $$ |      $$   ____|$$ |  $$ |" +
    "\n$$ |  $$ |\\$$$$$$$\\  \\$$$$  |$$ |      \\$$$$$$$\\ \\$$$$$$$ |" +
    "\n\__|  \\__| \\_______|  \\____/ \\__| v1.0  \\_______| \\____$$ |" +
    "\n                                                 $$\\   $$ |" +
    "\n        kwnow softs on your network machines     \\$$$$$$  |" +
    "\n                                                  \\______/")
print()
print("Ce script Python a été développé dans le cadre d'un stage" +
      "\nau groupe Hospi Grand Ouest (HGO). Il est toutefois adaptable." +
      "\n\nIl a pour but de rechercher, et énumérer les logiciels installés" +
      "\nsur les différents postes Windows raccordés au même réseau." +
      "\n\nDéveloppé par Emmanuel Hery - linkedin.com/in/emmanuel-hery" + "\n" + "-"*60)
print("\n"*2)
 
def mGet(mName):
    global sList, mList
    tmpList = []
    regPath = [r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall",
               r"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall"]
 
    distReg = winreg.ConnectRegistry("\\\\" + mName, winreg.HKEY_LOCAL_MACHINE)
    for path in regPath:
        listKey = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, path)
        i = 0
        while True:
            try:
                softName = ""
                softKeyName = winreg.EnumKey(listKey, i)
                softKey = winreg.OpenKey(listKey, softKeyName)
                try:
                    softName = winreg.QueryValueEx(softKey, "DisplayName")[0] 
                except:
                    try:
                        softName = winreg.QueryValueEx(softKey, "QuietDisplayName")[0]
                    except:
                        pass
 
                softNameHash = hashlib.md5(softName.encode("utf-8")).digest()[:4]
                softID = str(int.from_bytes(softNameHash, "big")).zfill(10)
                if softName and "Update" not in softName:
                    if softID not in sList:
                        sList[softID] = softName
                    tmpList.append(softID)
                i += 1
            except WindowsError as e:
                break
 
    sList = dict([(k,v) for v,k in sorted([(v,k) for k,v in sList.items()])])
    tmpList = sorted(tmpList, key=lambda x: list(sList.keys()).index(x))
    mList[mName] = tmpList
    print("La liste des logiciels a bien été récupérée sur le poste " + mName + "\n")
 
 
def sh_sList(mName=None):
    if mName in mList:
        trgt = mList[mName]
    elif not mName:
        trgt = sList
    else:
        print("La machine \"" + mName + "\" n'a as été scannée !!" +
              "\nEffectuez un scan manuel sur celle-ci, et réessayez")
        return
 
    print("softID      softName\n" + "-"*60)
    for softID in trgt:
        print(softID + "  " + sList[softID])
    print("\n" + str(len(sList)) + " logiciels ont été répertoriés\n")
 
 
def search(softKw):
    if not sList:
        print("Merci d'effectuer un scan préalable des machines...")
 
    fnd = False
    for m in mList:
        for softID in mList[m]:
            if softKw in sList[softID]:
                print(softKw + " est bien présent sur le poste " + m); fnd = True; break
 
    if not fnd:
        print("Ancun résultats de trouvé concernant " + softKw)
    print()
 
mGet("K401LB-Manu") #récupère la liste des logiciels d'une machine donnée
sh_sList("K401LB-Manu") #affiche la liste des logiciels d'une machine donnée
search("Office") #affiche quelles machines ont un logiciel donné
Cordialement