Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 7 sur 7
  1. #1
    Membre émérite Avatar de jurassic pork
    Bidouilleur
    Inscrit en
    décembre 2008
    Messages
    440
    Détails du profil
    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : décembre 2008
    Messages : 440
    Points : 915
    Points
    915

    Par défaut Protection de logiciel par clé

    bonjour,

    voici en gros le principe :
    Dans votre logiciel, il y a un bouton demande d'activation. Ce bouton génère un fichier ou une chaîne cryptée que votre client doit vous transmettre ( courrier électronique ). Dans ce fichier il y a des informations concernant le BIOS, la carte mère, la carte réseau, le disque dur ( pas des informations confidentielles, seulement des numéros de série ou info HARD). En recueillant ces informations vous jugez quelles sont ou quelle est l'information la plus fiable. Vous générez une clé d'activation cryptée en fonction de ces informations. Vous la transmettez à votre client. La partie activation de votre logiciel (lancé à chaque démarrage) vient alors décoder cette clé et vient vérifier que les infos Hard correspondent au matériel sur lequel est lancé le logiciel.

    Pour vous aidez dans cette tâche, je vous propose la partie récolte d'informations. Voici une procédure qui utilise WMI avec assemblage DotNet, récupérant des infos pour générer ou contrôler un numéro de licence.

    Code :
    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
    // Résumé : Récupérer des informations système pour générer ou contrôler un numéro de licence
    // Cette procédure utilise la collection pWMI et à incorporer dans celle-ci
    // Syntaxe :
    //RécupèreInfosLicence ()
    //
    // Paramètres :
    // Aucun
    // Valeur de retour :
    // Aucune
    //
    //
    // Pensé par Jurassic.Pork Juin 2010
    //
    PROCEDURE RécupèreInfosLicence()
        InfoLicence est une structure
        NumSérieDisque est une chaîne
        NumVolDisque est une chaîne
        NumMacAdresse est une chaîne
        NumSérieCarteMère est une chaîne
        NumSérieBios est une chaîne
        FIN
    
        sUneInformation est une chaîne
    
        MonInfoLicence est une InfoLicence
    
        // Récupération du numéro de série du 1er disque
        sUneInformation = RécupèreContenu("Win32_PhysicalMedia",gsServeur + "root\CIMV2", "Tag LIKE '%PHYSICALDRIVE0'")
        SI sUneInformation <> "" ALORS
        MonInfoLicence.NumSérieDisque = TrouveInformation(sUneInformation,"SerialNumber")
        SINON
        MonInfoLicence.NumSérieDisque = "INVALIDE"
        FIN
    
        // Récupération du numéro de volume du disque C:
        sUneInformation = RécupèreContenu("Win32_LogicalDisk",gsServeur + "root\CIMV2", "DeviceID='C:'")
        SI sUneInformation <> "" ALORS
        MonInfoLicence.NumVolDisque = TrouveInformation(sUneInformation,"VolumeSerialNumber")
        SINON
        MonInfoLicence.NumSérieDisque = "INVALIDE"
        FIN
    
        // Récupération de l'adresse MAC du premier adaptateur réseau valide
        sUneInformation = RécupèreContenu("Win32_NetworkAdapter",gsServeur + "root\CIMV2", "PhysicalAdapter=True")
        SI sUneInformation <> "" ALORS
        MonInfoLicence.NumMacAdresse = TrouveInformation(sUneInformation,"MACAddress")
        SINON
        MonInfoLicence.NumMacAdresse = "INVALIDE"
        FIN
    
        // Récupération du numéro de série de carte mère
        sUneInformation = RécupèreContenu("Win32_BaseBoard",gsServeur + "root\CIMV2")
        SI sUneInformation <> "" ALORS
        MonInfoLicence.NumSérieCarteMère = TrouveInformation(sUneInformation,"SerialNumber")
        SINON
        MonInfoLicence.NumSérieCarteMère = "INVALIDE"
        FIN
    
        // Récupération du numéro de série du BIOS
        sUneInformation = RécupèreContenu("Win32_BIOS",gsServeur + "root\CIMV2")
        SI sUneInformation <> "" ALORS
        MonInfoLicence.NumSérieBios = TrouveInformation(sUneInformation,"SerialNumber")
        SINON
        MonInfoLicence.NumSérieBios = "INVALIDE"
        FIN
    
        // A vous de jouer pour générer ou vérifier la clé de licence avec les infos les plus justes.
    Pour utiliser cela dans votre projet il vous faut :
    1 - Utiliser l'assemblage .NET "System.Management" :
    Menu Atelier/.NET/Utiliser Un Assemblage .NET dans ce projet
    Dans la fenêtre qui s'ouvre cliquer sur "Lister les assemblages référencés"
    Quand la recherche est terminée cocher "Mscorlib" et "System.Management"
    2 - Récupérer la collection de procédure pWMI.wdg qui se trouve dans l'exemple complet WD WMI DOTNET et l'inclure dans votre projet
    3 - Rajouter la procédure RécupèreInfosLicence dans votre collection pWMI.wdg

    Contrainte : comme vous utilisez un assemblage .Net, il faut que le Framework dotnet soit installé sur la station qui utilisera cette procédure.

    Ami calmant, J.P ;-)

  2. #2
    Membre du Club
    Inscrit en
    janvier 2008
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : janvier 2008
    Messages : 55
    Points : 58
    Points
    58

    Par défaut

    intéressant:
    est ce que cela fonctionne
    quelque soit le système ?
    quelque soit le framework .net installé?

  3. #3
    Membre émérite Avatar de jurassic pork
    Bidouilleur
    Inscrit en
    décembre 2008
    Messages
    440
    Détails du profil
    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : décembre 2008
    Messages : 440
    Points : 915
    Points
    915

    Par défaut

    bonjour hehehe,

    tu as bien fait de poser la question car je me suis aperçu que la propriété que j'utilise pour récupérer l'adresse MAC de la première carte réseau (PhysicalAdapter=True) ne marche pas pour XP , Windows 2000. Il faut utiliser plutôt la propriété NetConnectionStatus=2 ( la première carte réseau connectée à un réseau).
    Sinon sous Windows 7 dotnet 3.5 je récupère tous les infos.
    Par contre sur mon NetBook MSI U100 sous XP dotnet 2.0 je ne récupère pas les infos BIOS, pour l'adresse MAC il faut que j'utilise NetConnectionStatus=2.

    Ami Calmant, J.P

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juin 2004
    Messages
    1 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2004
    Messages : 1 220
    Points : 1 484
    Points
    1 484

    Par défaut

    Salut à toi jurassic,

    Ce sujet m'intéresse fortement, faisant actuellement des recherches pour récupérer des informations sur le processeur, je suis tombé ici.

    Tout d'abord, avant d'aller plus loin dans mes questions, j'ai regardé l'exemple "WD WMI DOTNET", et malheureusement j'ai le droit à une belle erreur sur l'appel de getEnumerator() de la procédure globale RécupèreInfos() :
    Code :
    1
    2
    3
    4
    5
    6
    7
    // Déclaration de la requete
    clMaRequete 	est un ObjectQuery(sRequête)
    // Exécution de la requête
    clMaRecherche 	est un ManagementObjectSearcher(clMonScope,clMaRequete)
    
    // Récupération de l'énumérateur sur les valeurs
    pclIEnumValeur = clMaRecherche:Get():GetEnumerator()
    Le message d'erreur peut explicite est celui-ci :
    Code :
    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
    <=Šì0y
    Erreur système : Access violation (GPF)
    EIP = 00030009
    OS : Windows XP ou .NET Service Pack 3(5.1.2600)
    
    - Infos de debug :
    Registres :
    
      EIP = 00030009    EBP = 017B7600
      EAX = 0013E57C    EBX = 00000002
      ECX = 017B8918    EDX = 0013E5B8
      ESI = 0013E5AC    EDI = 00D7DD30
    
    Pile des appels :
    
    [???]	00030009
    
    
    - Infos attachées :
    EIT_PILEWL :
    Procédure globale RécupèreContenu (pWMI.RécupèreContenu), ligne 64
    Procédure globale RécupèreInfoProc (pWMI.RécupèreInfoProc), ligne 18
    Procédure locale InfosProcesseur (FEN_Simple.PROCEDURE.InfosProcesseur), ligne 13
    Clic sur BTN_Analyser (FEN_Simple.BTN_Analyser), ligne 24
    Clic sur BTN_SIMPLE (FEN_Principale.BTN_SIMPLE), ligne 4
    EIT_COMPOSANT :
    
    EIT_DATEHEURE : 28/06/2010 10:37:02
    
    - Identifiant dans le .err : 1020
    Pour info, j'ai le Framework .Net 3.5 SP1.

    Y-a-t'il un piège à contourner pour utiliser cet exemple ?

    Merci à toi

    Edit : GetEnumerator() semble ne rien renvoyer ce qui provoque cette erreur.
    Edit2 : GetEnumerator() ne fonctionne pas sous Windev12.

  5. #5
    Membre émérite Avatar de jurassic pork
    Bidouilleur
    Inscrit en
    décembre 2008
    Messages
    440
    Détails du profil
    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : décembre 2008
    Messages : 440
    Points : 915
    Points
    915

    Par défaut

    bonjour Lo2,

    mon code marche sous WD15 Windows 7

    sous quel O.S es-tu ? avec quelle version de windev ?


    Ami calmant, J.P

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juin 2004
    Messages
    1 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2004
    Messages : 1 220
    Points : 1 484
    Points
    1 484

    Par défaut

    Salut,

    J'ai eu ma réponse en ouvrant un sujet :
    http://www.developpez.net/forums/d94...wd-wmi-dotnet/

    Il s'avère que cela est dû à la version de Windev utilisé, version 12 en l'occurrence, qui ne gère pas les enumérations des assemblages DOTNET.
    Le problème est corrigé en version 14/15.

  7. #7
    Membre chevronné
    Inscrit en
    avril 2008
    Messages
    815
    Détails du profil
    Informations forums :
    Inscription : avril 2008
    Messages : 815
    Points : 780
    Points
    780

    Par défaut

    Salut à tous!

    Merci JP pour cette contribution!

    Je viens donc d'essayer sur le poste de DEV et j'obtiens cette erreur :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Que s'est-il passé ?
    L'invocation de la méthode <Get()> du type <ManagementObjectCollection> a échoué
    
    Code erreur : 200002
    Niveau : erreur fatale (EL_FATAL)
    
    Dump de l'erreur du module 'wd170net2.dll' (17.0.20.0).
    Identifiant des informations détaillées (.err) : 200002
    Informations supplémentaires :
    EIT_PILEWL :
    Procédure globale RécupèreContenu (pWMI.RécupèreContenu), ligne 62
    Procédure globale RécupèreInfosLicence (Procedures globales de GESCO.RécupèreInfosLicence), ligne 41
    Clic sur BTN_Recupere_Licence (FEN_PP.BTN_Recupere_Licence), ligne 1
    EIT_DATEHEURE : 08/11/2012 10:18:50
    Est ce dû au framework detnot?
    Comment savoir si ce framework est installé?
    Est-il nécessaire de l'installer sur le poste de DEV avec WD ?

    Que de questions! désolé je suis vraiment bleu dans WMI

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •