2010-07-19 36 views
4

J'écris une application de test qui contrôle un autre ordinateur. L'ordinateur de test est démarré en envoyant une chaîne de commande via le port RS-232 (à partir d'un ordinateur de contrôle exécutant Windows XP SP2 à l'aide d'une application C#), puis l'ordinateur de test s'allume et démarre sous Windows XP. Je voudrais savoir quelle serait la meilleure méthode pour déterminer quand cet ordinateur a terminé le processus de démarrage et fonctionne normalement.La meilleure façon de déterminer qu'un ordinateur distant a démarré et fonctionne

Je pensais ce qui suit:

1) J'étais soit penser à pinger cet ordinateur, ou
2) Avoir un lecteur partagé et si elle est capable d'accéder à ce lecteur partagé ou
3) Rédaction un petit service avec lequel je peux communiquer

Y a-t-il une approche différente/meilleure?

Mark

Répondre

0

J'ai eu le problème exact que vous avez fait, j'ai trouvé que l'écriture d'un service personnalisé était le plus utile. (J'avais besoin de savoir quand une machine sans écran avait le service Bureau à distance prêt à accepter les connexions, le programme que j'ai écrit émet un léger bip quand il est prêt à être connecté.

EDIT: J'ai déterré la source dans le cas où vous souhaitez où

using System.ComponentModel; 
using System.Configuration.Install; 
using System.Runtime.InteropServices; 
using System.ServiceProcess; 
using System.Threading; 

namespace Beeper 
{ 
    static class Program 
    { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     static void Main() 
     { 
      ServiceBase[] ServicesToRun; 
      ServicesToRun = new ServiceBase[] 
       { 
        new Beeper() 
       }; 
      ServiceBase.Run(ServicesToRun); 
     } 
    } 

    public partial class Beeper : ServiceBase 
    { 
     public Beeper() 
     { 
     } 

     protected override void OnStart(string[] args) 
     { 
      if (MainThread != null) 
       MainThread.Abort(); 
      MainThread = new Thread(new ThreadStart(MainLoop)); 
      MainThread.Start(); 
     } 

     protected override void OnStop() 
     { 
      if (MainThread != null) 
       MainThread.Abort(); 
     } 

     protected void MainLoop() 
     { 
      try 
      { 
       //main code here 
      } 
      catch (ThreadAbortException) 
      { 
       //Do cleanup code here. 
      } 
     } 

     System.Threading.Thread MainThread; 
    } 
    [RunInstaller(true)] 
    public class BeeperInstaller : Installer 
    { 
     private ServiceProcessInstaller processInstaller; 
     private ServiceInstaller serviceInstaller; 
     public BeeperInstaller() 
     { 
      processInstaller = new ServiceProcessInstaller(); 
      serviceInstaller = new ServiceInstaller(); 
      processInstaller.Account = ServiceAccount.LocalSystem; 
      serviceInstaller.StartType = ServiceStartMode.Automatic; 
      serviceInstaller.ServiceName = "MyProgram"; 
      serviceInstaller.ServicesDependedOn = new string[] { "TermService" }; //Optional, this line makes sure the terminal services is up and running before it starts. 
      Installers.Add(serviceInstaller); 
      Installers.Add(processInstaller); 
     } 
    } 
} 
+0

curiosité. pourquoi pas, dans ce scénario, juste interroger le port RDP Si vous souhaitez recevoir une réponse, c'est – Abel

+0

donc je ne sais pas?. Quand j'entends la tonalité, cela me rappelle de démarrer mstsc et de me connecter. –

+0

Il semble que le développement d'un service est probablement la meilleure approche, même si je peux me fier à un dossier partagé en tant qu'utilisateur * ma y * Vous devez vous connecter pour exécuter un logiciel de test, à moins qu'il ne s'exécute sans que l'utilisateur ne se connecte. J'ai encore besoin de voir si le logiciel de test fonctionnera sans que l'utilisateur ne se connecte. Dans les deux cas, je peux avoir la vérification de service pour voir si l'utilisateur est connecté puis envoyer un signal à l'ordinateur du contrôleur pour commencer le test. J'ai choisi la réponse de Scott car il a eu la gentillesse de fournir le code source pour ma cause. – lordhog

1

Tout dépend de ce que vous considérez « a achevé son processus de démarrage et fonctionne normalement ». Par exemple, si tout ce qui vous intéresse est le moment où la carte réseau est initialisée, le ping peut être bon (tant que le port ECHO n'est pas fermé).

Un partage n'est pas une bonne idée, car il n'est généralement disponible que lorsqu'un utilisateur est connecté, ce qui peut ou non être le cas selon votre situation. Mais même si, et si vous changez la configuration ou décidez qu'il s'agit d'une faille de sécurité pour ouvrir un partage?

Si vous voulez le jouer certain ou si vous avez juste besoin d'attendre jusqu'à tous les services ont commencé, vous devriez envisager votre troisième option. C'est plus facile à faire. Laissez-le écouter sur le port 80 et exécutez à partir d'IIS. Lorsqu'il est interrogé, il peut répondre avec quelques détails de la machine. Cela vous donnera également la plus grande flexibilité. L'utilisation d'IIS vous aide à ne pas avoir à écrire votre propre service et rend l'installation et la configuration triviales.

Si IIS n'est pas une option, vous pouvez bien sûr envisager d'écrire votre propre service. Pas si difficile à faire, mais cela vous demandera d'écrire le code pour écouter vous-même certains ports.