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

Réseau/Web Python Discussion :

[Windows] Accès au registre à distance, sur un domaine (WMI / autre?) [Python 3.X]


Sujet :

Réseau/Web Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Avatar de Manudu44
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2014
    Messages : 16
    Par défaut [Windows] Accès au registre à distance, sur un domaine (WMI / autre?)
    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

  2. #2
    Membre averti
    Avatar de Manudu44
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2014
    Messages : 16
    Par défaut Complément
    Rebonjour

    Je pense que c'est "tout simplement" une histoire d'identifiants invalide, si ce script ne fonctionne pas pour un domaine...
    Dans ce cas là, faut-il s'identifier avec les identifiants d'administration locaux des machines ? Un peu compliqué...

    J'ai complété mon code qui théoriquement devrait fonctionner, je vous le met ci-dessous.
    Il fonctionne avec une liste de noms de machines à analyser à la recherche de logiciels.

    -----------------------------------------------------------------------------------------------------------------------------------

    VBScript pour créer une liste des ordinateurs d'un domaine
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Set objDomain = GetObject("WinNT://monDomaineAD")
    Set objFSO=CreateObject("Scripting.FileSystemObject")
    Set objFile = objFSO.CreateTextFile("ADlist.txt", True)
     
    For each objDomainItem in objDomain
    	If objDomainItem.Class = "Computer" Then objFile.Write objDomainItem.Name & vbCrLf
    Next
    -----------------------------------------------------------------------------------------------------------------------------------

    Python
    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
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    import winreg, hashlib, csv, os.path
    from ast import literal_eval
    sList = {} ; mList = {};
     
    def mGet(mName):
        global sList, mList
        tmpList = []
        regPath = ["SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall",
                   "SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall"]
     
        distReg = winreg.ConnectRegistry("\\\\" + mName, winreg.HKEY_LOCAL_MACHINE)
        for path in regPath:
            listKey = winreg.OpenKey(distReg, path)
            i = 0
            while True:
                try:
                    sName = ""
                    sKName = winreg.EnumKey(listKey, i)
                    sK = winreg.OpenKey(listKey, sKName)
                    try:
                        sName = winreg.QueryValueEx(sK, "DisplayName")[0] 
                    except:
                        try:
                            sName = winreg.QueryValueEx(sK, "QuietDisplayName")[0]
                        except:
                            pass
     
                    sNameHash = hashlib.md5(sName.encode("utf-8")).digest()[:4]
                    sID = str(int.from_bytes(sNameHash, "big")).zfill(10)
                    if sName and "Update" not in sName:
                        if sID not in sList:
                            sList[sID] = sName.encode("utf-8").decode("cp1252")
                        tmpList.append(sID)
                    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 sID in trgt:
            print(sID + "  " + sList[sID])
        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 sID in mList[m]:
                if softKw in sList[sID]:
                    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()
     
     
    def expt(xList):
        if xList in (sList, mList):
            if type(next(iter(xList.values()))) is str:
                xType = "sList"
            else:
                xType= "mList"
     
            with open("export_" + xType + ".csv", "w", newline="") as csvfile:
                wr = csv.writer(csvfile, delimiter=";",
                                        quotechar="|", quoting=csv.QUOTE_MINIMAL)
                for x in xList:
                    wr.writerow([x, xList[x]])
     
            print(xType + " a bien été exportée dans le fichier : " + "export_" + xType + ".csv")      
     
        else:
            print("On ne peut exporter que s(oft)List ou m(achine)List !!")
     
     
    def impt(xList):
        global sList, mList
        if xList is "s" and os.path.isfile("export_sList.csv"):
            with open("export_sList.csv", mode="r") as csvfile:
                rdr = csv.reader(csvfile, delimiter=";",
                                        quotechar="|", quoting=csv.QUOTE_MINIMAL)
                sList = {rows[0]:rows[1] for rows in rdr}
                print("Import effectué : liste des logiciels")
        elif xList is "m" and os.path.isfile("export_mList.csv"):
            with open("export_mList.csv", mode="r") as csvfile:
                rdr = csv.reader(csvfile, delimiter=";",
                                        quotechar="|", quoting=csv.QUOTE_MINIMAL)
                mList = {rows[0]:literal_eval(rows[1]) for rows in rdr}
                print("Import effectué : liste des logiciels installés sur les machines")
     
     
    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)
    impt("s"); impt("m")
    print("\n"*2)
     
    with open("ADlist.txt") as f:
       for hostname in f:
           try:
               mGet(hostname[:-1])
           except WindowsError as e:
               print(str(e) + " : " + hostname[:-1])
           except:
               print("Scan échoué pour le poste " + hostname[:-1])
     
    search("Office")
    #sh_sList("computerName")
     
    if sList:
        expt(sList)
    if mList:
        expt(mList)
     
    input("Script terminé, appuyez sur Entrée pour quitter")

  3. #3
    Membre averti
    Avatar de Manudu44
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2014
    Messages : 16
    Par défaut Utilisation de VBScript (mais perte de support multi-plateforme)
    Bien le bonjour,

    Le script est actuellement fonctionnel, mais en trichant par l'utilisation de VBScript.
    Le principal est que cela fonctionne, mais l'idéal aurait été de tout développer en Python, pour une exécution possible sur Linux...

    Seul problème restant : timeout trop élevé pour la récupération des valeurs du registre (quelques secondes)
    (en effet, 3 secondes fois 500 postes = 25 minutes... contre moins de 10 minutes avec un timeout de 1 seconde )

    VBScript - src_ADlist
    Pour récupérer la liste des ordinateurs d'un domaine

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    On Error Resume Next
    Set objDomain = GetObject("WinNT://" & WScript.Arguments(0))
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFile = objFSO.CreateTextFile("ADlist.txt", True)
     
    For each objDomainItem in objDomain
      If objDomainItem.Class = "Computer" Then objFile.Write objDomainItem.Name & vbCrLf
    Next
    VBScript - src_winreg
    Pour récupérer les valeurs des clés de registre

    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
    Const HKLM = &H80000002
     
    strDomain = WScript.Arguments(0)
    strComputer = WScript.Arguments(1)
    strKey = WScript.Arguments(2)
    strUser = WScript.Arguments(3)
    strPassword = WScript.Arguments(4)
     
    Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
    Set objSWbemServices = objSWbemLocator.ConnectServer(strComputer, "Root\default", _
    													strUser, strPassword, "MS_409", _
    													"ntlmdomain:" + strDomain, 128)
     
    Set objReg = objSWbemServices.Get("StdRegProv")
    objReg.EnumKey HKLM, strKey, arrSubkeys
     
    For Each strSubkey In arrSubkeys
      intRet = objReg.GetStringValue(HKLM, strKey & strSubkey, "DisplayName", strValue)
      If intRet <> 0 Then objReg.GetStringValue HKLM, strKey & strSubkey, "QuietDisplayName", strValue
      If strValue <> "" Then
    	WScript.Echo strValue
      End If
    Next
    Python - netreg
    Pour l'interface utilisateur

    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
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    import winreg, hashlib, csv, os, getpass, subprocess
    from ast import literal_eval
    sList = {} ; mList = {};
     
    def mGet(mName):
        global sList, mList
        tmpList = []
        regPath = ["SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\",
                   "SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"]
     
        err = False
        for path in regPath:
            result = subprocess.getoutput("cscript src_winreg.vbs //nologo " + dom + " " + mName + " " + path + " " + usr + " " + mdp)
            if not "SWbemLocator" in result:
                for line in result.split("\n"):
                    sName = line
                    sNameHash = hashlib.md5(sName.encode("utf-8")).digest()[:4]
                    sID = str(int.from_bytes(sNameHash, "big")).zfill(10)
                    if sName and "Update" not in sName:
                        if sID not in sList:
                            sList[sID] = sName.encode("utf-8").decode("cp1252")
                        tmpList.append(sID)
     
                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
            else:
                err = True
     
        if err is False:
            print("La liste des logiciels a bien été récupérée sur le poste " + mName)
        else:
            print("Récupération des logiciels impossible pour le poste "  + mName)
     
     
    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 sID in trgt:
            print(sID + "  " + sList[sID])
        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 sID in mList[m]:
                if softKw in sList[sID]:
                    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()
     
     
    def expt(xList):
        if xList in (sList, mList):
            if type(next(iter(xList.values()))) is str:
                xType = "sList"
            else:
                xType= "mList"
     
            with open("export_" + xType + ".csv", "w", newline="") as csvfile:
                wr = csv.writer(csvfile, delimiter=";",
                                        quotechar="|", quoting=csv.QUOTE_MINIMAL)
                for x in xList:
                    wr.writerow([x, xList[x]])
     
            print(xType + " a bien été exportée dans le fichier : " + "export_" + xType + ".csv")      
     
        else:
            print("On ne peut exporter que s(oft)List ou m(achine)List !!")
     
     
    def impt(xList):
        global sList, mList
        if xList is "s" and os.path.isfile("export_sList.csv"):
            with open("export_sList.csv", mode="r") as csvfile:
                rdr = csv.reader(csvfile, delimiter=";",
                                        quotechar="|", quoting=csv.QUOTE_MINIMAL)
                sList = {rows[0]:rows[1] for rows in rdr}
                print("Import effectué : liste des logiciels")
        elif xList is "m" and os.path.isfile("export_mList.csv"):
            with open("export_mList.csv", mode="r") as csvfile:
                rdr = csv.reader(csvfile, delimiter=";",
                                        quotechar="|", quoting=csv.QUOTE_MINIMAL)
                mList = {rows[0]:literal_eval(rows[1]) for rows in rdr}
                print("Import effectué : liste des logiciels installés sur les machines")
     
     
    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)
    impt("s"); impt("m")
    print()
    dom = input("Domaine Windows    ] ")
    usr = input("Nom d'utilisateur  ] ")
    mdp = getpass.getpass("Mot de passe       ] ")
    sft = "Office"
    print()
     
    subprocess.Popen("cscript src_winreg.vbs //b //nologo src_ADlist.vbs " + dom)
    with open("ADlist.txt") as f:
       for hostname in f:
           mGet(hostname[:-1])
     
    search(sft)
    #sh_sList("computerName")
     
    if sList:
        expt(sList)
    if mList:
        expt(mList)
     
    input("Script terminé, appuyez sur Entrée pour quitter")
    Vous pouvez trouver les codes en pièce jointe

    Cordialement
    Fichiers attachés Fichiers attachés

  4. #4
    Membre averti
    Avatar de Manudu44
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2014
    Messages : 16
    Par défaut Version quasi finale
    Re

    J'ai résolu l'histoire de timeout, le script est maintenant beaucoup plus rapide.
    Par contre, il est beaucoup plus bavard, c'est pas trop embêtant mais auriez-vous une solution ?

    Le code final :
    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
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    import winreg, hashlib, csv, os, getpass, subprocess
    from ast import literal_eval
    sList = {} ; mList = {};
    f = open(os.devnull, "w")
     
    def mGet(mName):
        global sList, mList
        tmpList = []
        regPath = ["SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\",
                   "SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"]
     
        err = False
        for path in regPath:
            try:
                p = subprocess.Popen("cscript src_winreg.vbs //nologo " + dom + " " + mName + " " + path + " " + usr + " " + mdp)
                result = p.communicate(timeout=0.2)[0]
                if not "SWbemLocator" in result:
                    for line in result.split("\n"):
                        sName = line
                        sNameHash = hashlib.md5(sName.encode("utf-8")).digest()[:4]
                        sID = str(int.from_bytes(sNameHash, "big")).zfill(10)
                        if sName and "Update" not in sName:
                            if sID not in sList:
                                sList[sID] = sName.encode("utf-8").decode("cp1252")
                            tmpList.append(sID)
     
                    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
                else:
                    err = True
            except:
                err = True
     
        if err is False:
            print("La liste des logiciels a bien été récupérée sur le poste " + mName)
        else:
            print("Erreur dans l'analyse des logiciels installés pour le poste "  + mName)
     
     
    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 sID in trgt:
            print(sID + "  " + sList[sID])
        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 sID in mList[m]:
                if softKw in sList[sID]:
                    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()
     
     
    def expt(xList):
        if xList in (sList, mList):
            if type(next(iter(xList.values()))) is str:
                xType = "sList"
            else:
                xType= "mList"
     
            with open("export_" + xType + ".csv", "w", newline="") as csvfile:
                wr = csv.writer(csvfile, delimiter=";",
                                        quotechar="|", quoting=csv.QUOTE_MINIMAL)
                for x in xList:
                    wr.writerow([x, xList[x]])
     
            print(xType + " a bien été exportée dans le fichier : " + "export_" + xType + ".csv")      
     
        else:
            print("On ne peut exporter que s(oft)List ou m(achine)List !!")
     
     
    def impt(xList):
        global sList, mList
        if xList is "s" and os.path.isfile("export_sList.csv"):
            with open("export_sList.csv", mode="r") as csvfile:
                rdr = csv.reader(csvfile, delimiter=";",
                                        quotechar="|", quoting=csv.QUOTE_MINIMAL)
                sList = {rows[0]:rows[1] for rows in rdr}
                print("Import effectué : liste des logiciels")
        elif xList is "m" and os.path.isfile("export_mList.csv"):
            with open("export_mList.csv", mode="r") as csvfile:
                rdr = csv.reader(csvfile, delimiter=";",
                                        quotechar="|", quoting=csv.QUOTE_MINIMAL)
                mList = {rows[0]:literal_eval(rows[1]) for rows in rdr}
                print("Import effectué : liste des logiciels installés sur les machines")
     
     
    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)
    impt("s"); impt("m")
    print()
    dom = "mut-atlantique.root.priv"
    usr = "adm.ehery"
    mdp = "R1.HeryE"
    sft = "Dragon"
    print()
     
    p = subprocess.Popen("cscript //b //nologo src_ADlist.vbs " + dom)
    p.wait()
    with open("ADlist.txt") as f:
       for hostname in f:
           mGet(hostname[:-1])
     
    search(sft)
    #sh_sList("computerName")
     
    if sList:
        expt(sList)
    if mList:
        expt(mList)
     
    input("Script terminé, appuyez sur Entrée pour quitter")
    Bonne fin de semaine
    Fichiers attachés Fichiers attachés

  5. #5
    Membre averti
    Avatar de Manudu44
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2014
    Messages : 16
    Par défaut Code enfin prêt
    Bonjour,

    Vous pouvez trouver en pièce jointe la version finale, 100% fonctionnelle.
    N'hésitez pas à signalez des bugs éventuels

    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
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    import hashlib, csv, os, getpass, subprocess
    from ast import literal_eval
    from time import gmtime, strftime
    sList = {} ; mList = {}
     
    def mGet(mName):
        global sList, mList
        tmpList = []
        regPath = ["SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\",
                   "SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"]
     
        err = False
        for path in regPath:
            try:
                p = subprocess.Popen("cscript src_winreg.vbs //nologo " + dom + " " + mName + " " + path + " " + usr + " " + mdp, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
                result = p.communicate(timeout=0.4)[0]
                for line in str(result, "utf-8", "ignore").split("\n"):
                    sName = line
                    sNameHash = hashlib.md5(sName.encode("utf-8")).digest()[:4]
                    sID = str(int.from_bytes(sNameHash, "big")).zfill(10)
                    if sName and "Update" not in sName:
                        if sID not in sList:
                            sList[sID] = sName.encode("utf-8").decode("cp1252")
                        tmpList.append(sID)
     
                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))
                if tmpList:
                    mList[mName] = tmpList
            except:
                err = True
     
        if err is False:
            print(strftime("%Y-%m-%d %H:%M:%S", gmtime()) + "  Récupération effectuée pour   " + mName)
        else:
            print(strftime("%Y-%m-%d %H:%M:%S", gmtime()) + "  /!\\ Erreur pour le poste      "  + mName)
     
     
    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 sID in trgt:
            print(sID + "  " + sList[sID])
        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 sID in mList[m]:
                if softKw in sList[sID]:
                    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()
     
     
    def expt(xList):
        if xList in (sList, mList):
            if type(next(iter(xList.values()))) is str:
                xType = "sList"
            else:
                xType= "mList"
     
            with open("export_" + xType + ".csv", "w", newline="") as csvfile:
                wr = csv.writer(csvfile, delimiter=";", quotechar="|", quoting=csv.QUOTE_MINIMAL)
                for x in xList:
                    wr.writerow([x, xList[x]])
     
            print(xType + " a bien été exportée dans le fichier : " + "export_" + xType + ".csv")      
     
        else:
            print("On ne peut exporter que s(oft)List ou m(achine)List !!")
     
     
    def impt(xList):
        global sList, mList
        if xList is "s" and os.path.isfile("export_sList.csv"):
            with open("export_sList.csv", mode="r") as csvfile:
                rdr = csv.reader(csvfile, delimiter=";", quotechar="|", quoting=csv.QUOTE_MINIMAL)
                sList = {rows[0]:rows[1] for rows in rdr}
                print("Import effectué : liste des logiciels")
        elif xList is "m" and os.path.isfile("export_mList.csv"):
            with open("export_mList.csv", mode="r") as csvfile:
                rdr = csv.reader(csvfile, delimiter=";")
                mList = {rows[0]:literal_eval(rows[1]) for rows in rdr}
                print("Import effectué : liste des logiciels installés sur les machines")
     
     
    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)
    try:
        impt("s"); impt("m")
    except:
        print("Echec de l'import des listes !")
    print()
    dom = input("Domaine Windows      ] ")
    usr = input("Nom d'utilisateur    ] ")
    mdp = getpass.getpass("Mot de passe         ] ")
    sft = "Dragon"
    print()
     
    p = subprocess.Popen("cscript //b //nologo src_ADlist.vbs " + dom)
    p.wait()
    with open("ADlist.txt") as f:
       for hostname in f:
           mGet(hostname[:-1])
     
    if sList:
        expt(sList)
    if mList:
        expt(mList)
     
    input("Script terminé, appuyez sur Entrée pour quitter")
    Fichiers attachés Fichiers attachés

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/12/2008, 15h29
  2. Registre windows sur domaine
    Par zenux dans le forum Windows XP
    Réponses: 1
    Dernier message: 16/03/2008, 21h02
  3. Pb d'accès à distance sur Postgre pour windows
    Par Guitch dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 28/09/2004, 19h13

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