EventLog Abfrage verhält sich komisch.

  • Vorgeschichte:
    In unserer Firma gibt es mehere Hundert Aussendienstler die alle mit einem Notebook ausgestattet sind. Wenn die in eine Niederlassung kommen wird das Notebook nicht am LAN neu gestartet sondern nur Kabel rein, aus den Standby wecken und gut. Somit startet kein Logonscript, GPOs werden nicht aktualisiert, Patche werden nicht gezogen und unsere Softwareverteilung greift nicht. Die Leute anweisen den PC am LAN einmal zu rebooten bringt nix.

    Idee:
    Ein Dienst auf den Notebooks, welcher bei EventLogCode 4201 (Netzwerkkabel wurde Angeschlossen) eine Meldung für den User bringt, dass er doch bitte den PC neu startet.

    Das Script (bisher):
    Die Vorlage war ein VBscript...

    [autoit]

    $objWMIService=ObjGet("winmgmts:{impersonationLevel=impersonate, (Security)}!\\" & "." & "\root\cimv2")

    [/autoit][autoit][/autoit][autoit]

    $colMonitoredEvents = $objWMIService.ExecNotificationQuery ("Select * from __instancecreationevent where TargetInstance isa 'Win32_NTLogEvent' and TargetInstance.EventCode = '4201' ")

    [/autoit][autoit][/autoit][autoit]

    Do
    $objLatestEvent = $colMonitoredEvents.NextEvent
    msgbox(1,"","Willkommen im Netz. Bitte starten Sie den Computer neu...")
    Until 1

    [/autoit]

    Das Problem:
    Das Script läuft in diesem Loop und bringt auch artig die Meldung beim passenden Event. Aber danach beendet sich das Script. Aber es sollte doch weiter in dem Loop laufen, oder nicht? Was ist falsch?

    Des weiteren würde ich gerne die Meldung nur bringen, wenn die IP auch zum Firmennetz passt. Das heimische DSL sollte die Meldung nicht bringen.
    Auch sollte die Meldung nicht kommen wenn der letzte Reboot wenigen als 12 Stunden her ist.

    Meine Frage:
    Wer kann mir sagen was an meine Logik falsch ist?
    Und wer kann mir beim realisieren der Abfrage 'Wie lang ist der letzte Reboot her' helfen?

    Danke :D

    2 Mal editiert, zuletzt von mikexmagic (29. Juli 2009 um 13:33)

  • Mh also hab das jetzt mal probiert dein Script, also bei mir passiert da rein garnichts wenn ich Netzwerkkabel anschließe. Ist das echt der komplette Code?

    Das mit der Schleife ist aber klar.

    Musst entweder so machen:

    [autoit]


    $i = 0
    Do
    $objLatestEvent = $colMonitoredEvents.NextEvent
    msgbox(1,"","Willkommen im Netz. Bitte starten Sie den Computer neu...")
    Until $i = 1

    [/autoit]

    oder noch besser so:

    [autoit]

    While 1
    $objLatestEvent = $colMonitoredEvents.NextEvent
    msgbox(1,"","Willkommen im Netz. Bitte starten Sie den Computer neu...")
    Wend

    [/autoit]

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

    2 Mal editiert, zuletzt von chip (29. Juli 2009 um 11:25)

  • Sorry, Mein Fehler...
    Der richtige EventCode ist 4201.
    7036 nehme ich zum Scripttest. Dieser Code zeigt einen Dienststatus an.
    Ist einfacher zu testen einen Dienst neu zu starten als das Netzwerkkabel zu ziehen.

    Probiers nochmal mit 4201

  • Hatte gerade nix zu tuen also hab ich dir das mal mit der Firmenip gemacht:

    Spoiler anzeigen
    [autoit]

    $Gateway="193.196.108.254"

    [/autoit] [autoit][/autoit] [autoit]

    $objWMIService=ObjGet("winmgmts:{impersonationLevel=impersonate, (Security)}!\\" & "." & "\root\cimv2")
    $colMonitoredEvents = $objWMIService.ExecNotificationQuery ("Select * from __instancecreationevent where TargetInstance isa 'Win32_NTLogEvent' and TargetInstance.EventCode = '4201' ")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    $objLatestEvent = $colMonitoredEvents.NextEvent

    [/autoit] [autoit][/autoit] [autoit]

    $objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
    $colNicConfigs = $objWMIService.ExecQuery ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True", "WQL", 48)

    [/autoit] [autoit][/autoit] [autoit]

    For $objNicConfig In $colNicConfigs
    For $strIPSubnet In $objNicConfig.DefaultIPGateway
    $IP = $strIPSubnet
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    If $Gateway = $IP Then
    msgbox(1,"","Willkommen im Netz. Bitte starten Sie den Computer neu...")
    EndIf
    Wend

    [/autoit]

    Einfach bei Gateway euren Standardgateway eintragen.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • chip

    Hey Super. Ich hatte schon experimentiert mit @IPAdress1 und so...

    Das Problem ist, dass unser Aussendiesnt immer mal an anderen Standorten reinschaut. Also auch ein anderes Gateway.
    Wir könnten prüfen auf die ersten 2 IP-Segmente 10.49.

    Hier mal mein Laienhafter Vorschlag

    [autoit]


    $FaNet="10.49."
    $Message=0
    If stringleft(@IPAddress1,6)=$FaNet Then $Message=1
    If stringleft(@IPAddress2,6)=$FaNet Then $Message=1
    If stringleft(@IPAddress3,6)=$FaNet Then $Message=1
    If stringleft(@IPAddress4,6)=$FaNet Then $Message=1

    [/autoit][autoit][/autoit][autoit]

    If $Message=1 Then
    msgbox(1,"","Willkommen im Netz. Bitte starten Sie den Computer neu...")
    endif

    [/autoit][autoit][/autoit][autoit][/autoit]
  • Ich kann mich leider nicht direkt mit dem Problem auseinandersetzen..
    (nur mit dem Code)
    Deinen Letzten Code könnte man noch vereinfachen (sofern du die ersten 2 "IP-Abschnitte" haben willst)
    // Es kann ja mal sein, dass die IP anders ist z.b. 192. ... oder so
    Mein Vorschlag:

    [autoit]

    $Msg=0
    $FaNet="10.49"
    $IPteile1=stringsplit(@IPAddress1,".")
    $IPteile2=stringsplit(@IPAddress2,".")
    $IPteile3=stringsplit(@IPAddress3,".")
    $IPteile4=stringsplit(@IPAddress4,".")
    if $IPteile1[1]&"."&$IPteile1[2]&"."=$FaNet Then
    $Msg=1
    ;...
    endif
    ;Hier wurden der Teil VOR dem ersten Punkt, der Punkt selber und der Teil NACH dem 1. Punkt zur Überprüfung genommen
    ;Damit man bei unterschiedlicher IPlänge das besser anpassen kann (bei konstanter IP ist deine Lösung natürlich auch möglich)
    if $IPteile2[1]&"."&$IPteile2[2]&"."=$FaNet Then
    $Msg=1
    ;...
    endif

    [/autoit][autoit][/autoit][autoit]

    ;...

    [/autoit][autoit][/autoit][autoit]

    if $msg=1 then
    msgbox(0,"","Willkommen!")
    endif

    [/autoit]


    Sollte funzen :P (nicht getestet)

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

  • Mh mich iritiert nur eines, kann bei euch jeder einfach so ins Netz nur in dem er Laptop anschließt? Habt ihr keine Sicherheitsvorkehrungen?

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Mh mich iritiert nur eines, kann bei euch jeder einfach so ins Netz nur in dem er Laptop anschließt? Habt ihr keine Sicherheitsvorkehrungen?

    Erstmal ja. Eine Notebook bekommt dann erstmal ne IP. Und alles was man dann mit der IP machen kann, kann man machen. Aber mehr auch nicht.
    Für alles andere wie Zugriffe auf Server oder so braucht mal natürlich Rechte und müsste auch nicht Mitglied der Domäne sein.

  • So, ich habe dank des Forums nun auch die UpTime des PCs im Script untergebracht.
    Das Script bringt nun eine Meldung wenn der PC ein Firmen-IP bekommt und mehr als 24 Stunden nicht neu gestartet wurde.

    Spoiler anzeigen
    [autoit]

    #Include <Date.au3>
    ;AutoItSetOption('TrayIconHide')

    [/autoit] [autoit][/autoit] [autoit]

    ;Variables
    $CompanyNet="10.49."
    $MaxUpTime=1440 ;Minutes / 24hours

    [/autoit] [autoit][/autoit] [autoit]

    Dim $BootTime, $TDYear, $TDMonth, $TDDay, $TDHour, $TDMinute, $TDSeconds, $DiffCalc, $TimeUnit

    [/autoit] [autoit][/autoit] [autoit]

    ;Read last boot time
    BootTime()
    $Year=StringLeft($BootTime, 4)
    $Month=StringMid($BootTime, 5, 2)
    $Day=StringMid($BootTime, 7, 2)
    $Hour=StringMid($BootTime, 9, 2)
    $Minute=StringMid($BootTime, 11, 2)
    $Seconds=StringMid($BootTime, 13, 2)
    $BootTimeCalc = $Year & "/" & $Month & "/" & $Day & " " & $Hour & ":" & $Minute & ":" & $Seconds

    [/autoit] [autoit][/autoit] [autoit]

    ;Run query
    $objWMIService=ObjGet("winmgmts:{impersonationLevel=impersonate, (Security)}!\\" & "." & "\root\cimv2")
    $colMonitoredEvents = $objWMIService.ExecNotificationQuery ("Select * from __instancecreationevent where TargetInstance isa 'Win32_NTLogEvent' and TargetInstance.EventCode = '4201' ")

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $Message=0

    [/autoit] [autoit][/autoit] [autoit]

    ;Check up time
    $UpTime=GetTimeDifferenz("n")
    $Uptimehours=int($UpTime/60)
    If $UpTime>$MaxUpTime Then
    ;Is new IP from company net?
    If stringleft(@IPAddress1,6)=$CompanyNet Then $Message=1
    If stringleft(@IPAddress2,6)=$CompanyNet Then $Message=1
    If stringleft(@IPAddress3,6)=$CompanyNet Then $Message=1
    If stringleft(@IPAddress4,6)=$CompanyNet Then $Message=1
    Endif

    If $Message=1 Then
    $objLatestEvent = $colMonitoredEvents.NextEvent
    Msgbox(16+8192+262144,"Willkommen im Henry Schein Netz...","Willkommen im Netz..." & @cr & @cr & "Sie haben Ihren Computer seit " & $Uptimehours & " Stunden nicht neu gestartet!" & @CR & "Bitte starten Sie den Computer neu...")
    endif
    Wend

    [/autoit] [autoit][/autoit] [autoit]

    Func BootTime()
    $COMPUTERNAME=EnvGet("COMPUTERNAME")
    Local $ProductCode, $ProductName, $Val
    Local $objItems
    Local $objWMI

    [/autoit] [autoit][/autoit] [autoit]

    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20

    [/autoit] [autoit][/autoit] [autoit]

    $objWMI = ObjGet("winmgmts:\\" & $COMPUTERNAME & "\root\CIMV2")
    $objItems = $objWMI.ExecQuery('Select * from Win32_OperatingSystem', 'WQL', $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    If IsObj($objItems) Then
    For $objItem In $objItems
    $oBootTime = $objItem.LastBootUptime
    Next
    EndIf
    $BootTimeArray=StringSplit($oBootTime,".",1)
    $BootTime=$BootTimeArray[1]
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func GetTimeDifferenz($TimeUnit)
    Dim $DiffCalc
    Return _DateDiff( $timeunit,$BootTimeCalc,_NowCalc())
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    exit

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Jetzt mal kurz zurück zum Ursprungsscript...

    Ich hab ja schon viel gescriptet. In Notes, in VBA, VBS, Acces und so weiter.

    Kann mir trotzdem jemand mal die Arbeitsweise dieses Scriptes erklären?

    [autoit]

    $objWMIService=ObjGet("winmgmts:{impersonationLevel=impersonate, (Security)}!\\" & "." & "\root\cimv2")

    [/autoit][autoit][/autoit][autoit]

    $colMonitoredEvents = $objWMIService.ExecNotificationQuery ("Select * from __instancecreationevent where TargetInstance isa 'Win32_NTLogEvent' and TargetInstance.EventCode = '4201' ")

    [/autoit][autoit][/autoit][autoit]

    While 1
    $objLatestEvent = $colMonitoredEvents.NextEvent
    msgbox(1,"","Willkommen im Netz. Bitte starten Sie den Computer neu...")
    Wend

    [/autoit]

    OK, Als erster erstelle ich ein Object. Was auch immer das für eins ist. Irgendwas Windows-Internes. Ich schätze mal das EventLog.
    Als nächstes wird ein Abfrage auf das Object ausgeführt. Auch noch OK. Es wird nach Code 4201 gefiltet. OK. Das Ergebnis müsste doch jetzt ALLE 4201-Ereignisse aus dem Log enthalten, oder?

    Jetzt blicke ich dann die Logik des Rests nicht mehr....

    Kann mir das jemand irgendwie erleutern?

    Danke ?(

  • Jetzt mal kurz zurück zum Ursprungsscript...

    Ich hab ja schon viel gescriptet. In Notes, in VBA, VBS, Acces und so weiter.
    Kann mir trotzdem jemand mal die Arbeitsweise dieses Scriptes erklären?

    [autoit]

    $objWMIService=ObjGet("winmgmts:{impersonationLevel=impersonate, (Security)}!\\" & "." & "\root\cimv2")

    [/autoit][autoit][/autoit][autoit]

    $colMonitoredEvents = $objWMIService.ExecNotificationQuery ("Select * from __instancecreationevent where TargetInstance isa 'Win32_NTLogEvent' and TargetInstance.EventCode = '4201' ")

    [/autoit][autoit][/autoit][autoit]

    Do
    ConsoleWrite ($colMonitoredEvents.TargetInstance.EventCode)
    $objLatestEvent = $colMonitoredEvents.NextEvent
    ConsoleWrite ("Willkommen im Netz. Bitte starten Sie den Computer neu...")
    Until 1

    [/autoit]

    OK, als erstes erstelle ich ein Object. Was auch immer das für eins ist. Irgendwas Windows-Internes. Ich schätze mal das EventLog.
    Als nächstes wird eine Abfrage auf das Object ausgeführt. Auch noch OK. Es wird nach Code 4201 gefiltet. OK. Das Ergebnis müsste doch jetzt ALLE 4201-Ereignisse aus dem Log enthalten, oder?

    Jetzt blicke ich dann die Logik des Rests nicht mehr....
    Kann mir das jemand irgendwie erleutern?
    Danke ?(

    2 Mal editiert, zuletzt von mikexmagic (5. August 2009 um 08:28)