Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Аватара для Delirium

Ветеран


Сообщения: 5624
Благодарности: 936

Профиль | Отправить PM | Цитировать


Решил проблему, не в том направлении копал просто. Проще всего не через WMI, а, действительно через ping проверять доступность машины. Ниже приведен небольшой классик, который в течении 2-3 секунд дает ответ, есть пинг или нет. Если есть, результат мгновенно приходит. Если машина недоступна, то ответ приходит через пару секунд:
Код: Выделить весь код
class QueryData
    {
        public bool HasPower(string who)
        {
            Ping pingSender = new Ping();
            PingOptions options = new PingOptions();

            // Use the default Ttl value which is 128,
            // but change the fragmentation behavior.
            options.DontFragment = true;

            // Create a buffer of 32 bytes of data to be transmitted.
            string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
            byte[] buffer = Encoding.ASCII.GetBytes(data);
            int timeout = 10;
            PingReply reply;
            try
            {
                reply = pingSender.Send(who, timeout, buffer, options);
                if (reply.Status == IPStatus.Success)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch 
            {
                return false;
            }
        }
    }
При игре с параметром int timeout = 10; можно выставить время ожидания отклика. В случае слишком малого значения возможны ложные срабатывания на true, поэтому выставлено в 10 - практика показала, что в нормальной сети этого времени достаточно.

-------

Пройденные курсы:
[Microsoft №10174 Sharepoint], [SharePoint]
Мои проекты:[CheckAdmins], [NetSend7], [System Uptime], [Remote RAdmin LogViewer],[Netdom GDI], [Holidays - напоминалка о днях рождения]

А я офис-гуру :)


Отправлено: 04:37, 28-10-2008 | #2