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

C# Discussion :

Lecture des informations de la machine hôte


Sujet :

C#

  1. #1
    Membre habitué Avatar de touftouf57
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Moselle (Lorraine)

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Points : 174
    Points
    174
    Par défaut Lecture des informations de la machine hôte
    Bonjour à tous.

    Je suis confronté à un soucis que je ne pensais pas rencontrer.

    Nous avons mis en place un système de licence semi-connectée pour nos applications.
    L'idée est que l'application installée chez le client, calcule un identifiant puis interroge un service web afin d'obtenir un fichier de licence.
    La détermination de l'identifiant s'appuie sur les données de la machine.

    Voici la fonction clé utilisée pour que vous puissiez comprendre.
    On retrouve facilement ce code sur le web.
    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
            public string GetIdentifier(string wmiClass, string wmiProperty)
            {
                string result = "";
     
                ManagementClass mc = new ManagementClass(wmiClass);
                ManagementObjectCollection moc = mc.GetInstances();
     
                foreach (System.Management.ManagementObject mo in moc)
                {
                    if (result == "")
                    {
                        try
                        {
                            result = mo[wmiProperty].ToString();
                            break;
                        }
                        catch
                        {
                        }
                    }
                }
                return result;
            }
    Nous utilisons cette fonction pour obtenir différents propriétés de la machine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    GetIdentifier("Win32_BIOS", "Manufacturer")
    GetIdentifier("Win32_BIOS", "IdentificationCode")
    GetIdentifier("Win32_BIOS", "SerialNumber")
    GetIdentifier("Win32_BaseBoard", "Model")
    GetIdentifier("Win32_BaseBoard", "Manufacturer")
    GetIdentifier("Win32_BaseBoard", "Name")
    GetIdentifier("Win32_BaseBoard", "SerialNumber")
    Nota : Nous avons retiré du calcul, la version du bios puisque lorsque le bios était mis à jour, l'identifiant changeait.
    Jusqu'ici tout va bien.

    Après avoir lu ces infos, nous les assemblons et nous passons l'assemblage au MD5.
    Sur le concept, c'est pas mal.

    Or, cette semaine, j'ai eu droit à une collision de Hash.
    Comment cela est-il possible ?
    Ce serait probable si nous avions une volume de client beaucoup, beaucoup, beaucoup plus important. Nous avons près de 400 clés de licence.

    Je me suis connecté chez le client et j'ai exécuté un outil permettant de voir les données utilisées par le calculateur.
    Le résultat est que toute les propriétés lues sont à vide. C'est pas possible. Il y a forcément quelquechose.....

    Le client me dit que c'est une machine virtuelle (VM) Windows hébergée sur une machine linux.
    Puisque je me suis penché sur le problème suite à la détection de collision de hash. Il y a donc 2 machines qui ont ce problème.
    Je n'ai pas réussi à contacter le second client.

    Je cherche à comprendre si le fait d'avoir une VM Windows hébergé sur du linux peut être la cause, ou bien est-ce que cela pourrait venir d'autre chose tel que le compte utilisé qui n'est pas admin,....

    Je vous remercie de votre aide.

  2. #2
    Membre chevronné
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    Janvier 2014
    Messages
    653
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur .NET & Game Designer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 653
    Points : 2 181
    Points
    2 181
    Par défaut
    Bonjour,

    En effet si les informations sont vides, alors il y aura récurrence et donc collision. Et c'est là le problème car il est impossible de s'assurer que ces informations seront là. Et sur les machines virtuelles, certaines de ces infos sont bidonnées de la même façon voir totalement indisponibles.

    Je me suis déjà penché sur ce problème à la fois pour l'implémenter et le gruger, et malheureusement il n'y a pas de solutions faciles 100% fiables. Et ces problèmes sont amplifiés dans les entreprises car très souvent cela veut dire : machines virtuelles, même matos, même version de Windows installée en bulk, pas les droits d'utilisateurs nécessaires, etc ...

    Alors vous pouvez toujours combiner toutes les informations qui sont les plus sûrs, pour avoir une assez bonne probabilité de générer un truc unique, mais c'est pas folichon. Même l'adresse MAC n'est pas sûr.

    Tu peux regarder ici mais tu verras qu'il y a toujours un problème pour chaque solution.



    Après cela dépends de comment vous distribuez votre logiciel, mais personnellement je partirai sur un système de "cookies" simplifié, je génère un ID unique de x caractères a l'installation ou à la première utilisation, je planque ça dans le registre, et je l'envoi pendant l'authentification. Le soucis étant une réinstallation possible de Windows mais ça serait aussi un potentiel problème avec votre solution actuelle. Mais au moins ça marcherait nickel avec les machines virtuelles.

Discussions similaires

  1. pb lecture des données d'une carte SD
    Par burby dans le forum Débuter
    Réponses: 1
    Dernier message: 14/10/2009, 19h18
  2. Récupérer des informations sur la carte vidéo
    Par JBond007 dans le forum C++
    Réponses: 9
    Dernier message: 13/08/2009, 15h08
  3. piloter des I/O de carte mère en C
    Par Sylvain R. dans le forum Windows
    Réponses: 6
    Dernier message: 25/03/2008, 10h35
  4. Réponses: 12
    Dernier message: 23/01/2008, 11h45
  5. Réponses: 6
    Dernier message: 25/09/2007, 19h45

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