WMI: Event IP-Change



  • Hallo,

    kennt jmd eine Seite auf der alle MSNdis - Events aufgelistet werden?

    Momentan suche ich nach einem Event, welches auftritt wenn sich die IP-Adresse ändert. Interessant wären auch die Events, die auftreten können im Zusammenhang mit DHCP (Ip etc. erhalten, Release abgelaufen und kann nicht verlängert werden etc.): Gibt es diese Events überhaupt?

    Gruß
    Jakob



  • Bis jetzt hab ich nur folgendes gefunden; allerdings ist das nicht Interrupt-gesteuert sondern ne Polling-Methode, da die Funktion einfach alle 5sec aufgerufen wird...

    SELECT * FROM __InstanceModificationEvent WITHIN 5 WHERE TargetInstance ISA "Win32_NetworkAdapter"
    

    Ich suche eher was ähnliches wie

    MSNdis_StatusMediaConnect
    

    was wirklich nur dann aufgerufen wird, wenn es auch tatsächlich das Event gibt.


  • Mod



  • Martin Richter schrieb:

    Hatte ich Dir den Network List Manager nicht schon als Tipp genannt?
    http://msdn.microsoft.com/en-us/library/aa965303(VS.85).aspx
    http://code.msdn.microsoft.com/NLM/Release/ProjectReleases.aspx?ReleaseId=3010

    bis jetzt noch nicht, werd ihn mir aber gleich mal anschauen



  • Jakob H. schrieb:

    Martin Richter schrieb:

    Hatte ich Dir den Network List Manager nicht schon als Tipp genannt?
    http://msdn.microsoft.com/en-us/library/aa965303(VS.85).aspx
    http://code.msdn.microsoft.com/NLM/Release/ProjectReleases.aspx?ReleaseId=3010

    bis jetzt noch nicht, werd ihn mir aber gleich mal anschauen

    Hab mich glaub vorher etwas ungeschickt ausgedrückt: MSNdis_StatusMediaConnect finde ich sehr brauchbar und funktoiniert auch.

    Allerdings möchte ich auch benachrichtigt werden, wenn sich die IP ändert; und da hab ich bis jetzt nichts vergleichbares zu MSNdis_StatusMediaConnect gefunden.



  • mit

    SELECT * FROM __InstanceModificationEvent WITHIN 5 WHERE TargetInstance ISA "Win32_NetworkAdapter"
    

    wird zwar ein Event ausgeführt, aber ich kann nicht einfach herausfinden, welches Event wirklich statt gefunden hat. Alle Methoden etc. die sich in dieser Klasse Win32_NetworkAdapter befinden, können ein Event bei Modifikation erzeugt haben.

    Genauso wenn ich zwei dieser Aufrufe starte mit unterschiedlichen Klassen, bekomme ich in der Sink Indicate() methode nur heraus dass es sich um ein _InstanceModificationEvent handelt - aber nicht von welcher Klasse?


  • Mod

    Und was ist mit dem Objekt TargetInstance, dass Du geliefert bekommst?
    Was steht da drin?



  • Martin Richter schrieb:

    Und was ist mit dem Objekt TargetInstance, dass Du geliefert bekommst?
    Was steht da drin?

    HRESULT QuerySink::Indicate(long lObjCount, IWbemClassObject **pArray)
    {
    
      for (long i = 0; i < lObjCount; i++)
      {
          IWbemClassObject *pObj = pArray[i];
          HRESULT hr;
          VARIANT vtClass;
    
           hr = pObj->Get(L"__CLASS", 0, &vtClass, NULL, NULL); 
           if (FAILED(hr)) {
    	printf("Failed to get __CLASS from event.\n");
    	break;
           }
    
           _variant_t         vTarget;
           hr = pObj->Get(L"TargetInstance",0,&vTarget,NULL,NULL);
    
           IUnknown          *pIUnknown;
           pIUnknown = (IUnknown *)vTarget;
           IWbemClassObject  *pinstPkgStatus = NULL;
    
           hr = pIUnknown->QueryInterface(IID_IWbemClassObject, (void **)&pinstPkgStatus);
           pIUnknown->Release();
      }   
    
    }
    

    Aber wie bekomm ich jetzt genau heraus was aus der Win32_NetworkAdapter Klasse (pinstPkgStatus) zu diesem Event geführt hat?



  • hab mal versucht ein paar Sachen auszulesen, aber außer Caption funktioniert gar nichts (bzw. ist kein Schlüsselwort vorhanden)....

    hr = pinstPkgStatus->Get(L"Caption", 0, &vPackageID, NULL, NULL);
    
    		hr = pinstPkgStatus->Get(L"ExecutablePath", 0, &vPackageID, NULL, NULL);
    		hr = pinstPkgStatus->Get(L"InstanceName", 0, &vPackageID, NULL, NULL);
    		hr = pinstPkgStatus->Get(L"EventCode", 0, &vPackageID, NULL, NULL);
    
    		hr = pinstPkgStatus->Get(L"EventIdentifier", 0, &vPackageID, NULL, NULL);
    		hr = pinstPkgStatus->Get(L"InsertionStrings", 0, &vPackageID, NULL, NULL);
    		hr = pinstPkgStatus->Get(L"Logfile", 0, &vPackageID, NULL, NULL);
    		hr = pinstPkgStatus->Get(L"RecordNumber", 0, &vPackageID, NULL, NULL);
    		hr = pinstPkgStatus->Get(L"SourceName", 0, &vPackageID, NULL, NULL);
    		hr = pinstPkgStatus->Get(L"TimeGenerated", 0, &vPackageID, NULL, NULL);
    		hr = pinstPkgStatus->Get(L"TimeWritten", 0, &vPackageID, NULL, NULL);
    		hr = pinstPkgStatus->Get(L"Type", 0, &vPackageID, NULL, NULL);
    


  • noch einmal kurz erklärt was ich überhaupt erreichen möchte:

    a) wenn sich die IP-Addr ändert, möchte ich eine Nofify haben, in der drinnen steht, IPAdresse hat sich geändert mit der neuen IP

    b) wenn sich der Connection-Zustand (disconnected/connected) ändert, möchte ich eine Notify bekommen, in der genau nur diese Information enthalten ist

    etc......

    SELECT * FROM __InstanceModificationEvent WITHIN 5 WHERE TargetInstance ISA "Win32_NetworkAdapter"
    

    Hier ist es bis jetzt so, dass ich eine ganze Klasse einfach als Notify bekomme in der sich etwas geändert hat...

    Was mir auch nicht so gut gefällt ist, dass die IP, Subnetmask etc. einfach auf 0.0.0.0 bzw Leerstring gesetzt wird, wenn keine Netzerkverbindung vorhanden ist.


  • Mod

    Wenn Du erfolgreich ein IWbemClassObject hast dann kannst Du dieses doch mit den entsprechenden Methoden auswerten:
    http://msdn.microsoft.com/en-us/library/aa391433(VS.85).aspx

    Ink.. kannst Du alle Properties selbst enumerieren.



  • Martin Richter schrieb:

    Wenn Du erfolgreich ein IWbemClassObject hast dann kannst Du dieses doch mit den entsprechenden Methoden auswerten:
    http://msdn.microsoft.com/en-us/library/aa391433(VS.85).aspx

    Ink.. kannst Du alle Properties selbst enumerieren.

    Vom Prinzip her schon, nur ist das nicht unbedingt das was ich von einem Event / Interrupt erwarte. Ich verstehe auch nicht, warum es ein paar "schöne" Events gibt und den Rest hat man sich gesparrt.... z.B. MSNdis_StatusMediaConnect (hier weiß ich genau, was Sache ist und brauch nur eine entsprechende Message an die jeweilige Klasse senden. Diese Klasse muss keine Ahnung haben was WMI ist etc...)

    Im obigen Fall, muss ich die Auswertung entweder in einer anderen Klasse / Thread durchführen, die auch die Informationen beinhaltet was sich dann geändert hat oder ich muss alle Items aus der IWbemClassObject Klasse per Message an die entsprechende Klasse senden (die weiß, welche IP bis jetzt z.B. aktiv war)....



  • gibt es noch eine Möglichkeit, dass man herausbekommt um welche Methode es sich genau handelt??

    BSTR bsText2;
    bsText2 = SysAllocString(L"");
    hr = pinstPkgStatus->GetObjectText(0, &bsText2);
    

    Das liefert mir ja nur den kompletten Inhalt einer solchen Methode (wie z.B. Win32_NetworkAdapterConfiguration). Zu Beginn steht "instance of Win32_NetworkAdapterConfiguration" -> kann man mit einer GET-Abfrage den Methodennamen bekommen (Win32_NetworkAdapterConfiguration)?

    Gruß
    Jakob



  • kann man auch noch genauer nach expliziet einem Wert nachfragen von so einer Klasse?

    SELECT * FROM __InstanceModificationEvent WITHIN 5 WHERE TargetInstance ISA "Win32_NetworkAdapterConfiguration.RenewDHCPLeaseAll()"
    

    So funktiniert es nicht, aber gibt es einen ähnlichen Weg?



  • jetzt hab ich grad etwas mehr gesehen - im ganzen wird sowohl der alte als auch der neue Zustand in der Indicate() Methode übertragen... das wusste ich bis jetzt nicht...

    instance of __InstanceModificationEvent { PreviousInstance = instance of Win32_NetworkAdapterConfiguration { Caption

    TargetInstance = instance of Win32_NetworkAdapterConfiguration { Caption

    Greif ich dann auf beide so zu:

    hr = pObj->Get(L"TargetInstance",0,&vTarget,NULL,NULL);
    
    hr = pObj->Get(L"PreviousInstance",0,&vTarget,NULL,NULL);
    

Anmelden zum Antworten