Dienstag, 31. Juli 2012

VBScript: Dienst unter Windows starten/stoppen/neustarten

Das (per VB Skript veranlasste) Beenden des Media Centers beim Standby und das Neustarten nach dem Aufwecken haben sich bislang mit relativ großer Stabilität ond hohem "WAF" bezahlt gemacht.

Nach dem Update auf das aktuelle DVBLink Release 4.5 hatte ich jedoch häufiger mit ominösen Fehlermeldungen beim Live-TV Betrieb zu kämpfen, die sich meist erst duch Neustart des "dvblink_server" Dienstes beheben ließen.

Ich habe daher folgende Routine in VBScript geschrieben, um dies automatisert nach dem Aufwecken des Systems und vor dem Start des Media Centers ablaufen zu lassen:

Sub ServiceControl(sname, purpose, count)
    'sname is the service name
    'purpose is whether or not you want to start, stop or restart a service
    'count is the instance counter of the sub routine. It is increased with
    ' every recursive call from within in the sub routine for the same value
    ' of sname and should be 0 when called from the main program.
    ' When purpose is "stop" and count has reached the level of cntMaxRetries,
    ' the service is terminated/killed.
   
    Dim strComputer : strComputer = "."
    Dim objWMIService
    Dim strQuery
    Dim objMainService, objSubService, objProcess
    Dim colProcesses,colServices
    Dim delay : delay = 1
    Dim errReturn
   
    Const errAccessDenied  =  2
    Const cntMaxRetries    = 10
   
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
   
    Set objMainService = objWMIService.Get("Win32_Service.Name='" & sname & "'")
    strQuery = "Associators of " _
      & "{Win32_Service.Name='" & objMainService.name & "'} Where " _
      & "AssocClass=Win32_DependentService " & _
      "Role=Antecedent"
    Set colServices = objWMIService.ExecQuery(strQuery)
   
    Select Case purpose
       
        Case "stop", "restart"
       
        For Each objSubService In colServices
            ServiceControl objSubService.name, "stop", count
        Next
       
        If objMainService.state = "Running" Then
            errReturn = objMainService.StopService()    
            If errReturn = errAccessDenied Then
                'You do not have sufficient privileges to start/stop services. Abort. 
                WScript.Quit
            End If
        End If
       
        If Not objMainService.state = "Stopped" And count < cntMaxRetries Then
            WScript.Sleep delay*1000
            ServiceControl sname, "stop", count+1
        Else
            If objMainService.started Then
                Set colProcesses = objWMIService.ExecQuery("Select * from Win32_Process")
                For Each objProcess In colProcesses
                    If objProcess.ProcessID = objMainService.ProcessID Then
                        objProcess.terminate()
                    End If
                Next
                Set colProcesses = Nothing
                WScript.Sleep delay*1000
            End If
           
            If objMainService.started Then
                wshShell.Run "taskkill /f /pid " & objMainService.ProcessiD & " /t", 0, True
            End If
        End If
       
        If purpose = "restart" Then
            ServiceControl sname, "start", count
        End If
       
        Case "start"    
       
        If objMainService.state = "Stopped" Then
            errReturn = objMainService.StartService()
            If errReturn = errAccessDenied Then
                'You do not have sufficient privileges to start/stop services. Abort.
                WScript.Quit
            End If
        End If
       
        If Not objMainService.state = "Running" Then
            WScript.Sleep delay*1000
            ServiceControl sname," start", count +1
        End If
       
        For Each objSubService In colServices
            ServiceControl objSubService.name, "start", count
        Next
       
    End Select
   
    Set colServices = Nothing
   
End Sub 'ServiceControl       
Mittels der Routine "ServiceControl" kann ein Dienst, dessen Name bekannt ist, gestoppt, gestartet oder neugestartet werden.  Die Namen der Dienste lassen sich z.B. mit dem Befehl "sc query | find 'NAME'" per cmd ermitteln (Wichtig ist der Inhalt von SERVICE_NAME, nicht DISPLAY_NAME).

Die Routine arbeitet rekursiv und zählt dabei die Anzahl der Durchläufe. Wird eine bestimmte Anzahl an Rekursionsdurchläufen erreicht, wird versucht, den Dienst auf "brachialere" Art, d.h. mittels "Prozess.terminate()"oder "taskkill /F" zu beenden, Die Dauer der Verzögerungen zwischen den Durchläufen ist über den Wert "delay" in Sekunden einstellbar.

Die Routine läßt sich leicht in das vorhandene Skript einbinden, ist aber evtl. auch für andere Zwecke zu gebrauchen. Leider ist bei Windows 7 die Benutzerkontensteuerung (UAC) im Weg und verhindert, dass ein VB Skript ohne administrative Rechte einen Dienst starten oder stoppen kann. Ich habe auch noch keinen Weg gefunden, ein Skript automatisiert mit admin-Rechten zu starten, weshalb ich empfehle, die Benutzerkontensteuerung über "msconfig" (unter "Tools") komplett zu deaktivieren. 

Viel Spaß beim Skripten...

Freitag, 23. Dezember 2011

Make me One with Everything...

... sagte der New Yorker am Hotdog-Stand ;) Aber im Ernst, ist schon eine runde Sache, wenn viele Einzelkomponenten schließlich zu etwas größerem Verschmelzen: dem "Netzwerk".

Nach dem HTPC für's  Home-Entertainment,der DVD-Player, SAT-Receiver und Videorecorder in sich vereiningt, kam schnell der Homeserver dazu, um die sich vermehrenden Datenmassen zu beherbergen.

Nun folgen ipad, iphone, Laptop und Co. die auf die gesammelten Daten mobil, im Haus wie auch auf Reisen, zugreifen wollen.

Quelle: http://www.devolo.de
Für die Vernetzung intern per wired und wireles LAN leistet die Fritz!Box gute Dieste. Dort wo WLAN oder Datendose nicht verfügbar sind, kommen zusätzlich devolo dLAN Ethernet-over-Power Adpater zum Einsatz, die das Stromnetz ruck-zuck zum LAN verwandeln.
Quelle: http://www.devolo.de








Nach außen hin, lassen sich mittels DynDNS und Port Forwarding auf der Fritz!Box die Daten auch über's Internet mobil abrufen.

Quelle: http://www.apple.com
Ein apple TV der 2. Generation, mit installiertem XBMC, greift aus dem Keller auf die TV-Aufzeichnungen, Vieos und Bilder auf dem WHS zu bzw. mittels UPNP auf die Streams vom HTPC.

Als Sttreaming-Lösung, um Live-TV und TV-Aufzeichnungen vom HTPC auf die verschiedensten Endgeräte zu bringen nutze ich, sehr zufrieden, DVBLink TVSource und Connect!Server;.mittlerweile in Version 4.1 mit Apps für iPhone und iPad.

DVBLink erlaubt u.a. das Streamen per UPNP und auf  DLNA fähige Endgeräte (TV). Der DVBLink Network Client stellt auf einem PC mit Windows Media Center virtuelle TV Tuner bereit, die den Empfang von Live TV über den DVBLink Connect!Server ermöglichen, ohne dass dazhu noch lokale TV-Tunerkarten benötigt werden.

Systemübersicht (Gesamtkonzept)



Samstag, 18. Juni 2011

Das Bessere ist der Feind des Guten!

Nachdem die Preise für Full-HD LCD/LED Monitore kräftig gepurzelt sind, war schnell klar: Ein Neuer muss her! Die Wahl fiel rasch, unter Berücksichtigung bekannter optischer Randbedingungen, auf den Philips 40 PFL7605 H12 102 cm LCD Edge-Lit LED Monitor mit folgenden Merkmalen:
  • Full HD (1920 x 1080p),
  • Ambilight Spectra 2,
  • 100 Hz,
  • DVB-T/-C
  • DLNA Media Browser/Net TV Dienste/USB Media-Browser
  • Anschlüsse: 4 x HDMI, 2 x Scart, 1 x VGA, 1 x Y Pb Pr / Audio L R,  Audio-In/Out, Digital Audio-Out (Cinch), 1 x USB, 21 x Ethernet, WiFi (Optional)
Quelle: www.philips.de
Mittels der seitlich angebrachten Ambilight LED-Reihe wird der Hintergrund sanft in den Farben des aktuellen Fernsehbildes ausgeleuchtet. Die Farben sind kräftig und kontrastreich, lediglich bei einem flachem Betrachtungswinkel von der Seite wirkt das Bild etwas blass. Das Bild des HTPC wird (via HDMI) bei 1080p pixelgenau und bildschirmfüllend widergegeben (kein Over- oder Underscan).

Mit einem Full-HD Monitor macht das Schauen von Blu-Ray natürlich noch deutlich mehr Spass. Damit auch die Akustik und der Bedienkomfort nicht zu kurz kommt, musste ich PowerDVD durch ArcSoft TotalMedia Theatre 5 ersetzen, da PDVD9 nicht mit meinem Audio Setup und dem IDT Audio-Treiber klar kam
 

Dienstag, 7. Juni 2011

Room for improvements...

Nachdem ich häufiger feststellen musste, dass der PC nach dem Aufwachen aus dem Standby nicht - wie erwartet - die frisch aufgestartete Media Center präsentierte, sondern lediglich den leeren Desktop, begab ich mich auf die Suche nach der Ursache. Entweder "vergaß" das Skript sich zu merken, ob beim Übergang in den Standby MC aktiv war, oder ein anderes Ereignis führte zum temporären Aufwachen des PCs ohne MC zu starten und überschrieb beim Wiedereinschlafen den Merker.
Ich ergäntze daher das Skript um eine Log-Funktion, die die Power Management Ereignisse protokollierte und fand heraus, dass tatsächlich gelegentlich ein "Automatic Resume from Standby" auftrat, der im Skript nicht abgefangen wurde (und somit nicht zu einem Neustart von MC führte) und was dazu führte, dass der Merker, ob MC vor dem Standby aktiv war, beim timergesteuerten Wiedereinschalten des PC auf Null gesetzt wurde.

Die neue Version des Skripts unterscheidet nun das automatischen und manuelle Aufwecken des PCs und setzt entsprechend den Merker nur für den zweiten Fall. Außerdem habe ich das Skript so angepasst, dass Sprachausgaben über Stringvariablen "lokalisiert" werden können und das Program ehshell.exe kann prinzipiell gegen jedes beliebige andere Programm durch Setzen der programmspezifischen Parameter ausgetauscht werden, so dass das Skript ggf. einen universelleren Einsatz findet.

Das Skript wird bei mir aus dem Autostart Ordner aufgerufen. Durch Übergabe des Parameters "-L" wird die Logging-Funktion aktiviert. Die Log-Datei liegt im Skript-Verzeichnis und wird bei jedem Neustart überschrieben.


Skript StdbyMon.vbs:

Option Explicit

'Power Management Events
Const cntPMEventEnteringSuspend = 4
Const cntPMEventResumefromSuspend = 7
Const cntPMEventPowerStatusChange = 10
Const cntPMEventOEMEvent = 11
Const cntPMEventResumeAutomatic = 18

Dim wmiPowerManagementEvent
Dim objProcess, colProcesses
Dim objShell, wshShell, objArgs
Dim objFSO, objLogFile

Dim intEventType
Dim intLastResumeEvent : intLastResumeEvent = 0

Dim boolProgRestartOnResume : boolProgRestartOnResume = False
Dim boolProgAutostart : boolProgAutostart = False

'Logging
Dim boolLogging : boolLogging = False

Dim strRegKey, strLogFilename, strMSG
Dim strComputer : strComputer = "."

'Localization
Dim strVBSRunning : strVBSRunning = " Another instance of the script is running!"
Dim strErrProcess : strErrProcess = " Processing error! Error no. "
Dim strErrInitial : strErrInitial = " Initialization error! Error no. "
Dim strEventUnspec : strEventUnspec = " Unspecified power management event: "
Dim strEventResAuto : strEventResAuto = " Power management event: ResumeAutomatic"
Dim strEventResSusp : strEventResSusp = " Power management event: ResumeFromSuspend"
Dim strEventEntSusp : strEventEntSusp = " Power management event: EnteringSuspend"
Dim strTermProg : strTermProg = " Terminating process: "
Dim strRestartProg : strRestartProg = " Restarting process: "
Dim strScriptStarted : strScriptStarted = " Script started"

'Program Specific Data
Dim strWinRunName : strWinRunName = "Windows Media Center"
Dim strProgFolder : strProgFolder = "\ehome"
'Dim strProgHomeDir : strProgHomeDir = "%ProgramFiles%"
Dim strProgHomeDir : strProgHomeDir = "%WINDIR%"
Dim strProgName : strProgName = "ehshell.exe"

On Error Resume Next

If CountRunningVBS( WScript.ScriptFullName ) > 1 Then
    MsgBox strVBSRunning, , WScript.ScriptName
    WScript.Quit
End If

Set objArgs = WScript.Arguments

If objArgs.Count > 0 Then
    If LCase(objArgs(0)) = "-l" Then
        boolLogging = True
    End If
End If

Set wshShell = CreateObject ("WScript.Shell")

'Check registry if program is started with windows
'strRegKey = "HKCU\Software\Microsoft\Windows\CurrentVersion\Run\" & strWinRunName
'wshShell.RegRead(strRegKey)

'If Err = 0 Then
'    boolProgAutostart = True
'End If

'Err.Clear


strLogFilename = Left(WScript.ScriptName, Len(WScript.ScriptName)-4) & ".log"

If boolLogging = True Then
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objLogFile = objFSO.CreateTextFile(strLogFilename, True)

    strMSG = Now() & strScriptStarted & vbCrLf
    objLogFile.Write strMSG
End If

strProgFolder = wshShell.ExpandEnvironmentStrings(strProgHomeDir) & strProgFolder

Set wmiPowerManagementEvent = GetObject("winmgmts:").ExecNotificationQuery("Select * from Win32_PowerManagementEvent")

If Err = 0 Then
    Do
        intEventType = wmiPowerManagementEvent.NextEvent.EventType

        Select Case intEventType

        Case cntPMEventResumeAutomatic

            strMSG = Now() & strEventResAuto & vbCrLf
            intLastResumeEvent = cntPMEventResumeAutomatic

        Case cntPMEventResumefromSuspend

            strMSG = Now() & strEventResSusp & vbCrLf
            intLastResumeEvent = cntPMEventResumefromSuspend

            If boolProgRestartOnResume = True Then
                strMSG = strMSG & Now() & strRestartProg & strProgName & vbCrLf
                WScript.Sleep 3000
                Set objShell = CreateObject("Shell.Application")
                objShell.ShellExecute strProgName, "", strProgFolder, "open", 10
            End If

            Set objShell = Nothing

        Case cntPMEventEnteringSuspend

            strMSG = Now() & strEventEntSusp & vbCrLf

            Set colProcesses = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2").ExecQuery("select * from Win32_Process where name='" & strProgName & "'")

            If colProcesses.Count > 0 Then
                strMSG = strMSG & Now() & strTermProg & strProgName & vbCrLf
                boolProgRestartOnResume = True
            End If

            If colProcesses.Count = 0 And intLastResumeEvent = cntPMEventResumefromSuspend Then
                boolProgRestartOnResume = False
            End If

            For Each objProcess in colProcesses
                objProcess.Terminate(0)
            Next

            Set colProcesses = Nothing

        Case Else

            strMSG = Now() & strEventUnspec & intEventType & vbCrLf

        End Select

        If boolLogging = True Then
            objLogFile.Write strMSG
        End If

        If Err <> 0 Then
            Wscript.Echo Now() & strErrProcess & Err & "(" & Err.Description & ")"
            Err.Clear
        End If
    Loop
Else
    Wscript.Echo Now() & strErrInitial & Err & "(" & Err.Description & ")"
End If

If boolLogging = True Then
    objLogFile.Close
End If


Function CountRunningVBS( VBScripts )
    'On Error Resume Next

    CountRunningVBS = 0

    Const wbemFlagReturnImmediately = &h10
    Const wbemFlagForwardOnly = &h20

    Dim strComputer : strComputer = "."
    Dim colProcesses : Set colProcesses = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2").ExecQuery("SELECT * FROM Win32_Process", "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)
    Dim objProcess

    For Each objProcess In colProcesses
        If InStr( LCase( objProcess.CommandLine), LCase( VBScripts ) ) > 0 Then
            If InStr( LCase( objProcess.CommandLine ), "script.exe" ) > 0 Then
CountRunningVBS = CountRunningVBS + 1
            End If
        End If
    Next

    Set colProcesses = Nothing

End Function



Donnerstag, 16. September 2010

Moneual Moncaso 320 in Deutschland angekommen

Endlich ist mein Traumgehäuse, das Moneual Moncase 320 - wie berichtet -, auch in Deutschland verfügbar. Der Anbeiter PC-Cooling hat es aktuell für 239 EUR im Angebot. Ohne Netzteil, dafür inklusive MCE-Ferbedienung und integriertem IR-Empfänger. Leider, wie erwartet, ein immer noch stolzer Preis. Mal schauen, ob das Sparschwein (irgendwann) fett genug wird, um die Anschaffung in Betracht zu ziehen. Vielleicht fällt der Preis auch noch ein wenig über die nächsten Wochen ... ;)

Only the SKY is the limit....

Zumindest wenn es um den Empfang verschlüsselter, sog. "Mehrwert"-Programm in Deutschland geht, kommt man zur Zeit nicht an SKY, ehemals "Premiere", vorbei. Da in unserer Familie ein reges Interesse an Dokus, insbesondere an solchen über Tiere aus allen Erdezeitaltern, besteht, hatte ich mich entschieden, das Angebot von smartcard24 für 1 Cent auf Amazon zusammen mit einem "SKY Welt" Basispaket zu nutzen. In dem Angebot ist das Alphacrpyt Light CI-Modul zur Aufnahme der S02-Smartcard gleich für "lau" enthalten, was einer Ersparnis von etwa 45 EUR entspricht, die man üblicherweise für das CI-Modul allein berappen muss.

Nach Eingabe meiner Kundendaten und Angabe des SKY-Wunschpakets auf der smartcard24.com Website erhiellt ich Smartcard und CI-Modul nach einigen Tagen zugeschickt. Da meine Frau am selben Abend auf dem Elternabend der Schule war, begab ich mich, nachdem die Kinder im Bett waren, frisch ans Werk. Aufgrund verschiedener Berichte im Forum der mce-Community erwartete ich duchaus die ein oder andere Klippe bei der Einrichtung, die es zu umschiffen galt und daher war das Timing perfekt.

Erstaunlicherweise - und fast schon zu meinem Bedauern - lief dann doch alles ziemlich problemlos; Nachdem ich kurz über die richtige Orientierung von CI-Modul-und Smarcard im CI-Interface des HTPCs nachgrübeln musste (Chipkarte auf der Smartcard, wie Beschriftung des Alphacrypt Light CI-Moduls muss nach oben bzw. weg von der Platine des CI-Interfaces zeigen), war bereist die größte Herausforderung genommen. Die Aktivierung der Smartcard erfolgt durch Angabe der Smartcard-Nummer bei der SKY-Hotline (01805-Nummer)  und es war insgesamt eine Angelegnheit von wenigen Minuten, bis es dann endlich "hell" wurde.

Wie in der Community und von Digital-Devices für den reibungslosen Betrieb empfohlen, aktivierte ich noch den Jugendschutz auf der Smartcard über das CAM-Menü (den einizgen Sender aus dem Paket mit "explizitem" Inhalt hatte ich bereits vorher im Mediacenter-Setup deaktiviert.) Den Rest des Abends verbrachte ich dann damit, die 20 zusätzlichen Sender an die gewünschten Programmplätze zu verschieben und durch das Programangebot zu zappen. Insgesamt also ein eher entspannter Abend ....

Dienstag, 10. August 2010

Wenn ich einmal reich wär ...

... dann würde ich die Anschaffung des neuen HTPC-Gehäuses MonCaso 320 von Moneual zumindest ernsthaft in Erwägung ziehen. Im Anschaffungspreise von voraussichtlich knapp 300 EUR ist das Gehäuse mit VFD und MCE-kompatibler (?) IR-Fernbedienung enthalten.  Ein passendes  ATX-Netzteil muss separat erworben werden. Aktuell (Stand: Anfang August 2010) ist das Gehäuse noch nirgendwo in Deutschland im Handel zu bekommen. Bleibt also Zeit, schon mal mit dem Sparen zu beginnen...

Wie schon das Modell MonCaso 312 des selben Herstellers, welches seit kurzem in Deutschland vefügbar ist, finde ich dieses Gehäuse optisch rundum gelungen:



Quelle: http://www.moneual.com/

Technisch gesehen, kann es im Inneren beim Einbau etwas eng werden. Ein ausfühlicher Bericht zum Gehäuse findet sich u.a. bei Missing Remote (in englischer Sprache).