Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > WinDev > Contribuez
Contribuez Vos contributions pour la rubrique Windev : articles, cours, tutoriels, faq, comparatifs, tests, sources, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 22/06/2010, 16h37   #1
jurassic pork
Membre chevronné
 
Avatar de jurassic pork
 
Bidouilleur
Inscription : décembre 2008
Messages : 379
Détails du profil
Informations professionnelles :
Activité : Bidouilleur

Informations forums :
Inscription : décembre 2008
Messages : 379
Points : 769
Points : 769
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 ;-)
jurassic pork est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 23/06/2010, 08h25   #2
hehehe
Membre du Club
 
Inscription : janvier 2008
Messages : 55
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 55
Points : 52
Points : 52
intéressant:
est ce que cela fonctionne
quelque soit le système ?
quelque soit le framework .net installé?
hehehe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2010, 18h37   #3
jurassic pork
Membre chevronné
 
Avatar de jurassic pork
 
Bidouilleur
Inscription : décembre 2008
Messages : 379
Détails du profil
Informations professionnelles :
Activité : Bidouilleur

Informations forums :
Inscription : décembre 2008
Messages : 379
Points : 769
Points : 769
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
jurassic pork est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/06/2010, 10h40   #4
Lo²
Membre Expert
 
Homme
Développeur informatique
Inscription : juin 2004
Messages : 1 222
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 222
Points : 1 512
Points : 1 512
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.
Lo² est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2010, 00h38   #5
jurassic pork
Membre chevronné
 
Avatar de jurassic pork
 
Bidouilleur
Inscription : décembre 2008
Messages : 379
Détails du profil
Informations professionnelles :
Activité : Bidouilleur

Informations forums :
Inscription : décembre 2008
Messages : 379
Points : 769
Points : 769
bonjour Lo2,

mon code marche sous WD15 Windows 7

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


Ami calmant, J.P
jurassic pork est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2010, 09h32   #6
Lo²
Membre Expert
 
Homme
Développeur informatique
Inscription : juin 2004
Messages : 1 222
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 222
Points : 1 512
Points : 1 512
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.
Lo² est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/11/2012, 11h23   #7
zouzoukha
Membre chevronné
 
Inscription : avril 2008
Messages : 723
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 723
Points : 624
Points : 624
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
zouzoukha est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 14h55.


 
 
 
 
Partenaires

Hébergement Web