per AutoIT Batch-Skript als Admin starten

  • HI, und schon wieder hab ich eine verzwickte Frage....

    Ich habe mit eine GUI gebastelt, die auf Knopfdruck verschiedene Batch-Skripte mit Administratorrechten ausführt. Nun ist es aber so, dass einige der Batch-Skripte auf Unter-Skripte (auch Batch) zugreifen. Aber diese werden, wenn ich sie über meine GUI starte nicht aufgerufen. Man sieht nur n kurzes Flackern.
    Wenn ich meine Haupt-Batch direkt aufrufe dann geht es...

    Vereinfacht dargestellt:

    GUI => Batch1 geht
    GUI => Batch1 => Batch_1.1 geht nicht
    Batch1 => Batch1.1 geht

    An den Adminrechten kanns aber eig. nicht liegen, da ich am Testrechner hier sowieso Adminrechte habe...

    hat jemand ne idee woran es liegen könnte?

  • Ja, bin mir sicher, da das Unterskript eine Funktion ausführt und dies definitiv nicht passiert. Werde gleich mal den Code posten.....

    Code zum Aufrufen der Hauptbatch

    [autoit]

    Case $msg = $button_ok AND (GUICtrlRead($radio_13) = $GUI_Checked)
    RunAsSet("Administrator", ComputerName, "pass_xxx")
    RunWait ('%0\..\skripte\13.cmd')

    [/autoit]

    Code vom Skript 13 (in Auszügen)

    [autoit]

    SET /P MENUITEM1=Auswahl:
    if %MENUITEM1%==an (call %0\..\13a.cmd)
    if %MENUITEM1%==aus (call %0\..\13b.cmd)

    [/autoit]

    Code vom Unterskript 13a

    [autoit]

    net start sharedaccess

    [/autoit]

    Habe die Skripts stark abgekürzt. Also Batch 13 wird aufgerufen und wenn ich in dessen menu dann "an" eingebe dann wird anstatt 13a nichts aufgerufen... wenn ich die Batch13 direkt starte funktioniert der link jedoch...

    3 Mal editiert, zuletzt von greetzz (27. November 2006 um 10:25)

  • Also mich irritiert das %0 etwas :)
    Kannst du mir das kurz erläutern?

    Versuch es doch mal mit einem Pause Befehl in deiner "unter Batch" dann siehst du zumindest mal ob sie wirklich nicht aufgerufen wird.

    Was auch noch wichtig ist bei der Verwendung von RunAsSet ist dass wirklich alles dann nur noch mit dem angegeben Benutzer ausgeführt wird (in deinem Fall mit einem lokalen Admin egal ob du mit einem Domänen Admin angemeldet bist oder nicht!).
    Dies kann zu Problemen führen wenn du auf irgendwelche Netzlaufwerke zugreifen willst (lokale Admins haben da ja keinen Zugriff)

    Gut wenns daran nicht liegt kannst ja mal probieren den Aufruf so zu machen:

    [autoit]

    RunWait(@ComSpec & " /c " & "Pfad_zur_Batch")

    [/autoit]

    c ya
    Paddy

  • Ok, also das %0 bdeutet bei Batch folgendes:

    %0\..\ => Steht für den Pfad, in dem die derzeitige Patch läuft, also wenn man die Batch auf c:\temp startet, dann wäre das Ergebnis "C:\temp\"

    Es geht in der Unterbatch nur um das Starten und stoppen von Windows Diensten - geht das evtl. sogar mit Autoit direkt? Dann spar ich mir meine Batchs einfach.....


    bernd670: Das mit "%0" ist so nicht richtig, in "%0" steht der Programmname mit Pfad. Wenn also die Batch im Verzeichnis "C:\temp" liegt und "test.cmd" heisst steht in "%0" -> "C:\temp\test.cmd". Das heisst wiederrum das "%0\..\" für "C:\temp\test.cmd\..\" steht was nicht funktionieren kann!

  • Naja, "alles" ist zu viel verlangt aber immerhin etwas.....

    Folgendes möchte ich noch umsetzen in AutoIT. Bis jetzt habe ich dafür noch Batch-Skripts (dargestellt als batchNr.cmd) aber die sind für einen Enduser zu unübersichtlich.

    1. Einen Ping inkl. RÜCKMELDUNG "reply auf ip xxx.xxx.xxx.xxx erfolgreich" usw
    2. GPUPDATE /force
    3. Tracert auf einen vorher definierten Server
    4. NSLOOKUP auf vorher definierten Server


    hat jemand Ideen. Ich bin soweit, dass er mir die Windows-Programme (wie tracert.exe) ausführt, jedoch kommt halt keine rückmeldung, da das fenster einfach wieder zugeht. Jemand Ideen oder Alternativen.

    Der Gedanke hinter dem Ganzen ist ein Skript, dass unsere User auf dem rechner haben und wenn wir (als die Admins) Informationen benötigen, diese EINFACH und IDIOTENSICHER ausgelesen werden können....

    [autoit]

    #include <GUIConstants.au3>
    #include "ServiceControl.au3"

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

    GUICreate("Service-Skript V1.2",800,220)
    GUISetState(@sw_show)

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

    $text1=GUICtrlCreateLabel("Bitte wählen Sie eines der folgenden Programme aus, in dem Sie den entsprechenden Button auswählen und mit OK bestätigen. Zum Beenden des Programms, bitte Exit wählen.",15,10,200,80,-1,-1)
    $button_ok=GUICtrlCreateButton("OK",15,100,200,35,-1,-1)
    $button_exit=GUICtrlCreateButton("Exit",15,150,200,35,-1,-1)
    GUIStartGroup()
    $radio_1 = GUICtrlCreateRadio ("Auslesen des eigenen PC-Namens", 240, 10, 300, 20)
    $radio_2 = GUICtrlCreateRadio ("Ping auf den Email-Server SRV01mail1 durchführen", 240, 40, 300, 20)
    $radio_3 = GUICtrlCreateRadio ("Ping auf eigenen Rechner durchführen", 240, 70, 300, 20)
    $radio_4 = GUICtrlCreateRadio ("Ping auf den SIS-Server SRV32sis durchführen", 240, 100, 300, 20)
    $radio_5 = GUICtrlCreateRadio ("IP-Adressen des Rechners anzeigen", 240, 130, 300, 20)
    $radio_6 = GUICtrlCreateRadio ("DOS-Box mit Adminrechten starten", 240, 160, 300, 20)
    $radio_7 = GUICtrlCreateRadio ("Policy-Refresh", 240, 190, 300, 20)
    $radio_8 = GUICtrlCreateRadio ("NSLOOKUP auf Ditzingen / Böblingen", 550, 10, 300, 20)
    $radio_9 = GUICtrlCreateRadio ("Computermanagement öffnen", 550, 40, 300, 20)
    $radio_10 = GUICtrlCreateRadio ("Eventviewer starten", 550, 70, 300, 20)
    $radio_11 = GUICtrlCreateRadio ("Windows Remote Assistance starten", 550, 100, 300, 20)
    $radio_12 = GUICtrlCreateRadio ("Trace Route auf Server x", 550, 130, 300, 20)
    $radio_13 = GUICtrlCreateRadio ("Firewall an/abschalten", 550, 160, 300, 20)
    $radio_14 = GUICtrlCreateRadio ("Lokalen Benutzer entsperren", 550, 190, 300, 20)
    GUICtrlSetState($radio_1, $GUI_checked)

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

    ; Show the GUI
    GUISetState ()

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

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    Case $msg = $button_exit
    Exit
    Case $msg = $button_ok AND (GUICtrlRead($radio_1) = $GUI_Checked)
    MsgBox(4096,"Computername","Ihr Computername ist: " & @ComputerName)
    Case $msg = $button_ok AND (GUICtrlRead($radio_2) = $GUI_Checked)
    RunWait ('%0\..\skripte\2.cmd')
    Case $msg = $button_ok AND (GUICtrlRead($radio_3) = $GUI_Checked)
    RunWait ('%0\..\skripte\3.cmd')
    Case $msg = $button_ok AND (GUICtrlRead($radio_4) = $GUI_Checked)
    RunWait ('%0\..\skripte\4.cmd')
    Case $msg = $button_ok AND (GUICtrlRead($radio_5) = $GUI_Checked)
    RunAsSet("Administrator", @ComputerName, "pass_xxx")
    RunWait ('%0\..\skripte\5.cmd')
    Case $msg = $button_ok AND (GUICtrlRead($radio_6) = $GUI_Checked)
    RunAsSet("Administrator", @ComputerName, "pass_xxx")
    RunWait ('%0\..\skripte\6.cmd')
    Case $msg = $button_ok AND (GUICtrlRead($radio_7) = $GUI_Checked)
    RunAsSet("Administrator", @ComputerName, "pass_xxx")
    Run(@ComSpec & " /c " & 'gpupdate' & " /force", "", @SW_HIDE)
    MsgBox(4096,"Info","Die Policy wurde erfolgreich upgedated")
    Case $msg = $button_ok AND (GUICtrlRead($radio_8) = $GUI_Checked)
    RunAsSet("Administrator", @ComputerName, "pass_xxx")
    Run(@ComSpec & " /c " & 'nslookup', "", @SW_HIDE)
    MsgBox(4096,"Info","Die Policy wurde erfolgreich upgedated" & @error)
    Case $msg = $button_ok AND (GUICtrlRead($radio_9) = $GUI_Checked)
    RunAsSet("Administrator", @ComputerName, "pass_xxx")
    Run(@ComSpec & " /c " & 'compmgmt.msc', "", @SW_HIDE)
    Case $msg = $button_ok AND (GUICtrlRead($radio_10) = $GUI_Checked)
    RunAsSet("Administrator", @ComputerName, "pass_xxx")
    Run(@ComSpec & " /c " & 'eventvwr.msc', "", @SW_HIDE)
    Case $msg = $button_ok AND (GUICtrlRead($radio_11) = $GUI_Checked)
    RunAsSet("Administrator", @ComputerName, "pass_xxx")
    RunWait('rcimlby.exe -LaunchRA')
    Case $msg = $button_ok AND (GUICtrlRead($radio_12) = $GUI_Checked)
    RunAsSet("Administrator", @ComputerName, "pass_xxx")
    $server = InputBox("Traceroute auf Server X", "Bitte den Servernamen eingeben: ")
    RunWait("tracert.exe", @SystemDir, $server)
    WinWait("Untiteles")
    MsgBox(4096,"Info","Traceroute auf " & $server & " war erfolgreich!", "")
    Case $msg = $button_ok AND (GUICtrlRead($radio_13) = $GUI_Checked)
    If _ServiceRunning("", "sharedaccess") Then
    _StopService("","sharedaccess")
    MsgBox(1, "", "Die Windows Firewall wurde gestoppt")
    Else
    _startService("","sharedaccess")
    MsgBox(1, "", "Die Windows Firewall wurde gestartet")
    EndIf

    Case $msg = $button_ok AND (GUICtrlRead($radio_14) = $GUI_Checked)
    RunAsSet("Administrator", @ComputerName, "pass_xxx")
    RunWait ('%0\..\skripte\14.cmd')
    EndSelect
    RunAsSet()

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

    WEnd

    [/autoit]