powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Программа зависает при выполнении WMI-запроса на получения состояния службы
9 сообщений из 9, страница 1 из 1
Программа зависает при выполнении WMI-запроса на получения состояния службы
    #38179726
furiousangel256
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток.

Столкнулся с такой проблемой - когда я пытаюсь получить информацию о состоянии службы на ПК через WMI-запрос (код ниже) программа зависает и перестаёт подавать какие-либо признаки жизни. Программа сделана как модуль в xls-файле (Excel 2007). При зависании Excel начинает выдавать сообщения "Microsoft Office ожидает завершения OLE-операции", но при этом ничего не происходит. К зависанию приводит выполнение строки :

Код: vbnet
1.
Set objShare_Sweeper = objWMIService.Get("Win32_Service.Name='" & ServiceName & "'")



т.е. зависает именно в сам момент получения информации о состоянии службы на ПК

С помощью этой процедуры проверял службы на ~6000 компьютерах - но на 5-6 ПК программа зависает и я не могу понять в чём дело. Если я подключаюсь к этим ПК через консоль управления компьютером - никаких проблем не возникает, консоль открывается, работает, показывает службы - всё как надо. А получение этой же информации через WMI-запрос приводит к зависонам. Есть мысли с чем это может быть связано?

Код процедуры получения информации о состоянии службы :

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Sub service_sweeper(PCname As String) 
Dim ServiceName As String
Dim ServiceErrName As String
Dim ErrNumber As Long
Dim ErrDescription As String
On Error GoTo ErrorProcessing
Set objWMIService = GetObject("winmgmts:\\" & PCname & "\root\CIMV2")
ServiceName = "CryptSvc"
Set objShare_Sweeper = objWMIService.Get("Win32_Service.Name='" & ServiceName & "'")
If IsEmpty(objShare_Sweeper) = False Then
    ThisWorkbook.Worksheets(1).Cells(RowPosition, 6) = objShare_Sweeper.Properties_.Item("State")
    ThisWorkbook.Worksheets(1).Cells(RowPosition, 7) = objShare_Sweeper.Properties_.Item("StartMode")
End If
Set objShare_Sweeper = Nothing
Set objWMIService = Nothing
Exit Sub
ErrorProcessing:
ErrNumber = Err.Number
ErrDescription = Err.Description
Call ServiceErrorProcessing(ServiceName, ErrNumber, ErrDescription)
Resume Next
End Sub

...
Рейтинг: 0 / 0
Программа зависает при выполнении WMI-запроса на получения состояния службы
    #38179737
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
права доступа? а если запрос на другую службу сделать, так же зависает?
...
Рейтинг: 0 / 0
Программа зависает при выполнении WMI-запроса на получения состояния службы
    #38179757
furiousangel256
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_Oneправа доступа?

Проблема точно не в доступе :
1) Если бы проблема заключалась в правах доступа - выполнение WMI-запроса возвращала бы ошибку "permission denied", но это происходило бы почти мгновенно. Знаю это просто потому, что имеется ряд компьютеров к которым у меня действительно нет доступа и при попытке узнать состояние служб на этих ПК вижу "permission denied" :)
2) Я подключался ко всем "зависающим" компьютерам через консоль управления (compmgmt.msc), заходил в раздел "Службы", открывал службы (т.е. получал информацию в т.ч. об их состоянии и типе запуска), запускал/останавливал службы - ошибок (и зависаний) не возникало.

То есть проблема 100% не в правах доступа :-(

Konst_Oneа если запрос на другую службу сделать, так же зависает?

Пробовал. Зависает при попытке узнать состояние любой службы. Даже если вводишь название несуществующей службы - при выполнении wmi-запроса программа зависает.
...
Рейтинг: 0 / 0
Программа зависает при выполнении WMI-запроса на получения состояния службы
    #38179796
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Set myobj = GetObject("WINMGMTS:" _
            & "{impersonationLevel=impersonate," _
            & "authenticationLevel=pktPrivacy," _
            & "authority=ntlmdomain:mydomain," _
            & "(Debug,!RemoteShutdown)}" _
            & "[locale=ms_409]" _
            & "!\\User1\ROOT\CIMV2:Win32_LogicalDisk=""C:""")

wscript.echo "File system = " & myobj.filesystem



посмотрите тут как делают
...
Рейтинг: 0 / 0
Программа зависает при выполнении WMI-запроса на получения состояния службы
    #38179980
furiousangel256
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_One , Вы имеете ввиду подключаться сразу к объекту служб на удалённом ПК с указанием уровня имперсонации и региональных настройк подключения? Подключаться непосредственно к объекту службы попробовал сейчас (с помощью рекомендованного майкрософтом способа) :

Код: vbnet
1.
Set objSWbemObject = GetObject("WinMgmts://Server/Root/CIMV2:Win32_Service.Name='lanmanserver'")



Не помогает. Программа по-прежнему зависает при подключении к нескольким из 6 тысяч ПК =/

Явное указание уровня имперсонации и региональных настроек не помогает (что понятно - по умолчанию используются те же настройки).
...
Рейтинг: 0 / 0
Программа зависает при выполнении WMI-запроса на получения состояния службы
    #38180036
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
furiousangel256 Программа по-прежнему зависает при подключении к нескольким из 6 тысяч ПК =/Ну так проблема не в программе, а в этих компах. WMI имеет в своей базе древнюю и капризную к настройкам технологию DCOM, так что значение "несколько из 6000" (меньше одного процента) это, я бы сказал, выдающийся показатель. Обычно счет идет на процентов 10.

Ковырять нужно настройки клиентов, но лучше просто переустановить им систему. Возможно это является причиной проблем.
...
Рейтинг: 0 / 0
Программа зависает при выполнении WMI-запроса на получения состояния службы
    #38180052
furiousangel256
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariy , а может быть Вы как местный гуру сможете подсказать какой-нибудь противоракетный манёвр, который помог бы избежать возникновения проблемы связанной с зависанием программы при подключении к удалённому ПК ? :-)

К примеру : на получение информации о состоянии 6-8 служб на одном ПК через WMI уходит в среднем 1-2 секунды. Если проверка одной службы затягивается секунд на 20 можно смело утверждать, что ничем хорошим проверка не закончится. Вопрос в том - как прервать этот зависший процесс? Средствами VB такое вообще возможно?
...
Рейтинг: 0 / 0
Программа зависает при выполнении WMI-запроса на получения состояния службы
    #38180095
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно. Нужно написать многопоточное приложение, проверять каждый комп в отдельном потоке. Это заметно уменьшит общее время исполнения.

Как правильно писать многопоточные приложения: 10555629 .
Тут этот пример немного описан.
...
Рейтинг: 0 / 0
Программа зависает при выполнении WMI-запроса на получения состояния службы
    #38180114
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, у вас же эксель.
Тогда нельзя. Ну или можно, но методом "по воробьям из пушки": вместо потока запускать еще одну невидимую копию экселя.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Программа зависает при выполнении WMI-запроса на получения состояния службы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]