Лучший способ определить, загрузился ли удаленный компьютер и работает ли он - PullRequest
4 голосов
/ 20 июля 2010

Я пишу тестовое приложение, которое управляет другим компьютером.Тестовый компьютер запускается путем отправки командной строки через порт RS-232 (с управляющего компьютера под управлением Windows XP SP2 с использованием приложения C #), после чего тестовый компьютер включается и загружается в Windows XP.Я хотел бы знать, как лучше всего определить, когда этот компьютер завершил процесс загрузки и работает нормально.

Я думал о следующем:

1) Я тоже думалпроверки связи с этим компьютером, или
2) Иметь общий диск и, если есть возможность доступа к этому общему диску, или
3) Написание небольшого сервиса, с которым я могу общаться

Есть ли другое / лучшееподход?

Марк

Ответы [ 2 ]

1 голос
/ 20 июля 2010

Все зависит от того, что вы считаете "завершил процесс загрузки и работает нормально" . Например, если все, что вас волнует, это момент инициализации сетевой карты, пинг может быть хорошим (если порт ECHO не закрыт).

Общий ресурс не является хорошей идеей, поскольку он обычно становится доступным только после входа пользователя, что может или не может иметь место в зависимости от вашей ситуации. Но даже если, что, если вы измените конфигурацию или решите, что открытие общего ресурса является брешей в безопасности?

Если вы хотите воспроизвести его наверняка или если вам просто нужно подождать, пока все сервисы не запустятся, вам следует рассмотреть третий вариант. Это проще всего сделать. Пусть он прослушивает порт 80 и запускается из IIS. При запросе он может ответить с некоторыми деталями машины. Это также даст вам большую гибкость. Использование IIS помогает вам не создавать собственную службу и упрощает установку и настройку.

Если IIS не является опцией, вы, конечно, можете подумать о создании собственной службы. Это не так сложно сделать, но вам потребуется написать код для прослушивания определенных портов самостоятельно.

0 голосов
/ 20 июля 2010

У меня была именно та проблема, с которой вы столкнулись, я обнаружил, что написание пользовательского сервиса было наиболее полезным. (На самом деле мне нужно было знать, когда у безголовой машины есть служба удаленного рабочего стола, готовая принимать подключения, написанная мною программа фактически подает звуковой сигнал на динамик ПК, когда он готов к входу в систему.

РЕДАКТИРОВАТЬ: Я выкопал источник на случай, если вы заинтересованы.

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);
        }
    }
}
...