Shutdown from applicationTag(s): WinAPI/Registry
[PB external function declaration] FUNCTION boolean ExitWindowsEx(ulong uFlags, long dwReserved ) & LIBRARY 'user32.dll' [Powerscript] ulong EWX_LOGOFF = 0 ulong EWX_SHUTDOWN = 1 ulong EWX_REBOOT = 2 ExitWindowsEx(EWX_REBOOT, 0)
[structure definitions]
luid
        unsignedlong    lowpart
        long            highpart
luid_and_attributes
        luid            pluid
        long            attributes
token_privileges
        long            privilegecount
        luid_and_attributes  privileges
[functions declaration]
Function long OpenProcessToken &
 (long ProcessHandle, long DesiredAccess, ref long TokenHandle) &
   Library "ADVAPI32.DLL"
Function long GetCurrentProcess () Library "kernel32"
Function long LookupPrivilegeValue &
  (string lpSystemName,  string lpName, ref LUID lpLUID) &
  Library "ADVAPI32.DLL" Alias for "LookupPrivilegeValueA"
Function long AdjustTokenPrivileges &
  (long TokenHandle, long DisableAllPrivileges, &
   ref TOKEN_PRIVILEGES newstate, long BufferLength, &
   ref TOKEN_PRIVILEGES PreviousState, ref long ReturnLength) &
  Library "ADVAPI32.DLL"
Function long CloseHandle (long hObject) Library "kernel32"
FUNCTION long ExitWindowsEx(uint Flags, long dwReserved) &
  LIBRARY "User32.dll"
[Powerscript]
Constant string SE_SHUTDOWN_NAME = "SeShutdownPrivilege"
Constant long SE_PRIVILEGE_ENABLED = 2
Constant long TOKEN_ADJUST_PRIVILEGES = 32
Constant long TOKEN_QUERY = 8
CONSTANT long TokenDefaultDacl = 6
CONSTANT long TokenGroups = 2
CONSTANT long TokenImpersonationLevel = 9
CONSTANT long TokenOwner = 4
CONSTANT long TokenPrimaryGroup = 5
CONSTANT long TokenPrivileges = 3
CONSTANT long TokenSource = 7
CONSTANT long TokenStatistics = 10
CONSTANT long TokenType = 8
CONSTANT long TokenUser = 1
CONSTANT INTEGER EWX_LOGOFF = 0
CONSTANT INTEGER EWX_SHUTDOWN = 1
CONSTANT INTEGER EWX_REBOOT = 2
CONSTANT INTEGER EWX_FORCE = 4
// author Philip Salgannik
LUID tLUID
ULong hProcess
Long hToken
TOKEN_PRIVILEGES tTPOld,  tTP
Long lTpOld, lR, ll_size
string ls_null
boolean NTEnableShutDown
SetNull(ls_null)
lR = LookupPrivilegeValue(ls_null, SE_SHUTDOWN_NAME, tLUID)
IF (lR <> 0) THEN
    // Get the current process handle:
    hProcess = GetCurrentProcess()
    IF (hProcess <> 0) THEN
       lR = OpenProcessToken &
               (hProcess, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hToken)
        IF (lR <> 0) THEN
           //Ok we can now adjust the shutdown priviledges:
           tTP.PrivilegeCount = 1
           tTP.Privileges.Attributes = SE_PRIVILEGE_ENABLED
           tTP.Privileges.pLuid.HighPart = tLUID.HighPart
           tTP.Privileges.pLuid.LowPart = tLUID.LowPart
           //Now allow this process to shutdown the system:
           ll_size = 16 //sizeof(tTP)
           lR = AdjustTokenPrivileges&
                  (hToken, 0, tTP, ll_size, tTPOld, lTpOld)
           IF (lR <> 0) THEN
              NTEnableShutDown = True
           ELSE
              MessageBox &
               ("Error", "You do not have the privileges to shutdown")
           END IF
           CloseHandle(hToken)
        END IF
    END IF
END IF
IF NOT NTEnableShutDown THEN RETURN
lR = ExitWindowsEx(ewx_shutdown, 0)
IF (lR = 0) THEN
   MessageBox("Error", "ShutdownSystem failed")
   RETURN
ELSE
   RETURN
END IF
  mail_outline
Send comment, question or suggestion to howto@rgagnon.com
Send comment, question or suggestion to howto@rgagnon.com
