4

別のコンピューターを制御するテスト アプリケーションを作成しています。テスト コンピュータは、RS-232 ポートを介して (C# アプリケーションを使用して Windows XP SP2 を実行している制御コンピュータから) コマンド文字列を送信することによって起動されます。この時点で、テスト コンピュータの電源がオンになり、Windows XP が起動します。そのコンピュータがいつブート プロセスを完了し、正常に動作しているかを判断する最善の方法を教えてください。

私は次のことを考えていました:

1) そのコンピュータに ping を送信することを考えていた、または
2) 共有ドライブがあり、その共有ドライブにアクセスできる場合、または
3) 通信できる小さなサービスを作成している

別の/より良いアプローチはありますか?

マーク

4

2 に答える 2

1

それはすべて、「起動プロセスが完了し、正常に実行されている」と考えるものに依存します。たとえば、ネットワーク カードが初期化される瞬間だけを気にする場合は、ping を実行しても問題ない可能性があります (ECHO ポートが閉じられていない限り)。

共有は通常、ユーザーがログインしているときにのみ利用可能になるため、お勧めできません。状況によっては、そうでない場合もあります。しかし、構成を変更したり、共有を開くことがセキュリティ違反であると判断した場合はどうでしょうか?

確実にプレイしたい場合、またはすべてのサービスが開始されるまで待つ必要がある場合は、3 番目のオプションを検討する必要があります。一番簡単です。ポート 80 でリッスンし、IIS から実行します。クエリを実行すると、マシンの詳細をいくつか答えることができます。これにより、最大限の柔軟性も得られます。IIS を使用すると、独自のサービスを作成する必要がなくなり、インストールと構成が簡単になります。

IIS を使用できない場合は、もちろん独自のサービスを作成することを検討できます。それほど難しいことではありませんが、特定のポートをリッスンするコードを自分で作成する必要があります。

于 2010-07-19T21:43:39.567 に答える
0

私はあなたがした正確な問題を抱えていました.カスタムサービスを書くことが最も有用であることがわかりました. (実際には、ヘッドレス マシンのリモート デスクトップ サービスがいつ接続を受け入れる準備ができているかを知る必要がありました。私が書いたプログラムは、ログインの準備ができたときに、実際に PC のスピーカーから小さな音を鳴らします。

編集:興味がある場合に備えて、ソースを掘り下げました。

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);
        }
    }
}
于 2010-07-19T21:46:41.890 に答える