none
Проблема с подпиской WMI RRS feed

  • Вопрос

  • Здравствуйте все,

    Недавно получил задачу.

    Организовать мониторинг VPN подключений. А именно нужно знать когда происходит отключение удаленных офисов от центрального.

    Есть VPN server OS Windows server 2003 std Rus SP2 R2, Isa server 2006 sp 1

    Есть Windows server 2003 std Rus SP2 R2 Exchange 2003 sp2

    Я решил для этого использовать постоянную подписку WMI.

    В подписке участвуют события Win32_Ntlogevent пространство root\cmiv2 id(20159, 20194) источник RemoteAccess посредством фильтра __EventFilter пространство root\subscription и SMTPEventConsumer пространство root\subscription.

    Схема:

    Отключается удаленный офис появляются события RemoteAccess 20159 или 20194 -> срабатывает фильтр -> отправляется сообщение на адрес.

    mof фильтра:

    instance of __EventFilter
    {
    	EventNamespace = "root\\cimv2";
    	Name = "check_dial";
    	Query = "select * from __instancecreationevent within 5 where targetinstance isa 'win32_ntlogevent' AND targetinstance.LogFile = 'system' AND (targetinstance.EventCode = 20159 or targetinstance.EventCode = 20194)";
    	QueryLanguage = "WQL";
    };
    

    mof потребителя:

    instance of SMTPEventConsumer
    {
    	FromLine = NULL;
    	[Template] Message = "%TargetInstance%";
    	Name = "vpn";
    	SMTPServer = "my exchange server";
    	Subject = "VPN DISCONNECT!";
    	ToLine = "my local mail address";
    };
    

    mof связи фильтра и потребителя:

    instance of __FilterToConsumerBinding
    {
     Consumer = "\\\\.\\root\\subscription:SMTPEventConsumer.Name=\"vpn\"";
     Filter = "\\\\.\\root\\subscription:__EventFilter.Name=\"check_dial\"";
    };
    

    Проблема:

    Дело в том что на OS Windows XP все прекрасно работает, письма приходят с полным логом событий.

    Все что приходит в теле письма:

    instance of Win32_NTLogEvent
    {
    	Category = 0;
    	ComputerName = "my pc name";
    	EventCode = 20159;
    	EventIdentifier = 20159;
    	EventType = 3;
    	InsertionStrings = {"testtesttesttesttest", "my VPN user", "VPN5-1"};
    	Logfile = "System";
    	Message = "Ïîäêëþ÷åíèå ïîëüçîâàòåëÿ \"my VPN user\" ê \"testtesttesttesttest\", âûïîëíåííîå ñ ïîìîùüþ óñòðîéñòâà \"VPN5-1\", áûëî ïðåðâàíî.
    \n";
    	RecordNumber = 7956;
    	SourceName = "RemoteAccess";
    	TimeGenerated = "20110523160205.000000+540";
    	TimeWritten = "20110523160205.000000+540";
    	Type = "èíôîðìàöèÿ";
    };
    
    
    

    На каракули не обращайте внимания там русский текст нет шрифта (TimeSET) он поддерживает эти каракули.

    На Windows server 2003 std sp2 r2 Rus Лог приходит не полный =(

    instance of Win32_NTLogEvent
    {
    	Category = 0;
    	ComputerName = "my server name";
    	EventCode = 20194;
    	EventIdentifier = 20194;
    	EventType = 3;
    	InsertionStrings = {"mydomainname\\myvpnusername", "VPN2-102", "23.05.2011", "13:11", "23.05.2011", "15:43", "151", "38", "4458520", "85820", "
    

    ВОПРОС:

    Почему на OS windows server 2003 std sp2 r2 rus объект "TargetInstance" не получает все свойства из instance класса Win32_NTLogEvent.

    Что я делал:

    1.  В системном логе нет не чего на эту тему, посмотрел лог %windir%\system32\wbem\Logs\wbemess.log.

    При отправке сообщения регистрируется только вот это:

    (Mon May 23 16:02:10 2011.180636265) : Consumer provider SMTPEventConsumer does not support IWbemUnboundObjectSink: error code 80004002
    (Mon May 23 16:04:40 2011.180786265) : Unloading event consumer sink SMTPEventConsumer="vpn"
    (Mon May 23 16:12:10 2011.181236265) : Unloading consumer provider SMTPEventConsumer on (null)

    но и на OS XP это тоже регистрируется.

    2. Оключал Анти спам, касперского.

    3. Запускал на другом сервере OS 2003 std sp2 r2 rus. Запускал на сервере OS 2003 std sp2 r2 rus x64. (Без ISA server)

    4. Пробовал перерегистрировать потребителя, пробовал перерегистрировать потребителя из XP, перезагружал сервер.

    5. Пробовал изменить фильтр и поиграть с его показателями.

    6. Пробовал получить свойства из instance класса Win32_NTLogEvent с помощью vbscript все получается

    ' Присваиваем начальные значения переменным
    strComputer = "."
    strNamespace = "Root\cimv2"
    
    ' Подключаемся к пространству имен WMI
    Set objService = GetObject("WinMgmts:\\" & strComputer & "\" & strNamespace)
    
    Set objEventFilterClass = objService.ExecQuery("Select * from Win32_NTLogEvent",,48)
    
    For Each objEventFilter in objEventFilterClass
    
    wscript.echo objEventFilter.message
    
    next

    7. С помощью wbemtest.exe прошелся по иерархии классов от __Instancecreationevent до System_Class сравнил все с XP но различий особых не нашел.

    8. Поискал подобные ошибки в интеренете (погуглил), а именно таких ошибок не нашел везде пишется что все должно работать нормально и выкладывается подобный пример в том числе msdn.

    9. Поискал подобные ошибки на этом форуме а именно таких ошибок не нашел везде пишется что все должно работать нормально.

    Мои соображения на эту тему:

    После числа проверок есть подозрение что именно объект TargetInstance не получает всех свойств из экземпляра Win32_NTLogEvent.

    Уважаемые прошу помощи в решении этой проблемы. Буду признателен за содействие и помощь.

     

Ответы

  • Проблему я обошел другим способом:

    Создаем файлик test.mof и копируем туда.

    #pragma namespace ("\\\\.\\root\\subscription")
    
    instance of ActiveScriptEventConsumer as $Cons
    {
      Name = "ASEC1";
      ScriptingEngine = "VBScript";
      ScriptFileName = "c:\\mailconsumer\\test.vbs";
    
    };
    
    instance of __EventFilter as $Filt
    {
      EventNamespace = "root\\cimv2";
      Name = "EF1";
      Query = "SELECT * FROM __instancecreationevent WITHIN 5 WHERE TargetInstance ISA \"win32_ntlogevent\" AND targetinstance.LogFile = \"system\" AND targetinstance.EventCode = 20159";
      QueryLanguage = "WQL";
    };
    
    instance of __FilterToConsumerBinding
    {
      Filter = $Filt;
      Consumer = $Cons;
    };
    

    Компилируем созданный mof.(mofcomp)

    теперь создаем test.vbs и копируем туда

    Option Explicit
    dim objEmail,mes
    mes = TargetEvent.TargetInstance.message
    Set objEmail = CreateObject("CDO.Message")
    objEmail.From = "ваш алиас@домен"
    objEmail.To = "ваши почтовые адреса через двоеточие"
    objEmail.Subject = "ваша тема"
    objEmail.Textbody = "Объект: " + vbcrlf + Ucase(mid(mid(mes,1,Instr(1,mes,",") - 2),cstr(InStrRev(mes,"к") + 3),len(mid(mes,1,Instr(1,mes,",") - 2)) - cstr(InStrRev(mes,"к")))) + vbcrlf + "Сообщение системного администратора:" + vbcrlf + mes
    objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 0
    objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = ""
    objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
    objEmail.Configuration.Fields.Update
    objEmail.Send
    set objEmail = nothing
    mes = ""

    Создаем файлик test1.mof и копируем туда. 

    #pragma namespace ("\\\\.\\root\\subscription")
    
    instance of ActiveScriptEventConsumer as $Cons
    {
      Name = "ASEC";
      ScriptingEngine = "VBScript";
      ScriptFileName = "c:\\mailconsumer\\test1.vbs";
    
    };
    
    instance of __EventFilter as $Filt
    {
      EventNamespace = "root\\cimv2";
      Name = "EF";
      Query = "SELECT * FROM __instancecreationevent WITHIN 5 WHERE TargetInstance ISA \"win32_ntlogevent\" AND targetinstance.LogFile = \"system\" AND targetinstance.EventCode = 20194";
      QueryLanguage = "WQL";
    };
    
    instance of __FilterToConsumerBinding
    {
      Filter = $Filt;
      Consumer = $Cons;
    };
    

    Компилируем созданный mof.(mofcomp)

    теперь создаем test1.vbs и копируем туда 

    Option Explicit
    dim objEmail,mes2,mes1,mes,x
    mes2 = TargetEvent.TargetInstance.message
    mes1 = cstr(mes2)
    for x = 1 to len(mes1)
    mes = mid(mes1,1,x)
    next
    Set objEmail = CreateObject("CDO.Message")
    objEmail.From = "ваш алиас@домен"
    objEmail.To = "ваши почтовые адреса через двоеточие"
    objEmail.Subject = "ваша тема"
    objEmail.Textbody = "Объект:" + vbcrlf + Ucase(mid(mid(mes,1,Instr(1,mes,",") - 1),cstr(InStrRev(mes,"\") + 1),len(mid(mes,1,Instr(1,mes,",") - 1)) - cstr(InStrRev(mes,"\")))) + vbcrlf +"Подключение:" + vbcrlf + mid(mes,Instr(1,mes,".") - 2,(Instr(1,mes," и")) - (Instr(1,mes,".") - 3)) + vbcrlf + "Отключение:" + mid(mid(mes,Instr(1,mes,":"),len(mes) - Instr(1,mes,":")),Instr(1,mid(mes,Instr(1,mes,":"),len(mes) - Instr(1,mes,":")),".") - 3,(Instr(1,mid(mes,Instr(1,mes,":"),len(mes) - Instr(1,mes,":")),". ")) - (Instr(1,mid(mes,Instr(1,mes,":"),len(mes) - Instr(1,mes,":")),".") - 3)) + vbcrlf + "Сообщение от сервера:" + vbcrlf + right(mid(mes,13,len(mes)-13),(len(mes)-13) - InStr(1,mid(mes,13,len(mes)-13),"ь") + 4)
    objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 0
    objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "имя почтового сервера"
    objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
    objEmail.Configuration.Fields.Update
    objEmail.Send
    set objEmail = nothing

     

    Но эта тема все равно интересна, что же я в предидущем примере делал не так?

    14 июня 2011 г. 4:13

Все ответы

  • Проблему я обошел другим способом:

    Создаем файлик test.mof и копируем туда.

    #pragma namespace ("\\\\.\\root\\subscription")
    
    instance of ActiveScriptEventConsumer as $Cons
    {
      Name = "ASEC1";
      ScriptingEngine = "VBScript";
      ScriptFileName = "c:\\mailconsumer\\test.vbs";
    
    };
    
    instance of __EventFilter as $Filt
    {
      EventNamespace = "root\\cimv2";
      Name = "EF1";
      Query = "SELECT * FROM __instancecreationevent WITHIN 5 WHERE TargetInstance ISA \"win32_ntlogevent\" AND targetinstance.LogFile = \"system\" AND targetinstance.EventCode = 20159";
      QueryLanguage = "WQL";
    };
    
    instance of __FilterToConsumerBinding
    {
      Filter = $Filt;
      Consumer = $Cons;
    };
    

    Компилируем созданный mof.(mofcomp)

    теперь создаем test.vbs и копируем туда

    Option Explicit
    dim objEmail,mes
    mes = TargetEvent.TargetInstance.message
    Set objEmail = CreateObject("CDO.Message")
    objEmail.From = "ваш алиас@домен"
    objEmail.To = "ваши почтовые адреса через двоеточие"
    objEmail.Subject = "ваша тема"
    objEmail.Textbody = "Объект: " + vbcrlf + Ucase(mid(mid(mes,1,Instr(1,mes,",") - 2),cstr(InStrRev(mes,"к") + 3),len(mid(mes,1,Instr(1,mes,",") - 2)) - cstr(InStrRev(mes,"к")))) + vbcrlf + "Сообщение системного администратора:" + vbcrlf + mes
    objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 0
    objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = ""
    objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
    objEmail.Configuration.Fields.Update
    objEmail.Send
    set objEmail = nothing
    mes = ""

    Создаем файлик test1.mof и копируем туда. 

    #pragma namespace ("\\\\.\\root\\subscription")
    
    instance of ActiveScriptEventConsumer as $Cons
    {
      Name = "ASEC";
      ScriptingEngine = "VBScript";
      ScriptFileName = "c:\\mailconsumer\\test1.vbs";
    
    };
    
    instance of __EventFilter as $Filt
    {
      EventNamespace = "root\\cimv2";
      Name = "EF";
      Query = "SELECT * FROM __instancecreationevent WITHIN 5 WHERE TargetInstance ISA \"win32_ntlogevent\" AND targetinstance.LogFile = \"system\" AND targetinstance.EventCode = 20194";
      QueryLanguage = "WQL";
    };
    
    instance of __FilterToConsumerBinding
    {
      Filter = $Filt;
      Consumer = $Cons;
    };
    

    Компилируем созданный mof.(mofcomp)

    теперь создаем test1.vbs и копируем туда 

    Option Explicit
    dim objEmail,mes2,mes1,mes,x
    mes2 = TargetEvent.TargetInstance.message
    mes1 = cstr(mes2)
    for x = 1 to len(mes1)
    mes = mid(mes1,1,x)
    next
    Set objEmail = CreateObject("CDO.Message")
    objEmail.From = "ваш алиас@домен"
    objEmail.To = "ваши почтовые адреса через двоеточие"
    objEmail.Subject = "ваша тема"
    objEmail.Textbody = "Объект:" + vbcrlf + Ucase(mid(mid(mes,1,Instr(1,mes,",") - 1),cstr(InStrRev(mes,"\") + 1),len(mid(mes,1,Instr(1,mes,",") - 1)) - cstr(InStrRev(mes,"\")))) + vbcrlf +"Подключение:" + vbcrlf + mid(mes,Instr(1,mes,".") - 2,(Instr(1,mes," и")) - (Instr(1,mes,".") - 3)) + vbcrlf + "Отключение:" + mid(mid(mes,Instr(1,mes,":"),len(mes) - Instr(1,mes,":")),Instr(1,mid(mes,Instr(1,mes,":"),len(mes) - Instr(1,mes,":")),".") - 3,(Instr(1,mid(mes,Instr(1,mes,":"),len(mes) - Instr(1,mes,":")),". ")) - (Instr(1,mid(mes,Instr(1,mes,":"),len(mes) - Instr(1,mes,":")),".") - 3)) + vbcrlf + "Сообщение от сервера:" + vbcrlf + right(mid(mes,13,len(mes)-13),(len(mes)-13) - InStr(1,mid(mes,13,len(mes)-13),"ь") + 4)
    objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 0
    objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "имя почтового сервера"
    objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
    objEmail.Configuration.Fields.Update
    objEmail.Send
    set objEmail = nothing

     

    Но эта тема все равно интересна, что же я в предидущем примере делал не так?

    14 июня 2011 г. 4:13
  • Могу только предположить, что каким-то образом повлияла более жесткая система безопасности серверной ОС- внешне никаких других предпосылок для проблемы нет. Ради интереса можно попробовать отключить в IE усиленую конфигурацию безопасности и посмотреть, что будет. Выглядит, как полная чушь, но все же...
    Мнения, высказанные здесь, являются отражением моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий
    Follow MSTechnetForum on Twitter

    Посетите Блог Инженеров Доклады на Techdays: http://www.techdays.ru/speaker/Vinokurov_YUrij.html
    16 июня 2011 г. 10:59
    Модератор
  • Отключал усиленную конфигурацию безопасности в IE не помогло.

    20 июня 2011 г. 4:18