Wednesday, April 29, 2009

Turn-Off Win NT

'Turn off Win NT
'Needs 1 module and 3 common button


'In a module


Private Const EWX_LOGOFF = 0

Private Const EWX_SHUTDOWN = 1

Private Const EWX_REBOOT = 2

Private Const EWX_FORCE = 4

Private Const TOKEN_ADJUST_PRIVILEGES = &H20

Private Const TOKEN_QUERY = &H8

Private Const SE_PRIVILEGE_ENABLED = &H2

Private Const ANYSIZE_ARRAY = 1

Private Const VER_PLATFORM_WIN32_NT = 2



Type OSVERSIONINFO

   
dwOSVersionInfoSize As Long

   
dwMajorVersion As Long

   
dwMinorVersion As Long

   
dwBuildNumber As Long

   
dwPlatformId As Long

   
szCSDVersion As String * 128

End Type



Type LUID

   
LowPart As Long

   
HighPart As Long

End Type



Type LUID_AND_ATTRIBUTES

   
pLuid As LUID

   
Attributes As Long

End Type



Type TOKEN_PRIVILEGES

   
PrivilegeCount As Long

   
Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES

End Type



Private Declare Function GetCurrentProcess
Lib "kernel32" ()
As Long

Private Declare Function OpenProcessToken
Lib "advapi32" _

(ByVal ProcessHandle As Long,
ByVal DesiredAccess As Long, _

TokenHandle As Long) As Long

Private Declare Function LookupPrivilegeValue
Lib "advapi32"
Alias _

"LookupPrivilegeValueA" (ByVal lpSystemName
As String, _

ByVal lpName As String, lpLuid
As LUID) As Long

Private Declare Function AdjustTokenPrivileges
Lib "advapi32" _

(ByVal TokenHandle As Long,
ByVal DisableAllPrivileges As Long, _

NewState As TOKEN_PRIVILEGES,
ByVal BufferLength As Long, _

PreviousState As TOKEN_PRIVILEGES, ReturnLength
As Long) As Long

Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags
As Long, _

ByVal dwReserved As Long)
As Long

Private Declare Function GetVersionEx Lib "kernel32"
Alias "GetVersionExA" _

(ByRef lpVersionInformation As
OSVERSIONINFO) As Long



'Detect if the program is running under Windows NT

Public Function IsWinNT()
As Boolean

    Dim myOS As
OSVERSIONINFO

   
myOS.dwOSVersionInfoSize = Len(myOS)

   
GetVersionEx myOS

    IsWinNT = (myOS.dwPlatformId = VER_PLATFORM_WIN32_NT)

End Function



'set the shut down privilege for the current application

Private Sub EnableShutDown()

    Dim hProc, hToken
As Long

    Dim mLUID As
LUID

    Dim mPriv, mNewPriv
As TOKEN_PRIVILEGES

   
hProc = GetCurrentProcess()

   
OpenProcessToken hProc, TOKEN_ADJUST_PRIVILEGES + _

   
TOKEN_QUERY, hToken

   
LookupPrivilegeValue "", "SeShutdownPrivilege", mLUID

   
mPriv.PrivilegeCount = 1

   
mPriv.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED

   
mPriv.Privileges(0).pLuid = mLUID

   
' enable shutdown privilege for the current application


   
AdjustTokenPrivileges hToken, False, mPriv, 4 + (12 * mPriv.PrivilegeCount), _

   
mNewPriv, 4 + (12 * mNewPriv.PrivilegeCount)

End Sub



' Shut Down NT

Public Sub ShutDownNT(Force
As Boolean)

   
Dim
ret , Flags As Long

   
Flags = EWX_SHUTDOWN

   
If
Force Then Flags = Flags + EWX_FORCE

   
If
IsWinNT Then EnableShutDown

   
ExitWindowsEx Flags, 0

End Sub



'Restart NT

Public Sub RebootNT(Force
As Boolean)

    Dim ret , Flags
As Long

   
Flags = EWX_REBOOT

   
If
Force Then Flags = Flags + EWX_FORCE

   
If
IsWinNT Then EnableShutDown

   
ExitWindowsEx Flags, 0

End Sub



'Log off the current user

Public Sub LogOffNT(Force As Boolean)

    Dim ret , Flags
As Long

   
Flags = EWX_LOGOFF

   
If
Force Then Flags = Flags + EWX_FORCE

If IsWinNT Then EnableShutDown

   
ExitWindowsEx Flags, 0

End Sub



'In a form

Private Sub Command1_Click()

   
LogOffNT True

End Sub



Private Sub Command2_Click()

   
RebootNT True

End Sub



Private Sub Command3_Click()

   
ShutDownNT True

End Sub



Private Sub Form_Load()

   
Command1.Caption = "Log Off NT"

   
Command2.Caption = "Reboot NT"

   
Command3.Caption = "Shutdown NT"

End Sub

 

No comments:

Post a Comment