[c#] PerformanceCounter à distance

SupaLou Messages postés 74 Date d'inscription samedi 10 janvier 2004 Statut Membre Dernière intervention 19 septembre 2006 - 22 juin 2006 à 10:09
SupaLou Messages postés 74 Date d'inscription samedi 10 janvier 2004 Statut Membre Dernière intervention 19 septembre 2006 - 28 juin 2006 à 08:54
Bonjour tout le monde, une fois de plus je fais appel a vous .
Alors voila je vous explique tout:
Je cherche à developper une application qui va me permettre de surveiller un ensemble de mes serveurs depuis un autre PC. Ainsi je veux récupérer des informations sur la mémoire, sur certains processus etc grâce au composant performancecounter. Donc pour l'instant j'arrive bien à recupérer ses informations mais uniquement pour le PC local. Sinon pour récupérer celle de mon serveur je suis obligé de l'ajouter dans l'explorateur de serveur en indiquant le nom d'utilisateur ainsi que son mot de passe (Sans oublier de mettre dans la propriété machinename du composant performancecounter le nom de mon serveur ).

Je souhaiterai alors mettre les informations concernant ma connexion (nom du serveur, login et mot de passe) "directement" dans le code sachant que le nom du serveur auquel je veux me connecter doit être récupérer grâce à une variable. Je pense que ceci peut se faire directement dans le fichier de configuration app.config comme lorsqu'on crée une chaine de connexion pour un serveur sql mais je ne sais pas du tout comment m'y prendre...

J'espère avoir été suffisament clair, sinon n'hésitez pas.

Merci de votre aide

6 réponses

SupaLou Messages postés 74 Date d'inscription samedi 10 janvier 2004 Statut Membre Dernière intervention 19 septembre 2006
22 juin 2006 à 16:39
je me permet de faire un petit up car je suis étonné de voir que je suis le seul a essayer de faire cela...
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
24 juin 2006 à 18:40
Salut,

Il suffit que tu affectes le nom de machine à la propriété MachineName.
Pour le login/pass, ceux du compte executant actuellement le code seront utilisés, si tu dois en utiliser un autre, tu devrais y arriver via l'impersonification (impersonation).

/*
coq
MVP Visual C#
*/
0
SupaLou Messages postés 74 Date d'inscription samedi 10 janvier 2004 Statut Membre Dernière intervention 19 septembre 2006
25 juin 2006 à 10:42
Salut coq,


jte remercie de te préoccuper de mon problème cest vrmt sympas :).


Donc oui tu as tout a fait saisi ce que je voulais faire, c'est à dire utilisé un autre compte que celui exécutant le code. Pourrais tu m'en dire un peu plus concernant l'impersonification (impersonation)car je ne connais pas du tout cette notion...

Merci
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
25 juin 2006 à 11:31
Il s'agit d'emprunter l'identité d'un utilisateur pour executer une portion de code.

Tu devrais trouver quelques exemples sur le net, comme :
- A small C# Class for impersonating a User
- Windows Impersonation using C#

/*
coq
MVP Visual C#
*/
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SupaLou Messages postés 74 Date d'inscription samedi 10 janvier 2004 Statut Membre Dernière intervention 19 septembre 2006
26 juin 2006 à 11:55
J'ai telecharger la source sur le lien que tu m'as donné et jai donc ajouter la classe Impersonator.cs a mon projet. Ensuite jai donc utilisé cette portion de code afin de récupérer l'utilisation mémoire du processus aspnet_wt sur un serveur distant:
using (new Impersonator ("Administrateur","workgroup", "toto") )

   try
   {
      Process[] ps;
      ps = Process.GetProcessesByName("aspnet_wp", "maMachine");
      
foreach
( Process p
in
ps )
      {
         MessageBox.Show("Utilisation mémoire: " + (p.WorkingSet / 1024).ToString() + " ko");
      }
   }
   catch
(Exception ex)
   {
      MessageBox.Show(ex.ToString());
   }
}

Le problème est que jai toujours une erreur à cause d'un accès refusé. Cela peut il venir du fait que la machine que je souhaite atteindre est dans un workgroup et non pas dans un domaine??

Merci a toi
0
SupaLou Messages postés 74 Date d'inscription samedi 10 janvier 2004 Statut Membre Dernière intervention 19 septembre 2006
28 juin 2006 à 08:54
Bon finalement j'ai trouvé une autre méthode pour résoudre mon problème.
Je suis passé par les wmi. Ce qui me donne:

// Spécification de tous les paramètres requis pour créer une connexion

ConnectionOptions connexion =
new ConnectionOptions();
connexion.Username = txtLogin.Text;
connexion.Password = txtMDP.Text;
String stringHostName = txtServeur.Text;

// Utilisation du namespace WMI dans lequel les opérations de gestion vont être effectuées.
System.Management.ManagementScope ms =
new System.Management.ManagementScope("\\\" + stringHostName + "\\root\\cimv2", connexion);

// La classe ObjectQuery représente une requête de gestion qui retourne des instances ou des
// classes // On récupère l'espace disque libre pour toutes les partitions: DriveType 3> Local Disk
//http://msdn.microsoft.com/library/default.aspurl=/library/enus/wmisdk/wmi/win32_logicaldisk.asp
System.Management.ObjectQuery QueryEvent new System.Management.ObjectQuery("select WorkingSetSize from Win32_Process Where Name "aspnet_wp.exe"");

// La classe ManagementObjectSearcher permet d'extraire une collection d'objets de gestion,
// en fonction de la requête spécifiée lors de son instanciation par le paramètre ObjectQuery
// ou directement par une string si l'on " code en dur ".
ManagementObjectSearcher aManagementObjectSearcher =
new ManagementObjectSearcher(ms, QueryEvent);

// ManagementObjectCollection représente différentes collections d'objets de gestion extraits via WMI.
ManagementObjectCollection aManagementObjectCollection = aManagementObjectSearcher.Get();

foreach(ManagementObject aManagementObject
in aManagementObjectCollection)
{

   foreach (System.Management.PropertyData aPropertyData
in aManagementObject.Properties) 
   {
      MessageBox.Show(aPropertyData.Name + " " + Convert.ToInt32(aPropertyData.Value)/1024 +    " Ko");

   }
}

Voilà voilà en esperant que cela serve a quelqu'un.
Sinon maintenant je cherche un moyen pour parvenir a stopper ce processus à distance puis a le redemarrer. J'ai vu déjà pas mal de chose sur ce forum mais j'ai rien trouvé en passant par wmi... Si vous avez des idées je suis preneur.
0
Rejoignez-nous