Wednesday, March 18, 2009

Shutdown 2.0

As it turned out, my first shutdown script did not work unless the user is logged onto the machine.

This new one works without anyone being logged on. It relies on the service.au3 file. It was downloaded from an AutoIt forum http://www.autoitscript.com/forum/index.php?showtopic=80201

Service.au3:

#AutoIt3Wrapper_Change2CUI=y
#include-once
#include<WinApi.au3>
 
#region Defined Variables and Constants
Global $STANDARD_RIGHTS_REQUIRED = 0x000F0000
 
; Service Control Manager access types
Global Const $SC_MANAGER_CONNECT = 0x0001
Global Const $SC_MANAGER_CREATE_SERVICE = 0x0002
Global Const $SC_MANAGER_ENUMERATE_SERVICE = 0x0004
Global Const $SC_MANAGER_LOCK = 0x0008
Global Const $SC_MANAGER_QUERY_LOCK_STATUS = 0x0010
Global Const $SC_MANAGER_MODIFY_BOOT_CONFIG = 0x0020
Global Const $SC_MANAGER_ALL_ACCESS = BitOR($STANDARD_RIGHTS_REQUIRED, $SC_MANAGER_CONNECT, $SC_MANAGER_CREATE_SERVICE, $SC_MANAGER_ENUMERATE_SERVICE, $SC_MANAGER_LOCK, $SC_MANAGER_QUERY_LOCK_STATUS, $SC_MANAGER_MODIFY_BOOT_CONFIG)
 
; Service Access Types
Global Const  $SERVICE_QUERY_CONFIG = 0x0001
Global Const $SERVICE_CHANGE_CONFIG = 0x0002
Global Const $SERVICE_QUERY_STATUS = 0x0004
Global Const $SERVICE_ENUMERATE_DEPENDENTS = 0x0008
Global Const $SERVICE_START = 0x0010
Global Const $SERVICE_STOP = 0x0020
Global Const $SERVICE_PAUSE_CONTINUE = 0x0040
Global Const $SERVICE_INTERROGATE = 0x0080
Global Const $SERVICE_USER_DEFINED_CONTROL = 0x0100
Global $SERVICE_ALL_ACCESS = BitOR($STANDARD_RIGHTS_REQUIRED, $SERVICE_QUERY_CONFIG, $SERVICE_CHANGE_CONFIG, $SERVICE_QUERY_STATUS, $SERVICE_ENUMERATE_DEPENDENTS, $SERVICE_START, $SERVICE_STOP, $SERVICE_PAUSE_CONTINUE, $SERVICE_INTERROGATE, $SERVICE_USER_DEFINED_CONTROL)
 
; Service Controls
Global Const $SERVICE_CONTROL_STOP = 0x00000001
Global Const $SERVICE_CONTROL_PAUSE = 0x00000002
Global Const $SERVICE_CONTROL_CONTINUE = 0x00000003
Global Const $SERVICE_CONTROL_INTERROGATE = 0x00000004
Global Const $SERVICE_CONTROL_SHUTDOWN = 0x00000005
Global Const $SERVICE_CONTROL_PARAMCHANGE = 0x00000006
Global Const $SERVICE_CONTROL_NETBINDADD = 0x00000007
Global Const $SERVICE_CONTROL_NETBINDREMOVE = 0x00000008
Global Const $SERVICE_CONTROL_NETBINDENABLE = 0x00000009
Global Const $SERVICE_CONTROL_NETBINDDISABLE = 0x0000000A
Global Const $SERVICE_CONTROL_DEVICEEVENT = 0x0000000B
Global Const $SERVICE_CONTROL_HARDWAREPROFILECHANGE = 0x0000000C
Global Const $SERVICE_CONTROL_POWEREVENT = 0x0000000D
Global Const $SERVICE_CONTROL_SESSIONCHANGE = 0x0000000E
 
; Service Types
Global Const $SERVICE_KERNEL_DRIVER = 0x00000001
Global Const $SERVICE_FILE_SYSTEM_DRIVER = 0x00000002
Global Const $SERVICE_ADAPTER = 0x00000004
Global Const $SERVICE_RECOGNIZER_DRIVER = 0x00000008
Global Const $SERVICE_DRIVER = BitOR($SERVICE_KERNEL_DRIVER, $SERVICE_FILE_SYSTEM_DRIVER, $SERVICE_RECOGNIZER_DRIVER)
Global Const $SERVICE_WIN32_OWN_PROCESS = 0x00000010
Global Const $SERVICE_WIN32_SHARE_PROCESS = 0x00000020
Global Const $SERVICE_WIN32 = BitOR($SERVICE_WIN32_OWN_PROCESS, $SERVICE_WIN32_SHARE_PROCESS)
Global Const $SERVICE_INTERACTIVE_PROCESS = 0x00000100
Global Const $SERVICE_TYPE_ALL = BitOR($SERVICE_WIN32, $SERVICE_ADAPTER, $SERVICE_DRIVER, $SERVICE_INTERACTIVE_PROCESS)
 
; Service Start Types
Global Const $SERVICE_BOOT_START = 0x00000000
Global Const $SERVICE_SYSTEM_START = 0x00000001
Global Const $SERVICE_AUTO_START = 0x00000002
Global Const $SERVICE_DEMAND_START = 0x00000003
Global Const $SERVICE_DISABLED = 0x00000004
 
; Service Error Control
Global Const $SERVICE_ERROR_IGNORE = 0x00000000
Global Const $SERVICE_ERROR_NORMAL = 0x00000001
Global Const $SERVICE_ERROR_SEVERE = 0x00000002
Global Const $SERVICE_ERROR_CRITICAL = 0x00000003
Global Const $SERVICE_ACCEPT_HARDWAREPROFILECHANGE = 0x20
Global Const $SERVICE_ACCEPT_NETBINDCHANGE = 0x10
Global Const $SERVICE_ACCEPT_PARAMCHANGE = 0x8
Global Const $SERVICE_ACCEPT_PAUSE_CONTINUE = 0x2
Global Const $SERVICE_ACCEPT_POWEREVENT = 0x40
Global Const $SERVICE_ACCEPT_SESSIONCHANGE = 0x80
Global Const $SERVICE_ACCEPT_PRESHUTDOWN = 0x100
Global Const $SERVICE_ACCEPT_SHUTDOWN = 0x4
Global Const $SERVICE_ACCEPT_STOP = 0x1
Global Const $SERVICE_ACTIVE = 0x1
Global Const $SERVICE_INACTIVE = 0x2
Global Const $SERVICE_PAUSE_PENDING = 0x6
Global Const $SERVICE_PAUSED = 0x7
Global Const $SERVICE_RUNNING = 0x4
Global Const $SERVICE_START_PENDING = 0x2
Global Const $SERVICE_STOP_PENDING = 0x3
Global Const $SERVICE_STOPPED = 0x1
Global Const $SERVICE_CONTINUE_PENDING = 0x5
 
;
Global $tServiceName,$tServiceCtrl,$tServiceMain,$service_debug_mode = False
Global $tService_Status = DllStructCreate("dword dwServiceType;dword dwCurrentState;dword dwControlsAccepted;dword dwWin32ExitCode;dword dwServiceSpecificExitCode;dword dwCheckPoint;dword dwWaitHint")
Global $tService_Status_handle
Global Const $NO_ERROR = 0
Global Const $NTSL_LOOP_WAIT = -1
Global $service_stop_event
Global $NTSL_ERROR_SERVICE_STATUS = 2
Global Const $WAIT_OBJECT_0 = 0x0
#endregion
 
#region Functions
Func _CreateService($sComputerName, $sServiceName, $sDisplayName, $sBinaryPath, $sServiceUser = "LocalSystem", $sPassword = "", $nServiceType = 0x00000010, $nStartType = 0x00000002, $nErrorType = 0x00000001, $nDesiredAccess = 0x000f01ff, $sLoadOrderGroup = "")
    Local $hAdvapi32
    Local $hKernel32
    Local $arRet
    Local $hSC
    Local $lError = -1   
    $hAdvapi32 = DllOpen("advapi32.dll")
    If $hAdvapi32 = -1 Then Return 0
    $hKernel32 = DllOpen("kernel32.dll")
    If $hKernel32 = -1 Then Return 0
    $arRet = DllCall($hAdvapi32, "long", "OpenSCManager", "str", $sComputerName, "str", "ServicesActive", "long", $SC_MANAGER_ALL_ACCESS)
    If $arRet[0] = 0 Then
        $arRet = DllCall($hKernel32, "long", "GetLastError")
        $lError = $arRet[0]
    Else
        $hSC = $arRet[0]
        $arRet = DllCall($hAdvapi32, "long", "OpenService", "long", $hSC, "str", $sServiceName, "long", $SERVICE_INTERROGATE)
        If $arRet[0] = 0 Then
            $arRet = DllCall($hAdvapi32, "long", "CreateService", "long", $hSC, "str", $sServiceName, "str", $sDisplayName, "long", $nDesiredAccess, "long", $nServiceType, "long", $nStartType, "long", $nErrorType, "str", $sBinaryPath, "str", $sLoadOrderGroup, "ptr", 0, "str", "", "str", $sServiceUser, "str", $sPassword)
            If $arRet[0] = 0 Then            
                $arRet = DllCall($hKernel32, "long", "GetLastError")
                $lError = $arRet[0]
            Else
                DllCall($hAdvapi32, "int", "CloseServiceHandle", "long", $arRet[0])
            EndIf
        Else
            DllCall($hAdvapi32, "int", "CloseServiceHandle", "long", $arRet[0])
        EndIf      
        DllCall($hAdvapi32, "int", "CloseServiceHandle", "long", $hSC)
    EndIf
    DllClose($hAdvapi32)
    DllClose($hKernel32)   
    If $lError <> -1 Then 
        SetError($lError)
        Return 0
    EndIf
    Return 1
EndFunc
 
Func _DeleteService($sComputerName, $sServiceName)
    Local $hAdvapi32
    Local $hKernel32
    Local $arRet
    Local $hSC
    Local $hService
    Local $lError = -1   
 
    $hAdvapi32 = DllOpen("advapi32.dll")
    If $hAdvapi32 = -1 Then Return 0
    $hKernel32 = DllOpen("kernel32.dll")
    If $hKernel32 = -1 Then Return 0
    $arRet = DllCall($hAdvapi32, "long", "OpenSCManager", "str", $sComputerName, "str", "ServicesActive", "long", $SC_MANAGER_ALL_ACCESS)
    If $arRet[0] = 0 Then
        $arRet = DllCall($hKernel32, "long", "GetLastError")
        $lError = $arRet[0]
    Else
        $hSC = $arRet[0]
        $arRet = DllCall($hAdvapi32, "long", "OpenService", "long", $hSC, "str", $sServiceName, "long", $SERVICE_ALL_ACCESS)
        If $arRet[0] = 0 Then
            $arRet = DllCall($hKernel32, "long", "GetLastError")
            $lError = $arRet[0]
        Else
            $hService = $arRet[0]
            $arRet = DllCall($hAdvapi32, "int", "DeleteService", "long", $hService)
            If $arRet[0] = 0 Then
                $arRet = DllCall($hKernel32, "long", "GetLastError")
                $lError = $arRet[0]
            EndIf
            DllCall($hAdvapi32, "int", "CloseServiceHandle", "long", $hService)
        EndIf
        DllCall($hAdvapi32, "int", "CloseServiceHandle", "long", $hSC)
    EndIf
    DllClose($hAdvapi32)
    DllClose($hKernel32)   
    If $lError <> -1 Then 
        SetError($lError)
        Return 0
    EndIf
    Return 1
EndFunc
 
Func _StopService($sComputerName, $sServiceName)
    Local $hAdvapi32
    Local $hKernel32
    Local $arRet
    Local $hSC
    Local $hService
    Local $lError = -1
 
    $hAdvapi32 = DllOpen("advapi32.dll")
    If $hAdvapi32 = -1 Then Return 0
    $hKernel32 = DllOpen("kernel32.dll")
    If $hKernel32 = -1 Then Return 0
    $arRet = DllCall($hAdvapi32, "long", "OpenSCManager", "str", $sComputerName, "str", "ServicesActive", "long", $SC_MANAGER_CONNECT)
    If $arRet[0] = 0 Then
        $arRet = DllCall($hKernel32, "long", "GetLastError")
        $lError = $arRet[0]
    Else
        $hSC = $arRet[0]
        $arRet = DllCall($hAdvapi32, "long", "OpenService", "long", $hSC, "str", $sServiceName, "long", $SERVICE_STOP)
        If $arRet[0] = 0 Then
            $arRet = DllCall($hKernel32, "long", "GetLastError")
            $lError = $arRet[0]
        Else
            $hService = $arRet[0]
            $arRet = DllCall($hAdvapi32, "int", "ControlService", "long", $hService, "long", $SERVICE_CONTROL_STOP, "str", "")
            If $arRet[0] = 0 Then
                $arRet = DllCall($hKernel32, "long", "GetLastError")
                $lError = $arRet[0]
            EndIf
            DllCall($hAdvapi32, "int", "CloseServiceHandle", "long", $hService)         
        EndIf
        DllCall($hAdvapi32, "int", "CloseServiceHandle", "long", $hSC)
    EndIf
    DllClose($hAdvapi32)
    DllClose($hKernel32)   
    If $lError <> -1 Then 
        SetError($lError)
        Return 0
    EndIf
    Return 1
EndFunc
 
Func _ServiceExists($sComputerName, $sServiceName)
    Local $hAdvapi32
    Local $hKernel32
    Local $arRet
    Local $hSC
    Local $hService
    Local $lError = -1
 
    $hAdvapi32 = DllOpen("advapi32.dll")
    If $hAdvapi32 = -1 Then Return 0
    $hKernel32 = DllOpen("kernel32.dll")
    If $hKernel32 = -1 Then Return 0
    $arRet = DllCall($hAdvapi32, "long", "OpenSCManager", "str", $sComputerName, "str", "ServicesActive", "long", $SC_MANAGER_CONNECT)
    If $arRet[0] = 0 Then
        $arRet = DllCall($hKernel32, "long", "GetLastError")
        $lError = $arRet[0]
    Else
        $hSC = $arRet[0]
        $arRet = DllCall($hAdvapi32, "long", "OpenService", "long", $hSC, "str", $sServiceName, "long", $SERVICE_STOP)
        If $arRet[0] = 0 Then
            $arRet = DllCall($hKernel32, "long", "GetLastError")
            $lError = $arRet[0]    
        EndIf
        DllCall($hAdvapi32, "int", "CloseServiceHandle", "long", $hSC)
    EndIf
    DllClose($hAdvapi32)
    DllClose($hKernel32)   
    If $lError <> -1 Then 
        SetError($lError)
        Return 0
    EndIf
    Return 1
EndFunc
 
Func _Service_Cleanup()
    $service_error = _WinAPI_GetLastError()
    If ($tService_Status_handle) Then _Service_ReportStatus($SERVICE_STOPPED, $service_error, 0);
EndFunc
 
Func _Service_Ctrl($ctrlCode)
    Switch ($ctrlCode)
        Case $SERVICE_CONTROL_PAUSE
            DllStructSetData($tService_Status, "dwCurrentState", $SERVICE_PAUSED)
        Case $SERVICE_CONTROL_CONTINUE
            DllStructSetData($tService_Status, "dwCurrentState", $SERVICE_RUNNING)
        Case $SERVICE_CONTROL_STOP
            _Service_ReportStatus($SERVICE_STOP_PENDING, $NO_ERROR, 0);
            _Service_SetStopEvent();
            _Service_Cleanup()
            Exit
        Case $SERVICE_CONTROL_INTERROGATE
            ;break;
            ; invalid control code
            ;
        Case Else
            ;
    EndSwitch
    _Service_ReportStatus(DllStructGetData($tService_Status, "dwCurrentState"), $NO_ERROR, 0);
EndFunc
 
Func _Service_Halting()
    Return (_WinAPI_WaitForSingleObject($service_stop_event, $NTSL_LOOP_WAIT) == $WAIT_OBJECT_0);
EndFunc
 
Func _Service_Init($sServiceName)    
    $tServiceCtrl = DllCallbackRegister("_Service_Ctrl", "int", "uint")
    $tServiceMain = DllCallbackRegister("_Service_ServiceMain", "int", "int;str")    
    $tdispatchTable = DllStructCreate("ptr[2];ptr[2]")
    $tServiceName = DllStructCreate("char[128]")
    DllStructSetData($tServiceName, 1, $sServiceName)
    DllStructSetData($tdispatchTable, 1, DllStructGetPtr($tServiceName), 1)
    DllStructSetData($tdispatchTable, 1, DllCallbackGetPtr($tServiceMain), 2)
    DllStructSetData($tdispatchTable, 2, 0, 1)
    DllStructSetData($tdispatchTable, 2, 0, 2)
    $ret = DllCall("advapi32.dll", "int", "StartServiceCtrlDispatcher", "ptr", DllStructGetPtr($tdispatchTable))
    ;If $ret[0] = 0 Then MsgBox(0, "", " Error " & _WinAPI_GetLastError() & @CRLF)
EndFunc 
 
Func _Service_ReportStatus($currentState, $exitCode, $waitHint)
    Local $checkPoint = 1;
    Local $rc = True;
    If Not ($service_debug_mode) Then ;when debugging we don't report to the SCM
        If ($currentState == $SERVICE_START_PENDING) Then
            DllStructSetData($tService_Status, "dwControlsAccepted", 0);
        Else
            DllStructSetData($tService_Status, "dwControlsAccepted", $SERVICE_ACCEPT_STOP)
        EndIf
        
        DllStructSetData($tService_Status, "dwCurrentState", $currentState)
        DllStructSetData($tService_Status, "dwWin32ExitCode", $exitCode)
        DllStructSetData($tService_Status, "dwWaitHint", $waitHint)
        If $currentState == $SERVICE_RUNNING Or $currentState == $SERVICE_STOPPED Then
            DllStructSetData($tService_Status, "dwCheckPoint", 0)
        Else
            DllStructSetData($tService_Status, "dwCheckPoint", $checkPoint + 1);
        EndIf
        ; report the status of the service to the service control manager.
        If Not ($rc = _Service_SetServiceStatus($tService_Status_handle, DllStructGetPtr($tService_Status))) Then ConsoleWrite("+ " & $NTSL_ERROR_SERVICE_STATUS & @TAB & _WinAPI_GetLastError() & @CRLF)
    EndIf
    Return ($rc);
EndFunc
 
Func _Service_ServiceMain($iArg, $sArgs)
    $ret = DllCall("advapi32.dll", "hwnd", "RegisterServiceCtrlHandler", "ptr", DllStructGetPtr($tServiceName), "ptr", DllCallbackGetPtr($tServiceCtrl));register service
    If $ret[0] = 0 Then
        MsgBox(0, "Error", _WinAPI_GetLastError())
        Exit
    EndIf
    $tService_Status_handle = $ret[0]
    If Not ($tService_Status_handle) Then
        _Service_Cleanup()
        Return
    EndIf
 
    DllStructSetData($tService_Status, "dwServiceType", $SERVICE_WIN32_OWN_PROCESS)
    DllStructSetData($tService_Status, "dwServiceSpecificExitCode", 0);
    ; report the status to the service control manager.
    If Not (_Service_ReportStatus($SERVICE_START_PENDING, $NO_ERROR, 3000)) Then
        _Service_Cleanup()
        Return
    EndIf
    _Service_Start($iArg, $sArgs);
    _Main()
    Return;
EndFunc
 
Func _Service_SetServiceStatus($hServiceStatus, $lpServiceStatus)
    $ret = DllCall("advapi32.dll", "int", "SetServiceStatus", "hwnd", $hServiceStatus, "ptr", $lpServiceStatus)
    Return $ret[0]
EndFunc
 
Func _Service_SetStopEvent()
    If ($service_stop_event) Then _WinAPI_SetEvent($service_stop_event) 
EndFunc 
 
Func _Service_Start($argc, $argv)
    If Not (_Service_ReportStatus($SERVICE_START_PENDING, $NO_ERROR, 3000)) Then Return
    $service_stop_event = _WinAPI_CreateEvent(0, True, False, 0);
    If Not ($service_stop_event) Then Return;
    ;report the status to the service control manager.
    If Not _Service_ReportStatus($SERVICE_START_PENDING, $NO_ERROR, 3000) Then Return;
    ;report the status to the service control manager.
    If Not _Service_ReportStatus($SERVICE_RUNNING, $NO_ERROR, 0) Then Return;
EndFunc
 
#endregion

Shutdown.au3

 

#NoTrayIcon
 
#cs
    NYITSUPPORTShutdown 2.0
    This script will shut down a machine on a schedule.
    The program should be launched as a domain computer startup policy as follows
    \\SERVER\SHARE\NYITSUPPORTShutDown.exe /install
    A policy should be put in that adds a registry key "HKEY_LOCAL_MACHINE\SOFTWARE\NYITSUPPORT\Shutdown", "Shutdown"=2300
    The time is specified in a 4 digit military time format (2330 = 11:30 PM)
    /uninstall will remove the application and registry key
    
    Service.au3 was downloaded from http://www.autoitscript.com/forum/index.php?showtopic=80201
 
; Alex Belenkiy ab@nyitsupport.com
; 02/02/2009
#ce
 
AutoItSetOption ("TrayIconHide",1)
#include <Date.au3>
#include <array.au3>
#include <service.au3>
if not IsAdmin() then Exit
 
Dim $InstallPath
Global $sServiceName = "NYITSUPPORTShutdown"
if $CmdLine[0] = "" then Exit
 
$InstallPath = "C:\Program Files\NYITSUPPORT\ShutDown\"
 
Select
    case $CmdLine [1] = "/uninstall"
        if not FileExists($InstallPath) then Exit
        
        call ("Uninstall")
        
    case $CmdLine [1] = "/install" 
        if $CmdLine[0] <> 2 then Exit
        if $CmdLine [2] = "" then Exit
        if not StringIsDigit ($CmdLine[2]) then Exit
        if stringlen($CmdLine[2]) <> 4 then Exit
        if StringLeft($CmdLine[2], 2) > 23 then Exit
        if StringRight($CmdLine[2], 2) >59 then Exit
 
        Call ("Install")
                            
    case $CmdLine [1] = "/NYITSUPPORTShutdown"
        _Service_init($sServiceName)
        
EndSelect
    
Func Install()
    $ShutdownSplit = StringSplit(RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NYITSUPPORTShutdown", "ImagePath"), " ")
    $Shutdown = $ShutdownSplit[$ShutdownSplit[0]]
    if not @error Then
        if $Shutdown = $CmdLine[2] then Exit
        RunWait (@SystemDir & '\net stop "NYITSUPPORT Shutdown"', "")
        FileCopy (@ScriptFullPath, $InstallPath,9)
        $NewShutdown = $ShutdownSplit[1] & " " 
         for $a = 2 to ($ShutdownSplit[0] - 1)
            $NewShutdown = $NewShutdown & $ShutdownSplit[$a] & " "
        Next
        $NewShutdown = $NewShutdown & $CmdLine[2]
        RegWrite("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NYITSUPPORTShutdown", "ImagePath", "REG_EXPAND_SZ", $NewShutdown)
        RunWait (@SystemDir & '\net start "NYITSUPPORT Shutdown"', "")
        Exit
    Else
        FileCopy (@ScriptFullPath, $InstallPath,9)
        $log = FileOpen("\\server\NYITSUPPORT\ShutDown\Logs\" & @ComputerName & ".log",9)
        _CreateService("",$sServiceName, "NYITSUPPORT Shutdown", $InstallPath & "NYITSUPPORTShutdown.exe /NYITSUPPORTShutdown " & $CmdLine[2])
        If @error Then
            FileWriteLine($log, @CRLF & "_CreateService failed - " & @MON & "/" & @MDAY & "/" & @YEAR & " - " & @HOUR & ":" & @MIN)
        EndIf
        FileWriteLine($log, @CRLF & "Installed - " & @MON & "/" & @MDAY & "/" & @YEAR & " - " & @HOUR & ":" & @MIN)
        RunWait (@SystemDir & '\net start "NYITSUPPORT Shutdown"', "")
        FileClose($log)
        Exit        
    EndIf    
 
EndFunc   ;==>InstallService
 
Func Uninstall()
    $log = FileOpen("\\server\NYITSUPPORT\ShutDown\Logs\" & @ComputerName & ".log",9)
    _StopService(".", $sServiceName)
    if @error then 
        FileWriteLine($log, @CRLF & "_StopService failed - " & @MON & "/" & @MDAY & "/" & @YEAR & " - " & @HOUR & ":" & @MIN)
    EndIf
    _DeleteService(".", $sServiceName)
    if @error then 
        FileWriteLine($log, @CRLF & "_DeleteService failed - " & @MON & "/" & @MDAY & "/" & @YEAR & " - " & @HOUR & ":" & @MIN)
    EndIf
    DirRemove($InstallPath,1)
    FileWriteLine($log, @CRLF & "Uninstalled - " & @MON & "/" & @MDAY & "/" & @YEAR & " - " & @HOUR & ":" & @MIN)
    FileClose($log)
    Exit
EndFunc
 
Func _main()
    if $CmdLine[0] <> 2 then Exit
    if $CmdLine [2] = "" then Exit
    if not StringIsDigit ($CmdLine[2]) then Exit
    if stringlen($CmdLine[2]) <> 4 then Exit
    if StringLeft($CmdLine[2], 2) > 23 then Exit
    if StringRight($CmdLine[2], 2) >59 then Exit
    $H = StringLeft($CmdLine[2],2)
    $M = StringRight($CmdLine[2],2)
 
    While 1
        if @MIN = $M And @HOUR = $H then 
            Run (@SystemDir & '\shutdown.exe /s /f /t 300 /c "Scheduled shutdown in progress. ' & @CRLF & 'Please close all open applications and save your data.' & @crlf & 'The system will shut down in 5 minutes."', "")
            Exit
        EndIf
        sleep (60000)
    WEnd
EndFunc
 

Enjoy!!!

1 comment:

Anonymous said...

Who knows where to download XRumer 5.0 Palladium?
Help, please. All recommend this program to effectively advertise on the Internet, this is the best program!