Gewünschte Funktion wird nicht ausgeführt

  • Ich fange gerade an, mich mit GUIs zu befassen und habe testweise ein einfaches Script gebastelt, um den internen PC-Laustprecher aus- und einzuschalten.
    Bevor die Frage aufkommt, wieso ausgerechnet das und übr die Registry: ich muss später Registrywerte über ein GUI ändern können, was ich hiermit nun einfach mal versuche.
    Leider wird beim Klick auf eine der beiden Schaltflächen die eine Funktion nicht ausgeführt, während die andere fehlerfrei ihre Arbeit verrichtet, und ich komme leider nicht dahinter, wieso das so ist.

    Vielleicht kann mir jemand von Euch 'nen Tip geben.
    Das Script wir folgt:

    [autoit]


    Local $UserName = "sa_testuser"
    Local $Password = "password"
    Local $ScriptOn = RegWrite("HKEY_CURRENT_USER\Control Panel\Sound","Beep","REG_SZ","yes")
    Local $ScriptOff= RegWrite("HKEY_CURRENT_USER\Control Panel\Sound","Beep","REG_SZ","no")
    Local $workingdir = "\\myserver\Public"

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

    $beepcheck = RegRead("HKEY_CURRENT_USER\Control Panel\Sound\", "Beep")

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

    GUICreate("PC-Lautsprecher umschalten", 350, 100)
    GuiCtrlCreatePic("Speaker.Gif",0,0, 32,33)
    GUICtrlCreateLabel("Was möchten Sie mit dem internen PC-Lautsprecher tun ?", 10, 35)
    $aktivieren = GUICtrlCreateButton("Einschalten", 10, 60, 80)
    $deaktivieren = GUICtrlCreateButton("Ausschalten", 110, 60, 80)
    GUISetState(@SW_SHOW)

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

    While 2
    $msg = GUIGetMsg()

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

    Select
    Case $msg = $aktivieren
    RunAs($UserName, "mydomain",$Password, 0, $ScriptOn, $workingdir)
    If $beepcheck = "yes" Then
    MsgBox(0,"Lautsprecheraktivierung erfolgreich","Der interne Lautsprecher wurde nun eingeschaltet.")
    Else
    MsgBox(0,"Fehler ! Der Lautsprecher ist immer noch aus.","Das Einschalten des Lautsprechers war nicht erfolgreich. Bitte wenden Sie sich an den Support.")
    EndIf
    ExitLoop
    Case $msg = $deaktivieren
    RunAs($UserName, "mydomain",$Password, 0, $ScriptOff, $workingdir)
    If $beepcheck = "no" Then
    MsgBox(0,"Lautsprecherdeaktivierung erfolgreich","Der interne Lautsprecher wurde nun abgeschaltet.")
    Else
    MsgBox(0,"Fehler ! Der Lautsprecher ist immer noch an.","Das Abschalten des Lautsprechers war nicht erfolgreich. Bitte wenden Sie sich an den Support.")
    EndIf
    ExitLoop
    EndSelect
    WEnd

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

    Exit

    [/autoit]

    Klickt man nun auf "Einschalten", erhält man nur die Meldung, dass der Lautsprecher immer noch aus ist und die Umstellung nicht erfolgreich war, während der Klick auf "Abschalten" erfolgreich ist.
    Wieso ?

  • Hi,

    Du liest $beepcheck nur vor der Schleife aus.

    Innerhalb der Schleife überprüfst Du den Wert von $beepcheck vor der Schleife.

    Du musst nach dem Setzen des Regkeys diesen zum auswerten auch wieder neu auslesen. Ebbenfalls solltest Du innerhalb Deiner Schleife ein sleep (50) setzen.

    ;-))

    Stefan

  • Hi Stefan und danke für Deine schnelle Antwort !

    Genau, ich lese den Regkey vor der Schleife aus und schreibe den Inhalt in die Variable "$beepcheck".
    Innerhalb der Schleife überprüfe ich nach dem Ändern des Schlüssels den Wert, indem ich prüfe ob sich der Status von $beepcheck und somit der Wert des Registryschlüssels geändert hat.
    Was muss ich in diesem Fall ändern ? Für die zweite Schaltfläche ("abschalten") funktioniert diese Vorgehensweise ja.

  • Hi,

    in der while Schleife ersetze $beepcheck durch RegRead("HKEY_CURRENT_USER\Control Panel\Sound\", "Beep")


    Anfang Skript: Mit $beepcheck = RegRead ("HKEY_CURRENT_USER\Control Panel\Sound\","Beep") weist Du dieser Variablen den Wert zu, der zu diesem Zeitpunkt dort steht ( z.Bsp. "no"). Wird bei Dir der Fall sein.

    Da Du innerhalb der Schleife die Variable $beepcheck aber nicht neu zuweist, hat $beepcheck innerhalb der Schleife immer den Wert "no".

    ;-))

    Stefan

  • Hallo Niclas,

    1. RunAs erwartet eine ausführbare Datei, die du nie erstellst. Ergebnis "no" ist also Zufall. Wenn du anstelle des RunAs direkt RegWrite verwendest klappt es.
    2. $beepcheck nach dem ändern auslesen dann bekommst du auch das aktuelle Ergebnis (siehe ojo)

    mfg (Auto)Bert

  • Hi!

    Ich glaube das das Runas auch nicht funktionieren kann.
    Diese Funktion ist dazu da externe Programme mit einer anderen Benutzerkennung zu starten.
    Aber du kannst mich ja eines Besseren belehren.
    Wenn dann müsstest du es wie im Spoiler1 machen.

    Wird aber auch nicht gehen da du Current_user ändern willst und das geht mit einem anderen Benutzer schlecht also sollte Spoiler2 gehen.


    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    Local $UserName = "sa_testuser"
    Local $Password = "password"
    Local $ScriptOn = @ScriptDir & "\on.exe"
    Local $ScriptOff = @ScriptDir & "\off.exe"
    Local $workingdir = "\\myserver\Public"

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

    $beepcheck = RegRead("HKEY_CURRENT_USER\Control Panel\Sound\", "Beep")

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

    GUICreate("PC-Lautsprecher umschalten", 350, 100)
    GuiCtrlCreatePic("Speaker.Gif",0,0, 32,33)
    GUICtrlCreateLabel("Was möchten Sie mit dem internen PC-Lautsprecher tun ?", 10, 35)
    $aktivieren = GUICtrlCreateButton("Einschalten", 10, 60, 80)
    $deaktivieren = GUICtrlCreateButton("Ausschalten", 110, 60, 80)
    GUISetState(@SW_SHOW)

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

    While 2
    $msg = GUIGetMsg()

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

    Select
    Case $msg = $aktivieren
    RunAsWait($UserName, "mydomain",$Password, 0, $ScriptOn, $workingdir, @SW_HIDE )
    If RegRead("HKEY_CURRENT_USER\Control Panel\Sound\", "Beep") = "yes" Then
    MsgBox(0,"Lautsprecheraktivierung erfolgreich","Der interne Lautsprecher wurde nun eingeschaltet.")
    Else
    MsgBox(0,"Fehler ! Der Lautsprecher ist immer noch aus.","Das Einschalten des Lautsprechers war nicht erfolgreich. Bitte wenden Sie sich an den Support.")
    EndIf
    ExitLoop
    Case $msg = $deaktivieren
    RunAsWait($UserName, "mydomain",$Password, 0, $ScriptOff, $workingdir, @SW_HIDE )
    If RegRead("HKEY_CURRENT_USER\Control Panel\Sound\", "Beep") = "no" Then
    MsgBox(0,"Lautsprecherdeaktivierung erfolgreich","Der interne Lautsprecher wurde nun abgeschaltet.")
    Else
    MsgBox(0,"Fehler ! Der Lautsprecher ist immer noch an.","Das Abschalten des Lautsprechers war nicht erfolgreich. Bitte wenden Sie sich an den Support.")
    EndIf
    ExitLoop
    EndSelect
    WEnd

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

    Exit

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


    ;on.au3 =>on.exe
    RegWrite("HKEY_CURRENT_USER\Control Panel\Sound","Beep","REG_SZ","yes")

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


    ; off.au3 => off.exe
    RegWrite("HKEY_CURRENT_USER\Control Panel\Sound","Beep","REG_SZ","no")

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



    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    #include <GUIConstants.au3>

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

    GUICreate("PC-Lautsprecher umschalten", 350, 100)
    GuiCtrlCreatePic("Speaker.Gif",0,0, 32,33)
    GUICtrlCreateLabel("Was möchten Sie mit dem internen PC-Lautsprecher tun ?", 10, 35)
    $aktivieren = GUICtrlCreateButton("Einschalten", 10, 60, 80)
    $deaktivieren = GUICtrlCreateButton("Ausschalten", 110, 60, 80)
    GUISetState(@SW_SHOW)

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

    While 2
    $msg = GUIGetMsg()

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

    Select
    Case $msg = $GUI_EVENT_CLOSE
    Exit

    Case $msg = $aktivieren
    RegWrite("HKEY_CURRENT_USER\Control Panel\Sound","Beep","REG_SZ","yes")
    If Not @error Then
    MsgBox(0,"Lautsprecheraktivierung erfolgreich","Der interne Lautsprecher wurde nun eingeschaltet.")
    Else
    MsgBox(0,"Fehler ! Der Lautsprecher ist immer noch aus.","Das Einschalten des Lautsprechers war nicht erfolgreich. Bitte wenden Sie sich an den Support.")
    EndIf
    ;~ ExitLoop
    Case $msg = $deaktivieren
    RegWrite("HKEY_CURRENT_USER\Control Panel\Sound","Beep","REG_SZ","no")
    If Not @error Then
    MsgBox(0,"Lautsprecherdeaktivierung erfolgreich","Der interne Lautsprecher wurde nun abgeschaltet.")
    Else
    MsgBox(0,"Fehler ! Der Lautsprecher ist immer noch an.","Das Abschalten des Lautsprechers war nicht erfolgreich. Bitte wenden Sie sich an den Support.")
    EndIf
    ;~ ExitLoop
    EndSelect
    WEnd

    [/autoit]

    If not :?: then ?( else :thumbup:

    2 Mal editiert, zuletzt von Concara (22. April 2009 um 15:24)

  • Ein großes Danke in die Runde !

    Dann hatte ich offenbar einen Denkfehler bezüglich $beepcheck. Aber nun wird's mir langsam klar - denke ich. :)

    "RunAs" habe ich mit reingenommen, weil die User hier keine Änderungen in der Registry vornehmen dürfen.
    Um Fehler auszuschließen, führe ich diese Änderung unter dem Kontext des Service-Accouts aus.

    Ich werde aber auch mal die Variante ohne versuchen.

    Jedenfalls schonmal danke für die Tips !


    *** EDIT ***

    Habe nach dem Ausführen des ursprünglichen Scripts einen Blick in die Registry geworfen. Der Eintrag für "Beep" wird nicht geändert. Daher gibt $Beepcheck im Grunde auch den richtigen Wert - hier also "no" - aus.
    Trotz "RegWrite("HKEY_CURRENT_USER\Control Panel\Sound","Beep","REG_SZ","yes")" bleibt der Eintrag auf "no". Offensichtlich wird also dieser Befehl nicht sauber ausgeführt, während "RegWrite("HKEY_CURRENT_USER\Control Panel\Sound","Beep","REG_SZ","no")" funktioniert, was ich daran sehe, dass nach der manuellen Änderung in der Registry zu "yes" der Wert nach dem Klicken des Buttons "Abschalten" auf "no" steht.

  • Hi!

    Bei deinem ersten Script wird immer no drin stehen weil das als letztes aufgerufen wird.
    Egal was du für einen Button drückst es müsste nach dem ausführen des Scripts immer no drinstehen.
    Wenn das der Fall ist weißt du das der Benutzer der das Script ausgeführt hat diesen Registrywert ändern kann.

    Wenn du in deinem Ursprungsscript die Variablen tauschst dann wird immer yes drin stehen.

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

    Local $ScriptOff= RegWrite("HKEY_CURRENT_USER\Control Panel\Sound","Beep","REG_SZ","no")
    Local $ScriptOn = RegWrite("HKEY_CURRENT_USER\Control Panel\Sound","Beep","REG_SZ","yes")

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

    If not :?: then ?( else :thumbup: