Mit Hilfe von AutoIt einen Shutdown erzeugen

  • Hallo Leute,

    gibt es eine Möglichkeit, dass ich mit Hilfe von AutoIt einen Shutdown ohne Adminrechte erzeugen kann.

    Es geht um folgendes Szenario:

    Betriebssystem: Server 2008 Enterprise R2
    Es ist am Server kein User angemeldet, am Server ist nur das Login-Fenster. Jedoch möchte ich zu einem bestimmten Zeitpunkt den Server mithilfe von einem Skript herunterfahren.

    Ist das irgendwie zu möglich, dass ich den Server ohne Benutzerrechte herunterfahren kann? Ich dachte schon an psexec, aber geht es auch schöner bzw. ohne Zusatztools?

    MfG

    Einmal editiert, zuletzt von Rudi1982 (19. Juni 2010 um 23:01)

  • Dafür gibts doch

    [autoit]

    Shutdown

    [/autoit]

    Evtl. noch

    [autoit]

    #RequireAdmin

    [/autoit]

    davor...

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • Hiho

    Ich kenne nur die Möglichkeit den Autoitprozess als Service starten zu lassen...
    Habe das bei mir in der Firma auf den Service PCs so.... :thumbup:

    Leider brauchste aber auch nen Tool um den Service eintragen zu lassen... ist im Anhang..

    @ Cartan12 wenn kein User angemeldet ist geht das doch nit oder? Mit dem Service müsste das dann aber gehen...

    MFg chris :D

  • Hallo Leute,

    ich hab noch immer ein Problem mit meinem Skript....

    Mein Skript funktioniert soweit ganz gut, ich es auch als Dienst installiert (mithilfe von chrisatacks Rat mit RunAsSvc), nur mein Skript schafft es leider nicht den Server herunterzufahren, ansonsten funktioniert alles aus dem Skript (ping, Ausgabe in Datei, etc.).
    Vielleicht kann mir jemand von Euch den korrekten Tip geben....

    Im Spoiler findet ihr meinen Code...

    [autoit]

    ; Skriptname: ClientCheck v1.0
    ; Skriptauthor: Rudi1982
    ; Datum: 18.06.2010

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

    #include <File.au3>

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

    $IPArray = StringSplit(@IPAddress1, ".") ; Splitte die lokale IP Adresse in vier Array Segmente
    $oc = 0 ; Online Clients: zählt die Anzahl der Clients die online sind
    $Limit = 0 ; Limit bezeichnet die Anzahl der Durchläufe, wenn alle Clients offline sind

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

    $logpfad = "C:\Windows\System\Skripte\ClientCheck.log"
    $logeintrag = "\n ClientCheck.exe wurde erfolgreich gestartet..."
    $logeintrag2 = "Der Server wird heruntergefahren"

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

    _FileWriteLog($logpfad, $logeintrag)
    MsgBox(64,"Information", "gestartet")

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

    While $Limit <= 3 ; Wenn beim 4.Versuch kein Client online ist, dann breche die Schleife ab!

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

    For $IPArray[4] = 10 to 30 ; Mit der for-Schleife werden die einzelnen Hosts durchgegangen

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

    $IP = $IPArray[1] & "." & $IPArray[2] & "." & $IPArray[3] & "." & $IPArray[4] ; Die vier Array-Segmente werden in dieser Variable zu einer IP zusammengesetzt

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

    ; MsgBox(64,"Information", "Teste Client mit IP:" & $IP)

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

    $pvar = Ping($IP,250) ; Durchführung der PING-Anweisung
    If $pvar Then
    ;Msgbox(0,"Status","Online, roundtrip was:" & $pvar)
    $oc = $oc +1 ; Erhöhe die Variable der Online-Clienten um 1
    Else
    ;Msgbox(0,"Status","Der Client scheint offline zu sein " & @error)
    EndIf

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

    $pvar = 0 ; Setze die Ping-Variable wieder auf 0
    Next

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

    If $oc = 1 Then
    ; MsgBox(64,"Information","Es ist " & $oc & " Client online.")
    ElseIf $oc > 1 Then
    ; MsgBox(64,"Information","Anscheinend sind " & $oc & " Clients online.")
    Else
    MsgBox(64,"Information","Anscheinend sind alle Clients offline.")
    $Limit = $Limit +1 ; Erhöhe den Limit-Wert um 1, da kein Client online ist
    EndIf

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

    $oc = 0 ; Setze den Zähler der Online-Clients wieder auf Null

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

    Sleep(900000) ; warte 15 Minuten, danach beginne die Schleife erneut
    WEnd
    ; MsgBox(64,"Information","Der Server wird heruntergefahren.")
    _FileWriteLog($logpfad, $logeintrag2)
    Shutdown (5) ; Herunterfahren erzwingen / Force
    ; RunWait("psexec -u domain\Administrator -p xxxxxxxxx D:\Programme\WOL2\wol2.exe -wake srvee01dc.infobit.local -close")
    ; RunWait("psshutdown -s")
    ; ShellExecute("cmd.exe shutdown -s -t 1")
    ; ShellExecute("cmd.exe shutdown /s /t 1")

    [/autoit]

    MfG

    2 Mal editiert, zuletzt von Rudi1982 (20. Juni 2010 um 16:15)

  • Hallo Rudi1982

    Eig. müsste dein Script, nachdem des aus der Schleife rauspringt das Herunterfahren erzwingen.

    Ich geh mal davon aus, dass du den Sleep wesentlich verringert hast um es zu testen oder?

    mfg Darter

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Auf alle Fälle zum testen läüft der Sleep auf 5 min.....

    Ich hab sogar shutdown -s -f -t 1 probiert und der Server fährt einfach nicht runter. Bis zum Shutdown funktioniert das Skript auch wunderbar. Es läuft als Dienst und meldet sich sogar mit dem Benutzer System an....

    Keine Ahnung, bin mittlwerweile ratlos...

    MfG

  • auszug aus der Hilfe:

    Rückgabewert

    Erfolg: Gibt 1 zurück.
    Fehler: Gibt 0 zurück und @error wird auf GetLastError() gesetzt.

    Lass dir einfach mal in einer msgbox der rückgabewert ausgeben, wenn dieser 0 ist kannst du auch mal den error abfragen

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Ich verzweifel noch!

    Wenn ich das Script als Admin starte kommt die Fehlermeldung: shutdown.exe kann nicht gefunden werden.

    Ich habe aber die shutdown.exe in Windows\System32, in Windows\SysWOW64 und im Script-Verzeichnis,

    Egal ob ich im Script, den kompletten Pfad (C:\Windows\System32\shutdown) oder nur shutdown.exe aufrufe, die Datei kann angeblich nicht gefunden werden.

    LG

  • Jetzt hab ich das Problem gelöst!!

    Zwar nicht schön, aber es funktioniert....

    [autoit]

    ; Skriptname: ClientCheck v1.0
    ; Skriptauthor: Rudi1982
    ; Datum: 18.06.2010

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

    #include <File.au3>

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

    $IPArray = StringSplit(@IPAddress1, ".") ; Splitte die lokale IP Adresse in vier Array Segmente
    $oc = 0 ; Online Clients: zählt die Anzahl der Clients die online sind
    $Limit = 0 ; Limit bezeichnet die Anzahl der Durchläufe, wenn alle Clients offline sind

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

    $logpfad = "C:\Windows\System\Skripte\ClientCheck.log"
    $logeintrag = "\n ClientCheck.exe wurde erfolgreich gestartet..."
    $logeintrag2 = "Der Server wird heruntergefahren"

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

    _FileWriteLog($logpfad, $logeintrag)
    MsgBox(64,"Information", "gestartet")

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

    While $Limit <= 3 ; Wenn beim 4.Versuch kein Client online ist, dann breche die Schleife ab!

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

    For $IPArray[4] = 10 to 30 ; Mit der for-Schleife werden die einzelnen Hosts durchgegangen

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

    $IP = $IPArray[1] & "." & $IPArray[2] & "." & $IPArray[3] & "." & $IPArray[4] ; Die vier Array-Segmente werden in dieser Variable zu einer IP zusammengesetzt

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

    ; MsgBox(64,"Information", "Teste Client mit IP:" & $IP)

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

    $pvar = Ping($IP,250) ; Durchführung der PING-Anweisung
    If $pvar Then
    ;Msgbox(0,"Status","Online, roundtrip was:" & $pvar)
    $oc = $oc +1 ; Erhöhe die Variable der Online-Clienten um 1
    Else
    ;Msgbox(0,"Status","Der Client scheint offline zu sein " & @error)
    EndIf

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

    $pvar = 0 ; Setze die Ping-Variable wieder auf 0
    Next

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

    If $oc = 1 Then
    ; MsgBox(64,"Information","Es ist " & $oc & " Client online.")
    ElseIf $oc > 1 Then
    ; MsgBox(64,"Information","Anscheinend sind " & $oc & " Clients online.")
    Else
    MsgBox(64,"Information","Anscheinend sind alle Clients offline.")
    $Limit = $Limit +1 ; Erhöhe den Limit-Wert um 1, da kein Client online ist
    EndIf

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

    $oc = 0 ; Setze den Zähler der Online-Clients wieder auf Null

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

    Sleep(900000) ; warte 15 Minuten, danach beginne die Schleife erneut
    WEnd
    ; MsgBox(64,"Information","Der Server wird heruntergefahren.")
    _FileWriteLog($logpfad, $logeintrag2)ShellExecute("C:\Windows\system\Skripte\shutdown.cmd")

    [/autoit]


    Der Inhalt der shutdown.cmd

    Spoiler anzeigen

    shutdown -s -t 0


    Wenn jemand eine schönere Lösung weiß, dann kann er sie mir gerne verraten...

    MfG

    4 Mal editiert, zuletzt von Rudi1982 (20. Juni 2010 um 16:16)

  • Bitte benutze die

    Code
    [autoit][/autoit]

    Funktion im Forum. So wie du es hast ist es ganz unübersichtlich...