Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » .NET - [решено] TimeOut для удаленного соединения по WMI на C#

Ответить
Настройки темы
.NET - [решено] TimeOut для удаленного соединения по WMI на C#

Аватара для Delirium

Ветеран


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

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


Пишу небольшое приложение, использующее WMI для сбора данных с удаленных машин. Все работает, за исключением одного: В случае, если компьютер выключен/на нем нет WMI/другая причина недоступности, то соединение происходит очень долгое время.
Все попытки уменьшить таймаут для попытки соединения ни к чему не приводили. Вот как пытался:


Код: Выделить весь код
ConnectionOptions connOptions = new ConnectionOptions();
            ObjectGetOptions getOptions = new ObjectGetOptions();
            getOptions.Timeout = new System.TimeSpan(0, 0, 2); //2 секунды
            //ManagementScope machineScope = new ManagementScope(machineWmiNamespace, connOptions);



            //scope.Options.Timeout = New TimeSpan(20000000) //другим способом 2 секунды

            scope = new ManagementScope(pcstr, connOptions);
            scope.Options.Timeout = new TimeSpan(0, 0, 0); // и даже 0 секунд
            
            scope.Connect();
Результат нулевой. Вот что вычитал путем гугливания:

Цитата:
Remote WMI queries are subject to the system-wide TCP/IP connection timeout settings. A two second timeout for the first attempt, 6 attempts, doubling the timeout each time. 2 + 4 + 8 + 16 + 32 + 64 = 126 seconds. You can try hacking the TCP registry settings, not sure if that's a good idea.
Такой вариант меня тоже не устраивает.
ПРобовал использовать PING, ответ получаю, проанализировать могу, но все равно очень долго. Есть ли какой нибудь способ указания таймаута при коннекте WMI на удаленную машину?

-------

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

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


Отправлено: 04:58, 27-10-2008

 

Аватара для 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



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для menpavel

Пользователь


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

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


Если кого заинтересует ping средствами JScript:
Код: Выделить весь код
function Ping(strHost)
	{
	var objPing, objRetStatus;
	var objPing = GetObject("winmgmts:");
	objRetStatus = new Enumerator(objPing.ExecQuery("select * from Win32_PingStatus where address = '" + strHost + "'"));
	return(objRetStatus.item().StatusCode);
	}
на MSDN можно более подробно рассмотреть Win32_PingStatus

Последний раз редактировалось menpavel, 08-06-2010 в 12:38. Причина: обшипся

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:36, 08-06-2010 | #3



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » .NET - [решено] TimeOut для удаленного соединения по WMI на C#

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Помогите найти скрипт для удаленного удаления програм magwolf Скриптовые языки администрирования Windows 20 01-02-2016 23:35
Ошибка - [решено] WMI namespace Cr00t Microsoft Windows 2000/XP 1 18-08-2009 13:26
Службы - [решено] Необходимый минимум для нормального соединения по оптоволокну(fiber) Letik Microsoft Windows 2000/XP 2 09-01-2009 16:26
DFS => Timeout после закрытия файла? uptk Microsoft Windows NT/2000/2003 0 07-11-2008 17:05
Ошибка - [решено] 1(Одна ошибка WMI) mikola1983 Microsoft Windows 2000/XP 2 21-09-2007 14:36




 
Переход