确定远程计算机的最佳方法已启动并正在运行

时间:2010-07-19 21:37:31

标签: c# ping

我正在编写一个控制另一台计算机的测试应用程序。通过RS-232端口(使用C#应用程序从运行Windows XP SP2的控制计算机)发送命令字符串来启动测试计算机,此时测试计算机将打开电源并启动到Windows XP。我想知道什么是确定该计算机何时完成启动过程并正常运行的最佳方法。

我在考虑以下事项:

1)我想要ping那台电脑,或者是 2)拥有共享驱动器,如果能够访问该共享驱动器,或者 3)写一个我可以与之沟通的小型服务

有不同/更好的方法吗?

标记

2 个答案:

答案 0 :(得分:1)

这完全取决于您认为“完成其启动过程并正常运行”。例如,如果你关心的是网卡初始化的那一刻,那么ping可能是好的(只要ECHO端口没有关闭)。

分享不是一个好主意,因为它们通常只有在用户登录时才可用,根据您的具体情况,可能会或可能不是这种情况。但即使如此,如果您更改配置或决定打开共享是一个安全漏洞怎么办?

如果你想确定它,或者你只需​​要等到所有服务开始,你应该考虑你的第三个选择。这是最容易做到的。让它侦听端口80并从IIS运行。查询时,它可以回答机器的一些细节。这也将为您提供最大的灵活性。使用IIS可以帮助您不必编写自己的服务,并使安装和配置变得微不足道。

如果IIS不是一个选项,您当然可以考虑编写自己的服务。这并不难,但它需要你编写代码来自己监听某些端口。

答案 1 :(得分:0)

我遇到了你遇到的确切问题,我发现编写自定义服务是最有用的。 (我实际上需要知道无头机器何时让远程桌面服务准备接受连接,我写的程序实际上在准备好登录时会发出微调的声音。

编辑:如果您有兴趣,我会挖出来源。

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