1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. nuts

Beiträge von nuts

  • Tastenanschläge Hoch/Runter abfangen (ohne Hotkeyset)

    • nuts
    • 9. Februar 2013 um 14:18

    Hallo zusammen,

    ich habe ein kleines Problem.
    Und zwar möchte ich das mein GUI Fenster mitbekommt sobald die Hoch oder Runter Pfieltaste gedrückt wird.

    Skript:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>
    #include <WinAPI.au3>
    #include <File.au3>
    #include <ButtonConstants.au3>
    #include <Misc.au3>

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

    Global $HA = @DesktopHeight * 3 / 4
    Global $VA = @DesktopWidth / 3

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

    Global $Farbe = 0x00BFFF
    Global $Fokusfarbe = 0x4169E1

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

    global $a_buttons[5]=["1","2","3","4","5"]

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

    #region HauptGUI
    Global $binfo = "1|2|3|4|5" ;Buttonbeschriftung für jeden Button mit | getrennt eingeben -> Anzahl der Beschriftungen bestimmt gleichzeitig die Anzahl der Buttons
    Global $abfinfo = StringSplit($binfo, '|')
    Global $banzahl = $abfinfo[0]
    Global $babstandleft = 50 ;Abstand links und rechts zur HauptGUI
    Global $babstandtop = 10 ;Abstand zwischen den Buttons
    Global $bwidth = $VA - 2 * $babstandleft ;Button Left ausrechnen
    Global $bheight = $HA / $banzahl - $babstandtop * ($banzahl + 1) / $banzahl ;Button Höhe in Abhängigkeit zur Auflösung ausrechnen
    Global $HauptGUI = GUICreate("HTPC", $VA, $HA, -1, -1, BitOR($WS_POPUP, $WS_BORDER, $WS_CLIPSIBLINGS))

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

    ;Buttons erstellen und Button TOP ausrechnen
    For $i = 1 To $banzahl
    Global $Button = GUICtrlCreateButton($abfinfo[$i], $babstandleft, $i * $babstandtop + ($i - 1) * $bheight, $bwidth, $bheight, $BS_BITMAP)
    GUICtrlSetFont(-1, 20)
    GUICtrlSetBkColor(-1, $Farbe)
    Next
    #endregion HauptGUI

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

    Global $last_focus = GUICtrlGetHandle(-1)
    Global $fokusGUI = $HauptGUI
    GUIRegisterMsg($WM_User, "MY_WM_USER")

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

    GUISetState(@SW_SHOW, $HauptGUI)
    WinSetOnTop($HauptGUI, "", 1)

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

    While 1

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

    $msg = GUIGetMsg()
    Switch $msg
    case 5
    _Exit()

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

    EndSwitch
    WEnd

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

    Func _Exit()
    Exit
    endfunc

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

    Func MY_WM_USER($hwnd, $msg, $wParam, $lParam)
    $low_word = BitAND($wParam, 0xFFFF)
    $high_word = BitShift($wParam, 16)
    ConsoleWrite("wparam: "&$low_word & @crlf)
    ConsoleWrite("lparam: "&$high_word & @crlf)
    Setbuttontext()
    _SetBKColor()
    EndFunc ;==>MY_WM_USER

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

    Func _SetBKColor()
    Local $Button = WinGetHandle(_WinAPI_GetFocus())
    GUICtrlSetBkColor(_WinAPI_GetDlgCtrlID($last_focus), $Farbe)
    GUICtrlSetBkColor(_WinAPI_GetDlgCtrlID($Button), $Fokusfarbe)
    $last_focus = $Button
    EndFunc ;==>_SetBKColor

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

    Func Setbuttontext($left=0)
    GUICtrlSetState(5, $GUI_FOCUS)
    _ArrayPush($a_buttons, $a_buttons[0], $left)
    for $i =1 to $banzahl
    GUICtrlSetData($i+2, $a_buttons[$i-1])
    Next
    endfunc

    [/autoit]


    Ich habe ein Array mit sagen wir 100 Namen drin und möchte davon immer 5 Stück verwenden um die Buttons zu benennen (ich denke durch ausführen des Skriptes wird klarer was ich vorhabe).
    Das klappt mit _Arraypush auch einwandfrei.
    Allerdings kann ich nicht erkennen ob jetzt Pfeiltste-Hoch oder Pfeiltaste-Runter gedrückt wurde und so stimmt die Funktion nur in eine Richtung.

    Gibt es dafür eine Lösung ohne Hotkeyset oder _Ispressed?
    WM_User bringt mir leider nicht verwertbares. ?(

    Gruß nuts

  • [Tutorial] Sauber Programmieren

    • nuts
    • 11. Dezember 2012 um 09:35

    Ich sehe das auch etwas anders.

    Mit For ... in kann man eigentlich nur in einem Einzelfall durch ein Array loopen.
    Wüsste nicht wieso man dafür jetzt seinen Stil ändern sollte.

    For ... in verwendet ich daher eigentlich nur bei Objekten.

  • WM_POWERBROADCAST - Verständnisfrage

    • nuts
    • 10. Dezember 2012 um 12:12

    Hm so ganz sicher bin ich leider immernoch nicht wie ich das umsetzen soll :(

    Scheint wohl wirklich so zu sein, dass die erste Benutzeraktion immer ein PBT_APMRESUMESUSPEND auslöst.
    Irgendwie ist das blöd gelöst ...

  • WM_POWERBROADCAST - Verständnisfrage

    • nuts
    • 7. Dezember 2012 um 23:45

    Ich bin nicht ganz sicher wie sich das umsetzen lässt.
    Aus der _MY_WM_POWERBROADCAST Funktion muss ich schnellst möglich wieder raus, da das sonst gern crasht.

    Vielleicht einer Variable in _MY_WM_POWERBROADCAST je nach Event einem spezifischen Wert zuweisen und diese in der Hauptschleife abprüfen?

  • WM_POWERBROADCAST - Verständnisfrage

    • nuts
    • 7. Dezember 2012 um 12:08

    Hey,

    ich untersuche gerade die WM_POWERBROADCAST Nachrichten. Konkret möchte ich unterscheiden ob das Aufwecken durch einen Benutzer oder durch einen automatischen Task bewirkt wurde.

    Hier mein Testskript:

    Spoiler anzeigen
    [autoit]


    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    ;#include <myscripts_constants.au3>
    #include <file.au3>
    #include <date.au3>

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

    Global Const $PBT_APMRESUMESUSPEND = 0x00000007 ;7 (0x7)
    Global Const $PBT_APMPOWERSTATUSCHANGE=0x0000000A ;10 (0xA)
    Global Const $PBT_APMRESUMEAUTOMATIC=0x00000012 ;18 (0x12)
    Global Const $PBT_APMSUSPEND=0x00000004 ;4 (0x4)
    Global Const $PBT_POWERSETTINGCHANGE=0x00008013 ;32787 (0x8013)

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

    Global $title = "WM_POWERBROADCAST_Debug"
    Global $hGUI = GUICreate($title, 500, 500)
    Global $hedit = GUICtrlCreateEdit("", 0, 0, 500, 420)
    GUICtrlSetData(-1, "Startup")
    Global $hsave = GUICtrlCreateButton("Save", 20, 450, 50, 30)
    Global $htest = GUICtrlCreateButton("Test", 120, 450, 50, 30)
    Global $log = @DesktopDir & "\" & $title & ".txt"
    Global $counter = 1

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

    GUIRegisterMsg($WM_POWERBROADCAST, "_MY_WM_POWERBROADCAST")
    GUISetState(@SW_SHOW, $hGUI)

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

    While 1
    $GUIMsg = GUIGetMsg()
    Switch $GUIMsg
    Case $GUI_EVENT_CLOSE
    ExitLoop
    Case $hsave
    _FileWriteLog($log, GUICtrlRead($hedit), 1)
    MsgBox(0, "Speicher", "Log gespeichert")
    EndSwitch
    WEnd

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

    Exit

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

    Func _MY_WM_POWERBROADCAST($hWnd, $Msg, $wParam, $lParam)

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

    GUICtrlSetData($hedit,GUICtrlRead($hedit) &@crlf & $counter & " - hwnd=" & $hWnd)
    GUICtrlSetData($hedit,GUICtrlRead($hedit) &@crlf & $counter & " - msg=" & $Msg)
    GUICtrlSetData($hedit,GUICtrlRead($hedit) &@crlf & $counter & " - lParam" & $lParam)

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

    Switch $wParam
    Case $PBT_APMRESUMESUSPEND
    GUICtrlSetData($hedit,GUICtrlRead($hedit) &@crlf & _NowCalc()& " - " & $counter & " - wParam=PBT_APMRESUMESUSPEND=" & $wParam)
    case $PBT_APMRESUMEAUTOMATIC
    GUICtrlSetData($hedit,GUICtrlRead($hedit) &@crlf & _NowCalc()& " - " & $counter & " - wParam=PBT_APMRESUMEAUTOMATIC=" & $wParam)
    Case $PBT_APMPOWERSTATUSCHANGE
    GUICtrlSetData($hedit,GUICtrlRead($hedit) &@crlf & _NowCalc()& " - " & $counter & " - wParam=PBT_APMPOWERSTATUSCHANGE=" & $wParam)
    case $PBT_APMSUSPEND
    GUICtrlSetData($hedit,GUICtrlRead($hedit) &@crlf & _NowCalc()& " - " & $counter & " - wParam=PBT_APMSUSPEND=" & $wParam)
    Case Else
    GUICtrlSetData($hedit,GUICtrlRead($hedit) &@crlf & _NowCalc()& " - " & $counter & " - wParam" & $wParam)
    EndSwitch

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

    $counter += 1

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

    EndFunc ;==>_MY_WM_POWERBROADCAST

    [/autoit]

    Damit erhalte ich folgende Nachrichten:

    Aufwecken durch eine Benutzeraktion (Tastenanschlag, Doppelclick usw.)

    Zitat


    4 - hwnd=0x01A302E4
    4 - msg=536
    4 - lParam0x00000000
    2012/12/06 21:44:31 - 4 - wParam=PBT_APMSUSPEND=0x00000004
    5 - hwnd=0x01A302E4
    5 - msg=536
    5 - lParam0x00000000
    2012/12/06 21:44:49 - 5 - wParam=PBT_APMRESUMEAUTOMATIC=0x00000012
    6 - hwnd=0x01A302E4
    6 - msg=536
    6 - lParam0x00000000
    2012/12/06 21:44:49 - 6 - wParam=PBT_APMRESUMESUSPEND=0x00000007

    Alles anzeigen


    Dieses Log verstehe ich.
    Zuerst kommt die PBT_APMRESUMEAUTOMATIC Nachricht, die immer abgefeuert wird sobald der PC reaktiviert wird.
    Anschließend kommt die PBT_APMRESUMESUSPEND Nachrichti um zu erkennen, dass der Benutzer die Reaktivierung bewirkt hat.

    Aufwecken durch eine geplante Aufgabe:

    Zitat


    1 - hwnd=0x01A302E4
    1 - msg=536
    1 - lParam0x00000000
    2012/12/06 21:17:46 - 1 - wParam=PBT_APMSUSPEND=0x00000004
    2 - hwnd=0x01A302E4
    2 - msg=536
    2 - lParam0x00000000
    2012/12/06 21:20:08 - 2 - wParam=PBT_APMRESUMEAUTOMATIC=0x00000012
    3 - hwnd=0x01A302E4
    3 - msg=536
    3 - lParam0x00000000
    2012/12/06 21:22:53 - 3 - wParam=PBT_APMRESUMESUSPEND=0x00000007

    Alles anzeigen


    Hier wird trotzdem die PBT_APMRESUMESUSPEND abgesetzt obwohl keine Benutzereingabe erfolgte.
    Die Nachricht kommt 2 Skeunden verspätet an. Ist das aufgrund der ersten Benutzereingabe nach dem Standby?

    Entspricht irgendwie nicht der Beschreibung im msdn: http://msdn.microsoft.com/en-us/library/…v=vs.85%29.aspx
    Oder wie seht ihr das? Ist das bei euch genauso?

    Wie kann ich jetzt zweifelsfrei unterscheiden wie der PC aufgeweckt wurde? ?(

    Gruß nuts

  • Yamaha AVR Netzwerksteuerung / Samsung SOAP - Demo / Denon AVR Netzwerksteuerung

    • nuts
    • 18. November 2012 um 15:16

    Denon Steuerung über telnet:

    Spoiler anzeigen
    [autoit]


    #include <Misc.au3>
    #include <File.au3>

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

    ;;
    ;; Author: nuts (http://www.autoit.de)
    ;;

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

    Global $title = "Denon_Network"
    _Singleton($title)
    Global $version = "0.1"
    Global $konfigdir = @AppDataCommonDir & "\my_scripts\"
    Global $ini = $konfigdir & $title & ".ini"
    Global $log = $konfigdir & $title & ".log"
    If Not FileExists($ini) Then _Createini()

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

    Global $Denon_IP = IniRead($ini, "Settings", "IP", "")
    Global $Denon_Port = IniRead($ini, "Settings", "Port", 23)
    Global $writelog = Int(IniRead($ini, "Settings", "Debug", 1))
    Global $POSTdata = ""
    If $writelog Then _FileWriteLog($log, "Startup - Version: " & $version, 1)

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

    ;Global $testcommand_on="PWON"
    ;Global $testcommand_stanbdy="PWSTANDBY"

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

    If $CmdLine[0] > 0 Then
    If $writelog Then _FileWriteLog($log, "cmdlineRaw: " & $CmdLineRaw, 1)
    $POSTdata = StringReplace($CmdLine[1], "-", "", 1)
    _telnet_send($Denon_IP, $Denon_Port, $POSTdata)
    _Exit()
    EndIf

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

    If $writelog Then _FileWriteLog($log, "cmdlineRaw: " & $CmdLineRaw, 1)
    Exit

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

    Func _telnet_send($IP, $Port, $data)

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

    Local $response, $socket

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

    TCPStartup()

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

    $socket = TCPConnect($IP, 23)
    If $socket > 0 Then
    $bytes = TCPSend($socket, $data & @CR)
    If $bytes > 0 Then
    Sleep(100)
    $response = TCPRecv($socket, 512);
    If @error Then
    If $writelog Then _FileWriteLog($log, "np response", 1)
    Return SetError(1, 0, 0)
    Else
    ConsoleWrite($response)
    EndIf
    Else
    If $writelog Then _FileWriteLog($log, "Failed to send data", 1)
    Return SetError(1, 0, 0)
    EndIf
    EndIf

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

    TCPCloseSocket($socket)
    TCPShutdown()

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

    EndFunc ;==>_telnet_send

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

    Func _Exit()
    Local $size = FileGetSize($log)
    If $size / 1024 > 1000 Then
    Local $aread
    _FileReadToArray($log, $aread)
    If @error Then
    _FileWriteLog($log, $title & ".log konnte nicht automatisch verkleinert werden", 1)
    Else
    FileDelete($log)
    Local $count = 20
    If $aread[0] < $count Then
    $count = $aread[0]
    _FileWriteLog($log, $title & ".log konnte nicht automatisch verkleinert werden", 1)
    EndIf
    _FileWriteFromArray($log, $aread, 1, $count)
    EndIf
    EndIf
    Exit
    EndFunc ;==>_Exit

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

    Func _Createini()
    If Not FileExists($konfigdir) Then DirCreate($konfigdir)
    IniWrite($ini, "Settings", "IP", "")
    IniWrite($ini, "Settings", "Port", 23)
    IniWrite($ini, "Settings", "Debug", 0)

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

    IniWrite($ini, "Info", "power_standby", "PWSTANDBY")
    IniWrite($ini, "Info", "power_on", "PWON")

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

    _FileWriteLog($log, "Ini wurde nicht gefunden und neu erstellt :" & $ini, 1)
    ShellExecute($ini)
    _Exit()
    EndFunc ;==>_Createini

    [/autoit]
  • Batch in Autoit übersetzen

    • nuts
    • 8. November 2012 um 17:42

    So und jetzt nochmal richtig. :D

    [autoit]


    #include <constants.au3>

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

    Global $path ="C:\Program Files\Pulse-Eight\USB-CEC Adapter\cec-client.exe -s"
    Global $run=run($path, "", @SW_HIDE, $STDIN_CHILD)

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

    StdinWrite($run, "standby 0")
    StdinWrite($run)

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

    Danke nochmal für den Hinweis Shadowigor!

  • Batch in Autoit übersetzen

    • nuts
    • 8. November 2012 um 15:08
    Zitat von Shadowigor

    Wenn meine 2. Variante nicht funktioniert, liegt es vermutlich an deiner Batch-Zeile. Das sollte ihre 1-zu-1 Übersetzung sein. Bekommst du einen Fehler? Liegt die exe vielleicht in einem anderen Ordner?

    EDIT: Korrektur:

    [autoit]

    Run(@ComSpec & " /c echo standby 0 | cec-client -s")

    [/autoit]


    Leerzeichen vergessen :whistling:

    Danke schön.
    So funktionierts. :thumbup:

    Edit\
    Das mit den Pipes war mir komplett neu.
    Denke jetzt ist es auch klar was da passiert. :thumbup:

  • Batch in Autoit übersetzen

    • nuts
    • 8. November 2012 um 15:06

    Die Batch funktioniert natürlich.
    Batch, cec-client und autoit Skript liegen im gleichen Ordner.

    Mit Variante 2:

    [autoit]

    Run(@ComSpec & "/c echo standby 0 | cec-client.exe -s")

    [/autoit]


    Wird die Run Funktion auch mit einem Fehler (@error=1) verlassen.

  • Batch in Autoit übersetzen

    • nuts
    • 8. November 2012 um 14:45

    Funktioniert leider alles nicht. :(

    chesstiger : "standby 0" der eigentliche Befehl, den die cec-client.exe ausführen soll.
    Ohne wirds nicht klappen.

  • Threads mit 3 Monaten Inaktivität sperren

    • nuts
    • 8. November 2012 um 14:23

    Völliger Unsinn diese Idee.

    Auch in älteren Threads im H&U Unterforum können noch sinnvolle Posts kommen.
    Rückfragen, Verbesseungen zu der dort geposteten Lösung, Anpassungen an eine neue autoit Version usw.

    Wegen den paar Posts hier am Tag? Wieviele sind in unnötigerweise in alten Threads? Wieviele davon erfordern ein Eingreifen der Moderation?
    1 guter Post in einem alten Thread ist übrigens besser als 5 unnötige, die man eh ignorieren kann ...

  • Batch in Autoit übersetzen

    • nuts
    • 8. November 2012 um 14:13

    Hallo,

    ein etwas peinliches Thema, aber ich steh irgendwie total auf dem Schlauch.

    Ich hab folgende batch Datei:

    Code
    echo standby 0 | cec-client.exe -s

    Und möchte diesen Aufruf in einem autoit Skript direkt verwenden.
    Leider klappt das nicht wie gewünscht.

    cec-client.exe ist ein wrapper um die libcec.dll um Hdmi-cec Befehl vom PC aus zu versenden:
    http://libcec.pulse-eight.com/

    Die Batch-Zeile hab ich hier abgeschrieben: http://forums.pulse-eight.com/yaf_postst617_…mmand-line.aspx
    "standy 0" ist Teil des Befehls und muss irgendwie an den cec-client übergeben werden. Nur ist mir die Syntax nicht klar.

    Vielleicht kann jemand der fit in Sachen batch und cmdline ist kurz drüberschauen?

    Gruß & danke Nuts

  • Geschwindigkeit (AutoIt, Blitz3D(BlitzBasic), FreeBASIC, Java, Python, Lua, Ruby, ActionScript)

    • nuts
    • 26. Oktober 2012 um 18:31

    Die Timerdiff Sachen sollten außerhalb der eigentlichen Schleifen gemacht werden oder?
    Sonst misst man diese Funktionen mit und ob deren Umsetzung vergleichbar ist?

    [autoit]


    $loops=10
    $timer = TimerInit()
    for $a = 1 to $loops
    $i = 0
    while $i <> 100000000
    $i += 10
    WEnd
    Next
    ConsoleWrite(TimerDiff($timer)/$loops&@CRLF)

    [/autoit]
  • WMI - Dienst beenden/neu starten über remote

    • nuts
    • 17. Oktober 2012 um 17:37

    Ich denke du hast recht.
    Nachdem ich mal direkt die IP (vorher den Namen des Server) verwende habe kommt folgende Fehlermeldung:

    Zitat


    2012-10-17 17:49:29 : We intercepted a COM Error !

    err.description is: Benutzeranmeldeinformationen können für lokale Verbindungen nicht verwendet werden.
    err.windescription:
    err.number is: 80020009
    err.lastdllerror is: 0
    err.scriptline is: -1
    err.source is: SWbemLocator
    err.helpfile is:
    err.helpcontext is: 0

    Alles anzeigen

    Werde nur nicht richtig schlau daraus.
    Auf dem Server läuft win2008 server und der Server ist auch der domain controller.
    Was für "Benutzeranmeldeinformationen" werden denn gefordert? :(
    Die Benutzerverwaltung in win2008 server ist leider ziemlich umfangreich und kompliziert.

    Hier noch das Skript:

    Spoiler anzeigen
    [autoit]


    #include <File.au3>
    #include <Misc.au3>

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

    ;Coded by UEZ 2009
    #AutoIt3Wrapper_Change2CUI=y
    #AutoIt3Wrapper_UseUpx=n

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

    $oMyError = ObjEvent("AutoIt.Error", "oMyError")

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

    Global $title="dienstreset"
    Global $log =@ScriptDir & "\" &$title&".log"
    Global $ini=@ScriptDir & "\" &$title&".ini"

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

    _Singleton($title)

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

    if not FileExists($ini) then
    _FileWriteLog($log, "ini nicht gefunden", 1)
    Iniwrite($ini, "Settings", "server", "192.168.111.12")
    Iniwrite($ini, "Settings", "dienst", "DNS-Server")
    endif

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

    Global $ip =Iniread($ini, "Settings", "server", "192.168.111.12")
    Global $dienst=Iniread($ini, "Settings", "dienst", "DNS-Server") ;"DNS-Client"

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

    Global $user="Administrator"
    Global $pass="****"

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

    Global $silent=true

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

    _FileWriteLog($log,"Startup ---- server="& $ip &"----dienst="&$dienst&"----", 1)

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

    If $cmdline[0] > 0 Then
    _FileWriteLog($log, "dienst= " & $dienst, 1)
    if $cmdline[1] <> "msgbox" then
    $dienst = $cmdline[1]
    If StringLeft($dienst, 1) == "-" Then $dienst = StringReplace($dienst, "-", "")
    else
    $silent=False
    endif
    EndIf

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

    If Stop_Service($ip, $dienst, $user, $pass) Then
    if not $silent then MsgBox(0, "Stop Service", "Service " & $dienst & " stopped properly on " & $ip)
    _FileWriteLog($log, "Stop Service: Service " & $dienst & " stopped properly on " & $ip,1)
    Else
    if not $silent then MsgBox(16, "Error", "Stop Service fehlgeschlagen")
    _FileWriteLog($log, "Stop Service - Error", 1)
    EndIf

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

    Sleep(5000)

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

    if Start_Service($ip, $dienst, $user, $pass) then
    if not $silent then MsgBox(0, "Start Service", "Service " & $dienst & " started properly on " & $ip)
    _FileWriteLog($log, "Start Service: Service " & $dienst & " started properly on " & $ip,1)
    Else
    if not $silent then MsgBox(16, "Error", "Start Service fehlgeschlagen")
    _FileWriteLog($log, "Start Service - Error", 1)
    EndIf

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

    _Exit()

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

    Func Stop_Service($srv, $service, $sUsr = "", $sPass = "")
    Local $colItems, $colItem, $ping, $objWMILocator, $objWMIService
    $ping = Ping($srv)
    If $ping Then
    $objWMILocator = ObjCreate("WbemScripting.SWbemLocator")
    If @error Then Return SetError(3, 0, 0)
    $objWMIService = $objWMILocator.ConnectServer($srv, "\root\cimv2", $sUsr, $sPass, "", "", 128)
    If @error Then Return SetError(4, 0, 0)
    $colItems = $objWMIService.ExecQuery("Select * From Win32_Service Where Name='" & $service & "'")
    If IsObj($colItems) Then
    For $objItem In $colItems
    $objItem.StopService()
    Next
    Return 1
    Else
    Return SetError(1, 0, 0)
    EndIf
    EndIf
    Return SetError(2, 0, 0)
    EndFunc

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

    Func Start_Service($srv, $service, $sUsr = "", $sPass = "")
    Local $colItems, $colItem, $ping, $objWMILocator, $objWMIService
    $ping = Ping($srv)
    If $ping Then
    $objWMILocator = ObjCreate("WbemScripting.SWbemLocator")
    If @error Then Return SetError(3, 0, 0)
    $objWMIService = $objWMILocator.ConnectServer($srv, "\root\cimv2", $sUsr, $sPass, "", "", 128)
    If @error Then Return SetError(4, 0, 0)
    $colItems = $objWMIService.ExecQuery("Select * From Win32_Service Where Name='" & $service & "'")
    If IsObj($colItems) Then
    For $objItem In $colItems
    $objItem.StartService()
    Next
    Return 1
    Else
    Return SetError(1, 0, 0)
    EndIf
    EndIf
    Return SetError(2, 0, 0)
    EndFunc

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

    Func oMyError()
    local $error
    $error= "We intercepted a COM Error !" & @CRLF & @CRLF & _
    "err.description is: " & @TAB & $oMyError.Description & @CRLF & _
    "err.windescription:" & @TAB & $oMyError.WinDescription & @CRLF & _
    "err.number is: " & @TAB & Hex($oMyError.Number, 8) & @CRLF & _
    "err.lastdllerror is: " & @TAB & $oMyError.LastDllError & @CRLF & _
    "err.scriptline is: " & @TAB & $oMyError.Scriptline & @CRLF & _
    "err.source is: " & @TAB & $oMyError.Source & @CRLF & _
    "err.helpfile is: " & @TAB & $oMyError.Helpfile & @CRLF & _
    "err.helpcontext is: " & @TAB & $oMyError.HelpContext _

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

    _FileWriteLog($log, $error, 1)
    EndFunc

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

    Func _Exit()
    Local $size = FileGetSize($log)
    If $size / 1024 > 500 Then
    Local $aread
    _FileReadToArray($log, $aread)
    If @error Then
    _FileWriteLog($log, ".log konnte nicht automatisch verkleinert werden", 1)
    Else
    FileDelete($log)
    Local $count = 100
    If $aread[0] < $count Then
    $count = $aread[0]
    _FileWriteLog($log, ".log konnte nicht automatisch verkleinert werden", 1)
    EndIf
    _FileWriteFromArray($log, $aread, 1, $count)
    if @error then _FileWriteLog($log, "_FileWriteFromArray error:"& @error, 1)
    EndIf
    EndIf

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

    _FileWriteLog($log,"Exit ------------------------------------", 1)
    exit
    endfunc

    [/autoit]
  • WMI - Dienst beenden/neu starten über remote

    • nuts
    • 16. Oktober 2012 um 10:40

    Hm das war etwas schlecht ausgedrückt.

    Das Skript funktioniert (User und Pass ist vom Administrator des Servers) vom Client per remote, aber nicht auf dem Server vom Server aus.

    Hintergrund ist folgender: Ich muss den DNS-Server Dienst von Zeit zu Zeit neu starten.
    Ich hab jeden Tag am Server (win2008 server) um 23:50 Uhr eine Aufgabe erstellt und möchte die Möglichkeit haben auch vom Client den Dienst auf dem Server neu zu starten.
    Nun funktionierts vom Client, aber die tägliche Aufgabe wird mir mit oben genanntem Fehler abgebrochen.
    Verwende dein Skript mit unwesentlichen Änderungen.

    DNS funktioniert. User und Pass ist korrekt (sonst würde es vom Client ja auch nicht funktionieren).

  • WMI - Dienst beenden/neu starten über remote

    • nuts
    • 16. Oktober 2012 um 10:07

    Hm da gibt es doch noch ein Problem.

    Die zweite Variante von UEZ funktioniert vom Client, aber nicht vom Server selbst.
    Kann das sein?
    Fehlermeldung:

    Zitat


    2012-10-15 23:50:18 : We intercepted a COM Error !

    err.description is: Zugriff verweigert
    err.windescription: Zugriff verweigert

    err.number is: 80020009
    err.lastdllerror is: 0
    err.scriptline is: -1
    err.source is: SWbemLocator
    err.helpfile is:
    err.helpcontext is: 0

    Alles anzeigen
  • WMI - Dienst beenden/neu starten über remote

    • nuts
    • 12. Oktober 2012 um 14:27

    Das funktioniert einwandfrei - vielen Dank UEZ! :thumbup:

  • Konfigurationsdateien (INI) aktualisieren

    • nuts
    • 11. Oktober 2012 um 18:16

    Ich hab mich mal ein an einer anderen Lösung versucht.

    Grundgedanke ist dabei, dass man seine Grundkonfig Datei in Editor (oder so) weiterschreibt und mit Fileinstall einbindet.
    Das trägt bei großen INI's auch zu mehr Übersicht im eigentlichen Skript bei.
    Im nächsten Schritt wird die per Fileinstall eingebundene INI mit der schon vorhandenen INI verglichen und fehlende Einträge ergänzt.
    Die schon vorhandenen Einträge bleiben unangetastet.

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>

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

    Global $konfig_ini = @AppDataCommonDir & "\updatetest.ini"

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

    If Not FileExists($konfig_ini) Then _Createini()
    _Update_konfig_ini()

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

    ; das eigentliche Skript

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

    exit

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

    Func _Createini()

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

    FileInstall("D:\autoit\DVBViewer\sendcommand_v2\Sendcommand_config.ini", $konfig_ini)

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

    EndFunc

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

    Func _Update_konfig_ini()
    local $tempfile= @TempDir &"\tempkonfig.ini"
    FileInstall("D:\autoit\DVBViewer\sendcommand_v2\Sendcommand_config.ini", $tempfile)

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

    local $index, $a_section ,$a_tempsection
    local $a_names=IniReadSectionNames($konfig_ini)
    local $a_tempnames=IniReadSectionNames($tempfile)

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

    for $i=1 to $a_tempnames[0]
    $index=_ArraySearch($a_names, $a_tempnames[$i])
    if @error then
    $a_tempsection=IniReadSection($tempfile, $a_tempnames[$i])
    if @error then ContinueLoop

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

    IniWriteSection($konfig_ini, $a_tempnames[$i], $a_tempsection)
    else
    $a_tempsection=IniReadSection($tempfile, $a_tempnames[$i])
    if @error then ContinueLoop
    $a_section=IniReadSection($konfig_ini, $a_names[$index])

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

    for $u=1 to $a_tempsection[0][0]
    _ArraySearch($a_section, $a_tempsection[$u][0])
    if @error then IniWrite($konfig_ini, $a_names[$index], $a_tempsection[$u][0], $a_tempsection[$u][1])
    Next
    endif

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

    next

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

    FileDelete($tempfile)

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

    ;ShellExecute($konfig_ini) ;debug

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

    endfunc

    [/autoit]

    Sieht nicht schön aus, funktioniert aber. :)

  • WMI - Dienst beenden/neu starten über remote

    • nuts
    • 6. Oktober 2012 um 00:08

    Danke ich versuchs mal.
    Hat leider nichtmehr vor Feierabend gereicht und daher kann ichs erst nächste Wochen testen.

  • WMI - Dienst beenden/neu starten über remote

    • nuts
    • 5. Oktober 2012 um 15:16

    Hm ich wüsste aber schon gern wie es über WMI funktioniert. :)

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™