none
[C#] Récupérer des Informations sur une machine distance a l'aide de WMI RRS feed

  • Question

  • Bonjour je me permet de m'adresser a vous car pour une fois je ne trouve pas la solution n'y exemple sur internet pour mon cas. Je suis étudiant et actuellement j'étudie le C# l'un de mes exercices consiste a récupérer scan l'ensemble du réseau et a récupérer des infos sur les machines trouver. 

    Mon soucie est que je n'arrive pas a interoger les machines trouver. J'ai essayer en me bassant sur les exemple et cour de votre forum et site web d’interroger les machine a l'aide du WMI. Mais je n'arrive même pas a récupérer l'adresse mac.  Si quelqu'un pouvais me rediriger vers un exemple ou on fait des appels sur des machines distance sa m'interesse fortement. Merci d'avance pour toute aide que vous pouvez m'apporter. 

    Erreur:

    Le serveur RPC n’est pas disponible. (Exception de HRESULT : 0x800706BA)

     

    Voici l'ébauche de code que j'ai faite :

     

     

     

     

    try
       {
        ConnectionOptions aConnectionOptions = new ConnectionOptions();
        aConnectionOptions.Username = domain + "\\" + login;
        aConnectionOptions.Password = password;
    
        //Utilisation du namespace WMI dans lequel les opérations de gestion vont être effectuées.
        ManagementScope aManagementScope = new ManagementScope("\\\\" + ligne + "\\root\\cimv2", aConnectionOptions);
        aManagementScope.Connect();
        System.Management.ObjectQuery aObjectQuery = new System.Management.ObjectQuery("select MacAddress from Win32_LogicalDisk where IPAddress=" + ligne);
        ManagementObjectSearcher searcher = new ManagementObjectSearcher(aManagementScope, aObjectQuery);
    
        ManagementObjectCollection queryCollection = searcher.Get();
        foreach (ManagementObject aManagementObject in queryCollection)
        {
        mac = "Name : " + aManagementObject["MacAddress"].ToString();
        }
       }
       catch (Exception i)
       {
        mac = "bon sa marche pas super";
       
       }

     

     

    vendredi 11 février 2011 13:25

Réponses

  • Bonjour,

    J'ai testé votre code, il fonctionne correctement. Par contre en testant j'ai obtenus la même erreur que vous car je m'étais trompé sur le nom de l'hôte.

    En fait dans votre code si l'adresse IP définie par votre variable "ligne" n'existe pas ou si l'hôte en question n'a pas le service RPC démarré, alors vous obtenez l'erreur : "Le serveur RPC n’est pas disponible. (Exception de HRESULT : 0x800706BA)".

    D'après ce que vous avez expliqué vous faites un scan sur le réseau, donc les adresses utilisés par la variable "ligne" sont potentiellement non utilisées (pas d'hôte ou machine sans service RPC). Il faut donc tester si un hôte existe à l'adresse IP indiquée, pour cela vous pouvez utiliser une requête via Win32_PingStatus (http://msdn.microsoft.com/en-us/library/aa394350(v=vs.85).aspx) en utilisant l'ordinateur local, si le StatusCode = 0 il y a bien un périphérique connecté.

    Exemple :

        public static bool Ping(string address)
        {
          bool pingOk = false;
    
          try
          {
            ManagementObjectSearcher searcher = 
              new ManagementObjectSearcher("root\\CIMV2", 
              "SELECT * FROM Win32_PingStatus where address = '" + address + "''"); 
    
            foreach (ManagementObject queryObj in searcher.Get())
            {
              if(queryObj["StatusCode"].ToString() == 0)
              {
                pingOk = true;
                break;
              }
            }
          }
          catch (ManagementException e)
          {
            MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
          }
    
          return pingOk;
        }
    

    En espérant vous aider...

    • Proposé comme réponse Papy Normand mercredi 16 février 2011 21:32
    • Marqué comme réponse Alex Petrescu jeudi 17 février 2011 09:27
    mardi 15 février 2011 17:09

Toutes les réponses

  • Bonjour,

    L'accès distant fonctionne uniquement avec un compte administrateur, après le système de requête est identique.

    Pour tester tes requêtes je te conseil cet outil Microsoft : http://www.microsoft.com/DOWNLOADS/en/details.aspx?FamilyID=2cc30a64-ea15-4661-8da4-55bbc145c30e&displaylang=en

    Il permet également de générer le code associé...

    Cordialement

     

    vendredi 11 février 2011 14:09
  • Bonjour,

    Comme l'a indiqué très justement Atmeitsatme, il faut se connecter avec un compte administrateur ou avoir des droits d'accès sur le WMI des 2 machines ( locale et éloignée ). S'il est assez simple de configurer le WMI si les 2 machines appartiennent au même domaine Windows, celà n'est pas simple mais faisable pour 2 machines sur un Workgroup lorsqu'elles disposent d'un XP Pro SP3 et quasiment impossible entre 2 machines avec un Windows Home.Et je ne parle pas des problèmes avec l'UAC pour Vista et Windows 7, sans compter ceux qui peuvent arriver avec les pare-feux ou les suites anti-virus.

    S'il vous plait, pourriez-vous nous expliquer comment vous connectez à votre machine éloignée ? ( par Terminal Server,les 2 machines sont-elles sur le même domaine Windows et dans ce cas, les versions et Editions des OS sur le serveur et les 2 machines ?)

    WMI ( voir System.Management comme espace de noms dans la library ) est relativement simple à utiliser mais très pointilleux sur les questions de sécurité. De plus, la gestion des exceptions n'est pas toujours évidente et doit se faire avec beaucoup de soin. Par contre, les renseignements qu'il donne sont trés interessants.

    Inconvénient : très peu de documentation en français voir

    http://msdn.microsoft.com/fr-fr/library/aa394084(v=VS.85).aspx

    Tout est en anglais ( tant pis pour les français )

    Bonne journée


    Mark Post as helpful if it provides any help.Otherwise,leave it as it is.
    samedi 12 février 2011 10:13
  • Rebonjour,

    Je suis désolé mais je viens de relire plus attentivement votre 1er billet et vous indiquiez avoir une erreur qui m'inquiète beaucoup

    "Le serveur RPC n’est pas disponible. (Exception de HRESULT : 0x800706BA)" 

    Soit le service RPC n'existe pas ( ? ) soit il est arrété

    Pour vérifier cela, je vous décris ma méthode ( applicable au moins à XP Pro SP3 )

    - cliquez sur Démarrer

    - sélectionnez Outils d'administration

    - double-cliquez sur Services

    rechecher un service appelé Appel de procédure distante (RPC) s'il existe , vérifiez que son état est Démarré et que le type de démarrage est Automatique ( sinon modifier le type de démarrage et/ou démarrer ce service )

    Vous pourriez avoir besoin d'autres services comme :

    - le fournisseur de la prise en charge de la sécurité LM NT

    - le gestionnaire de connexion ( automatique peut-être ) d'accès distant

    - le localisateur d'appels de procédures distantes (RPC)

    - Windows Remote Management (WS-Management)

    Pour ces 4 services, je ne suis pas du tout un spécialiste , mais je suis sûr que des gens bien meilleurs que moi comme Alex Petrescu ou Gilles Tourreau se feront un plaisir de vous aider ( ou rectifier ce que je viens d'écrire , je pressens un problème de ce côté sans pouvoir être plus précis ). La list de noms est loin d"être exhaustive, ce ne sont que les 1ers qui me viennent à l'esprit. Et je suis preneur de toute information à ce sujet

    Bonne journée


    Mark Post as helpful if it provides any help.Otherwise,leave it as it is.
    samedi 12 février 2011 11:14
  • Bonjour il ma bien fallut un weeken pour exploiter l'ensemble des informations que vous m'avez apporter (bonne saint valentin en passant). 

    Alors je vous apporte quelque précision:

    - Je travaille en mode administrateur sur un seven 32 bits.

    -Le parc informatique sur lequel je travail est mon lycée et je peut si je le souhaite disposer d'autre droit il suffit que je le demande a mon professeur. (Ainsi il nous a fourni les mots de passes administrateur, etc pour réaliser notre application)

    - Se parc est composer essentielle d'ordinateur sous windows xp a quelque exception certain sous sous os UNIX.

    - Mon ordinateur portable ne fait  pas partie du domaine et je doit rentrer non stop des mots de passe ^^.

     

    Pour se qui est de l'erreur : Le serveur RPC n’est pas disponible. (Exception de HRESULT : 0x800706BA) j'avais pris soin de regarder sur internet avant de poster ici et j'avait déjà suivie les démarche pour activer les différent service. Mais l'erreur persiste.

     

    Je suis inquiet sur le fait que le WMI ne puisse pas fonctionner a tant connaitrier vous d'autre moyen pour récupérer se genre information ?   

    lundi 14 février 2011 08:07
  • J'ai tester ma requette avec l'outil que vous m'avez fournie et je récupére bien les information dont j'ai besoin. Mais dans mon code ::

     

    try{
                ConnectionOptions connection = new ConnectionOptions();
                connection.Username = login;
                connection.Password = password;
                connection.Authority = "ntlmdomain:0800009a";
    
                ManagementScope scope = new ManagementScope(
                  "\\\\" + ligne + "\\root\\cimv2", connection);
                scope.Connect();
    
                ObjectQuery query = new ObjectQuery(
                  "SELECT * FROM Win32_NetworkAdapterConfiguration");
    
                ManagementObjectSearcher searcher =
                  new ManagementObjectSearcher(scope, query);
    
                foreach (ManagementObject queryObj in searcher.Get())
                {
    
                  mac = "Name : " + queryObj["MacAddress"].ToString();
                }
                Close();
                 }
                  catch (Exception i)
                  {
                  mac = "bon sa marche toujours pas super";
                  
                  }
     
    
    Toujours la même erreur : comment se fait t'il que le programme qui vérifie la requête me renvoie la bonne information alors que mon programme personnel ne c que me renvoyer sans cesse : que le serveur RPC n'est pas disponible.  J'ai du oublier un using ou une référence peut etre ? .... ^^ j'avoue que la je suis a cour de sollution si quelqu'un avait une idée que j'ai matière a travailler. Merci d'avance. 

    lundi 14 février 2011 15:38
  • Bonjour,

    Pourriez-vous regarder ce lien ?

    http://social.msdn.microsoft.com/forums/en-us/csharpgeneral/thread/056C09ED-B291-4BE1-9CB9-324D43400034

    Vous parlez d'un using ou une référence oubliés : je ne le pense pas car vous auriez une erreur de génération ( que j'ai tendance à appeler erreur de compilation )

    Avez-vous essayé de tester votre application en local  en donnant l'adresse de votre machine ? ( pour éliminer les problèmes réseau )

    Bonne journée

    PS : pourriez-vous donner le nom,l'édition et version de votre outil de développement ? Vous dites que vous êtes administrateur de votre poste, du serveur , réseau ? Etes-vous sûr que que le service Serveur RPC est bien configuré et démarré sur votre poste et sur tous les postes du réseau ? Pourriez-vous vérifier que les pare-feux ne bloquent pas les requètes WMI ? ( c'est un problème classique avec WMI qui est très chatouilleux dès qu'il s'agit d'obtenir des informations sur des postes différents du vôtre )

    Bonne soirée

    PS2 : vôtre problème n'est pas simple , pour faciliter la lecture de vos écrits, pourriez-vous , s'il vous plait, faire un peu plus attention à l'orthographe, celà éviterait à d'éventuels répondeurs de passer un temps fou à essayer de comprendre vos écrits. J'espère que vous voudrez bien m'excuser, je parais peut-être vieux jeu , mais les fautes d'orthographe m'empèche de me consacrer à mon souci premier : vous aider le plus rapidement et le plus efficacement possible. 


    Mark Post as helpful if it provides any help.Otherwise,leave it as it is.
    lundi 14 février 2011 21:00
  • Bonjour,

    J'ai testé votre code, il fonctionne correctement. Par contre en testant j'ai obtenus la même erreur que vous car je m'étais trompé sur le nom de l'hôte.

    En fait dans votre code si l'adresse IP définie par votre variable "ligne" n'existe pas ou si l'hôte en question n'a pas le service RPC démarré, alors vous obtenez l'erreur : "Le serveur RPC n’est pas disponible. (Exception de HRESULT : 0x800706BA)".

    D'après ce que vous avez expliqué vous faites un scan sur le réseau, donc les adresses utilisés par la variable "ligne" sont potentiellement non utilisées (pas d'hôte ou machine sans service RPC). Il faut donc tester si un hôte existe à l'adresse IP indiquée, pour cela vous pouvez utiliser une requête via Win32_PingStatus (http://msdn.microsoft.com/en-us/library/aa394350(v=vs.85).aspx) en utilisant l'ordinateur local, si le StatusCode = 0 il y a bien un périphérique connecté.

    Exemple :

        public static bool Ping(string address)
        {
          bool pingOk = false;
    
          try
          {
            ManagementObjectSearcher searcher = 
              new ManagementObjectSearcher("root\\CIMV2", 
              "SELECT * FROM Win32_PingStatus where address = '" + address + "''"); 
    
            foreach (ManagementObject queryObj in searcher.Get())
            {
              if(queryObj["StatusCode"].ToString() == 0)
              {
                pingOk = true;
                break;
              }
            }
          }
          catch (ManagementException e)
          {
            MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
          }
    
          return pingOk;
        }
    

    En espérant vous aider...

    • Proposé comme réponse Papy Normand mercredi 16 février 2011 21:32
    • Marqué comme réponse Alex Petrescu jeudi 17 février 2011 09:27
    mardi 15 février 2011 17:09