Probleme mit RunAs und Nagios-Check

  • Hallo zusammen,

    erst einmal ein "Hallo" in die Runde. Ist ja mein erstes Posting hier.
    Ich bin auf AutoIT gekommen, da ich bei uns im Unternehmen für das Theme Monitoring zuständig bin und mich aktuell mit dem Thema End2End-Monitoring mit Nagios beschäftige. Ich habe über die Suche schon herausgefunden, dass ich da nicht der Einzige bin und ich habe mit Hilfe diverser Einträge hier im Forum auch schon die meisten Hürden überwunden. Doch aktuell komme ich nicht weiter.
    Die Ausführung des beigefügten Scripts wird alle drei Minuten von unserem Nagios-System mit Hilfe des NSClients++ initiiert. Auf dem ausführenden System ist ein Windows Server 2008 Standard x86 installiert. Der NSClient läuft unter dem SYSTEM-Account und darf mit dem Desktop interagieren. Das AutoIT-Script wird daher auch unter dem SYSTEM-Account ausgeführt. Innerhalb des Scripts wird dann die Applikation mit der "RunAs"-Funktion aufgerufen und unter einem Domänen-Benutzer gestartet. Jetzt das Problem: Das Script läuft einwandfrei für ca. 1,5-2 Stunden. Danach wird zwar das Hauptscript immer noch ordnungsgemäß ausgeführt, der RunAs-Aufruf scheitert jedoch --> Die Anwendung wird nicht gestartet. Erst nach einem Reboot des Servers funktioniert der Aufruf wieder für den o.g. Zeitraum. Ein Restart des NSClient++-Dienst bringt nichts. Der Rückgabewert der RunAs-Funktion und @ERROR ist 0. Was noch interessant ist: Wenn ich das Script interaktiv(nicht über den Dienst) starte, läuft's einwandfrei.
    Hat da jemand ne Idee, was das Problem sein könnte? Habe schon diverse Dinge wie Bildschirmschoner, GPO, Kerberos-Einstallungen etc. geprüft, jedoch ohne Ergebnis.
    Danke bereits im Voraus für eure Hilfe.

    Tyler

    Spoiler anzeigen
    [autoit]


    #cs
    Calc-Check 0.1 - Prüft, wie lange die Berechnung und der Aufruf des Tachenrechners dauert und gibt die Rückwerte an Nagios"
    #ce
    #include <WinExpected.au3>
    $g_szVersion = "Calc-Check 0.1"
    $username="MEINUSER"
    $warn= $CmdLine[1]
    $crit= $CmdLine[2]
    $timeline = TimerInit()
    ; Prüfen, ob schon ein Calc-Check-Prozess läuft
    If WinExists($g_szVersion) Then
    ConsoleWrite("UNKNOWN: " & $g_szVersion & " laeuft bereits! Beenden...")
    Exit(3)
    EndIf
    ; Prüfen, ob schon ein Calc-Prozess läuft
    If ProcessExists("calc.exe") Then
    ConsoleWrite("UNKNOWN: Check laeuft bereits! Beenden...")
    Exit(3)
    EndIf
    $ergebnis= RunAs($username, "MEINEDOMÄNE", "MEINPASSWORT", 1, "C:\windows\system32\calc.exe")
    WinActivate("Rechner")
    If (_WinExpected("Rechner", "", 5) <> 1) Then
    If ProcessExists("calc.exe") Then
    $list = ProcessList("calc.exe")
    for $i = 1 to $list[0][0]
    ProcessClose($list[$i][1])
    next
    ConsoleWrite("UNKNOWN: Fenster Calc erscheint nicht! Beende Prozesse! Beenden...")
    Exit(3)
    Else
    ConsoleWrite("UNKNOWN: Fenster Calc erscheint nicht! Beenden..." & $ergebnis & @error)
    Exit(3)
    EndIf
    EndIf
    Send("!A") ; oeffnet das Menue "Ansicht"
    Sleep(2000)
    Send("W") ; Waehlt "Wissenschaftlich"
    Sleep(2000)
    ControlClick("Calc","","Button48")
    Sleep(2000)
    ControlClick("Calc","","Button60")
    Sleep(2000)
    ControlClick("Calc","","Button47")
    Sleep(2000)
    ControlClick("Calc","","Button65")
    Sleep(2000)
    WinClose("Rechner")
    $dif = TimerDiff($timeline) / 1000
    $resulttmp = StringLeft($dif, 4)
    $result = Number($resulttmp)
    Select
    Case $result = 0
    ConsoleWrite("UNKNOWN: Check dauerte " & $result & " Sekunden|Time=" & $result & ";" & $warn & ";" & $crit)
    Exit(3)
    Case $result < $warn
    ConsoleWrite("OK: Check dauerte " & $result & " Sekunden|Time=" & $result & ";" & $warn & ";" & $crit)
    Exit(0)
    Case $result < $crit
    ConsoleWrite("WARNING: Check dauerte " & $result & " Sekunden|Time=" & $result & ";" & $warn & ";" & $crit)
    Exit(1)
    Case $result >= $crit
    ConsoleWrite("CRITICAL: Check dauerte " & $result & " Sekunden|Time=" & $result & ";" & $warn & ";" & $crit)
    Exit(2)
    Case Else
    Exit(3)
    EndSelect

    [/autoit]
  • Was macht denn die Funktion _winexpected ? Scheint ja kein Standard Include zu sein. Vielleicht mal noch mit anhängen oder kurz erläutern was genau geprüft wird und was die Parameter im Detail bedeuten.

  • benötigt das Script eine Gui, dann würde die auf ner anderen Session/Konsole laufen,
    wenn man dann zu der Anwendng wechselt wird der Bildschirm abgedunkelt/ausgegraut.
    Denn Efekt konnte ich jedenfalls mit Win7 und einem alten Script vm workstation als Dienst feststellen.
    Win2k8 wird sich da genau so verhalten.

    Gruß Dietmar

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

  • Danke euch beiden für die schnelle Antwort.

    misterspeed: Das ist einfach nur ein WinWaitActive ausgelagert. Wenn ich am Montag wieder an den Code komme, häng ich den noch hier an.

    Dietmar:

    Zitat

    benötigt das Script eine Gui

    Woher weiß ich das? Da der Taschenrechner gestartet wird und ich Fenster abfrage, wahrscheinlich schon!? Sorry, bin blutiger Anfänger.

    Zitat

    wenn man dann zu der Anwendng wechselt wird der Bildschirm abgedunkelt/ausgegraut.

    Was heißt das konkret für mein Problem? Merkwürdig ist ja, dass es eine ganze Zeit funktioniert, wie erwartet. Btw: Unter Windows XP habe ich das ganze gar nicht zum laufen bekommen, da dort anscheinend keine GUI-Funktionen ausgeführt werden können, so lange kein Benutzer angemeldet ist.

  • Doch es geht wenn man den Haken bei Dienste setzt "Datenaustausch zwischen Desktop und Dienst zulassen", bei Win7/2k8 hat man dann das beschriebene Verhalten, wenn der Haken gesetzt wird.

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

  • @ Dietmar: Ja, es geht, wenn man das komplette Script unter dem Systemuser ausführen lässt. Mein Problem ist jedoch, dass ich innerhalb des Hauptscripts ja noch den RunAs mache und dies schlägt und WinXP/2003 fehl.

    @ All: Hat sonst noch jemand eine Idee? Ich bin leider schon etwas verzweifelt, da ich keine Ideen mehr habe. Was mir noch aufgefallen ist: Ab Windows Server 2008/Vista gibt es einen Dienst namens "Erkennung interaktiver Dienste" der bei Ausführung des RunAs ein zusätzlichs Fenster bringt, welches wahrscheinlich zu Problemen führt. Aber auch ein Deaktivieren des Dienstes hat zu keiner Verbesserung der Situation geführt. Ich versteh einfach nicht, was nach ca. 1:35 Stunde passiert, was zum Abbruch führt.