How do i write a code to close down the computer automatically? This is becuase i wanna write a program like when someone click the command button, then the window will close down by itself. I make it for my game project .... :)
Printable View
How do i write a code to close down the computer automatically? This is becuase i wanna write a program like when someone click the command button, then the window will close down by itself. I make it for my game project .... :)
So, do you want to close the window, or the entire machine? :confused:
This code should help you...
VB Code:
End Type Private Type Luid lowpart As Long highpart As Long End Type Private Type LUID_AND_ATTRIBUTES 'pLuid As Luid pLuid As LARGE_INTEGER Attributes As Long End Type Private Type TOKEN_PRIVILEGES PrivilegeCount As Long Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES End Type Private Declare Function InitiateSystemShutdown Lib "advapi32.dll" Alias "InitiateSystemShutdownA" (ByVal lpMachineName As String, ByVal lpMessage As String, ByVal dwTimeout As Long, ByVal bForceAppsClosed As Long, ByVal bRebootAfterShutdown As Long) As Long Private Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long Private Declare Function GetCurrentProcess Lib "kernel32" () As Long Private Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LARGE_INTEGER) As Long Private Declare Function AdjustTokenPrivileges Lib "advapi32.dll" (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 GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long Private Declare Function GetLastError Lib "kernel32" () As Long Public Function InitiateShutdownMachine(ByVal Machine As String, Optional Force As Variant, Optional Restart As Variant, Optional AllowLocalShutdown As Variant, Optional Delay As Variant, Optional Message As Variant) As Boolean Dim hProc As Long Dim OldTokenStuff As TOKEN_PRIVILEGES Dim OldTokenStuffLen As Long Dim NewTokenStuff As TOKEN_PRIVILEGES Dim NewTokenStuffLen As Long Dim pSize As Long If IsMissing(Force) Then Force = False If IsMissing(Restart) Then Restart = True If IsMissing(AllowLocalShutdown) Then AllowLocalShutdown = False If IsMissing(Delay) Then Delay = 0 If IsMissing(Message) Then Message = "" 'Make sure the Machine-name doesn't start with '\\' If InStr(Machine, "\\") = 1 Then Machine = Right(Machine, Len(Machine) - 2) End If 'check if it's the local machine that's going to be shutdown If (LCase(GetMyMachineName) = LCase(Machine)) Then 'may we shut this computer down? If AllowLocalShutdown = False Then Exit Function 'open access token If OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, hProc) = 0 Then MsgBox "OpenProcessToken Error: " & GetLastError() Exit Function End If 'retrieve the locally unique identifier to represent the Shutdown-privilege name If LookupPrivilegeValue(vbNullString, SE_SHUTDOWN_NAME, OldTokenStuff.Privileges(0).pLuid) = 0 Then MsgBox "LookupPrivilegeValue Error: " & GetLastError() Exit Function End If NewTokenStuff = OldTokenStuff NewTokenStuff.PrivilegeCount = 1 NewTokenStuff.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED NewTokenStuffLen = Len(NewTokenStuff) pSize = Len(NewTokenStuff) 'Enable shutdown-privilege If AdjustTokenPrivileges(hProc, False, NewTokenStuff, NewTokenStuffLen, OldTokenStuff, OldTokenStuffLen) = 0 Then MsgBox "AdjustTokenPrivileges Error: " & GetLastError() Exit Function End If 'initiate the system shutdown If InitiateSystemShutdown("\\" & Machine, Message, Delay, Force, Restart) = 0 Then Exit Function End If NewTokenStuff.Privileges(0).Attributes = 0 'Disable shutdown-privilege If AdjustTokenPrivileges(hProc, False, NewTokenStuff, Len(NewTokenStuff), OldTokenStuff, Len(OldTokenStuff)) = 0 Then Exit Function End If Else 'initiate the system shutdown If InitiateSystemShutdown("\\" & Machine, Message, Delay, Force, Restart) = 0 Then Exit Function End If End If InitiateShutdownMachine = True End Function Function GetMyMachineName() As String Dim sLen As Long 'create a buffer GetMyMachineName = Space(100) sLen = 100 'retrieve the computer name If GetComputerName(GetMyMachineName, sLen) Then GetMyMachineName = Left(GetMyMachineName, sLen) End If End Function Private Sub Command1_Click() InitiateShutdownMachine GetMyMachineName, True, True, True, 60, "You initiated a system shutdown..." End Sub Private Sub Form_Load() End Sub
:)VB Code:
Option Explicit Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long Const EWX_LOGOFF = 0 Const EWX_SHUTDOWN = 1 Const EWX_REBOOT = 2 Const EWX_FORCE = 4 Private Sub Command1_Click() ExitWindowsEx EWX_FORCE Or EWX_SHUTDOWN , 0 End Sub
shell shutdown.exe -s
simple?
shutdown.exe is OS version specific. ;)
Whilst ExitWindowsEx is supported by every post Win3.1 OS the following needs to be taken into consideration:
Quote:
from MDSN:
Windows Me/98/95: Because of the design of the shell, calling ExitWindowsEx with EWX_FORCE fails to completely log off the user (the system terminates the applications and displays the Enter Windows Password dialog box, however, the user's desktop remains.) To log off the user forcibly, terminate the Explorer process before calling ExitWindowsEx with EWX_LOGOFF and EWX_FORCE.
...
Console processes receive a separate notification message, CTRL_SHUTDOWN_EVENT or CTRL_LOGOFF_EVENT, as the situation warrants. A console process routes these messages to its HandlerRoutine function. ExitWindowsEx sends these notification messages asynchronously; thus, an application cannot assume that the console notification messages have been handled when a call to ExitWindowsEx returns.
...
Windows Me/98/95: ExitWindowsEx does not work from a console application.
Jamie_Garland, your code has a problem. You start with 'End Type' and you use 'pLuid As LARGE_INTEGER'
What is 'LARGE_INTEGER' ?
I would like to know how to shut down a PC...saves on all PC hardware and protects it too.
LARGE_INTEGER is a structure used to represent a 64 bit integer. Each element in the structure represents a 32 bit integer.
VB Code:
Private Type LARGE_INTEGER Lowpart As Long ' Low order 32 bits Highpart As Long ' High order 32 bits End Type
The shut-Down code is becoming closer to running...
What about 'ANYSIZE_ARRAY' ?Code:Private Type TOKEN_PRIVILEGES
PrivilegeCount As Long
Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
End Type
Incert any whole number?
Thanks
ANYSIZE_ARRAY is a constant with the value of 1
VB Code:
Private Const ANYSIZE_ARRAY As Long = 1
Copy and Paste the constant above the TOKEN_PRIVILEGES structure.
You like doing things the hard way? :D My code does work and is very simple and easy. ;)
Sir Rob, I know you are a very bright person, and your code did not work on my XP home computer, but I will try again on a different computer that has VB6 pro loaded.
Also, over half the code I use, find, locate I really don't understand, yet I normally know how to use it. Thanks for being here.
Did you place the code from #4 behind a form in a new project, run, and still nothing?
OpenProcessToken Error: 5
Nope, still not working....maybe I am doing something wrong?
Code:
Private Const ANYSIZE_ARRAY As Long = 1
Private Type LARGE_INTEGER
Lowpart As Long ' Low order 32 bits
Highpart As Long ' High order 32 bits
End Type
Private Type Luid
Lowpart As Long
Highpart As Long
End Type
Private Type LUID_AND_ATTRIBUTES
'pLuid As Luid
pLuid As LARGE_INTEGER
Attributes As Long
End Type
Private Type TOKEN_PRIVILEGES
PrivilegeCount As Long
Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
End Type
Private Declare Function InitiateSystemShutdown Lib "advapi32.dll" Alias "InitiateSystemShutdownA" (ByVal lpMachineName As String, ByVal lpMessage As String, ByVal dwTimeout As Long, ByVal bForceAppsClosed As Long, ByVal bRebootAfterShutdown As Long) As Long
Private Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LARGE_INTEGER) As Long
Private Declare Function AdjustTokenPrivileges Lib "advapi32.dll" (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 GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long
Private Declare Function GetLastError Lib "kernel32" () As Long
Public Function InitiateShutdownMachine(ByVal Machine As String, Optional Force As Variant, Optional Restart As Variant, Optional AllowLocalShutdown As Variant, Optional Delay As Variant, Optional Message As Variant) As Boolean
Dim hProc As Long
Dim OldTokenStuff As TOKEN_PRIVILEGES
Dim OldTokenStuffLen As Long
Dim NewTokenStuff As TOKEN_PRIVILEGES
Dim NewTokenStuffLen As Long
Dim pSize As Long
If IsMissing(Force) Then Force = False
If IsMissing(Restart) Then Restart = True
If IsMissing(AllowLocalShutdown) Then AllowLocalShutdown = False
If IsMissing(Delay) Then Delay = 0
If IsMissing(Message) Then Message = ""
'Make sure the Machine-name doesn't start with '\'
If InStr(Machine, "\\") = 1 Then
Machine = Right(Machine, Len(Machine) - 2)
End If
'check if it's the local machine that's going to be shutdown
If (LCase(GetMyMachineName) = LCase(Machine)) Then
'may we shut this computer down?
If AllowLocalShutdown = False Then Exit Function
'open access token
If OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, hProc) = 0 Then
MsgBox "OpenProcessToken Error: " & GetLastError()
Exit Function
End If
'retrieve the locally unique identifier to represent the Shutdown-privilege name
If LookupPrivilegeValue(vbNullString, SE_SHUTDOWN_NAME, OldTokenStuff.Privileges(0).pLuid) = 0 Then
MsgBox "LookupPrivilegeValue Error: " & GetLastError()
Exit Function
End If
NewTokenStuff = OldTokenStuff
NewTokenStuff.PrivilegeCount = 1
NewTokenStuff.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
NewTokenStuffLen = Len(NewTokenStuff)
pSize = Len(NewTokenStuff)
'Enable shutdown-privilege
If AdjustTokenPrivileges(hProc, False, NewTokenStuff, NewTokenStuffLen, OldTokenStuff, OldTokenStuffLen) = 0 Then
MsgBox "AdjustTokenPrivileges Error: " & GetLastError()
Exit Function
End If
'initiate the system shutdown
If InitiateSystemShutdown("\\" & Machine, Message, Delay, Force, Restart) = 0 Then
Exit Function
End If
NewTokenStuff.Privileges(0).Attributes = 0
'Disable shutdown-privilege
If AdjustTokenPrivileges(hProc, False, NewTokenStuff, Len(NewTokenStuff), OldTokenStuff, Len(OldTokenStuff)) = 0 Then
Exit Function
End If
Else
'initiate the system shutdown
If InitiateSystemShutdown("\\" & Machine, Message, Delay, Force, Restart) = 0 Then
Exit Function
End If
End If
InitiateShutdownMachine = True
End Function
Function GetMyMachineName() As String
Dim sLen As Long
'create a buffer
GetMyMachineName = Space(100)
sLen = 100
'retrieve the computer name
If GetComputerName(GetMyMachineName, sLen) Then
GetMyMachineName = Left(GetMyMachineName, sLen)
End If
End Function
Private Sub Command1_Click()
InitiateShutdownMachine GetMyMachineName, True, True, True, 60, "You initiated a system shutdown..."
End Sub
Weird, on my XP system it doesnt work but the logof forced does.
Maybe its a SP-2 security thing?VB Code:
Option Explicit Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long Private Const EWX_LOGOFF As Long = 0 Private Const EWX_SHUTDOWN As Long = 1 Private Const EWX_REBOOT As Long = 2 Private Const EWX_FORCE As Long = 4 Private Const EWX_POWEROFF As Long = &H8 Private Const EWX_FORCEIFHUNG As Long = &H10 Private Sub Command1_Click() ExitWindowsEx EWX_FORCE Or EWX_LOGOFF, 0 End Sub
VB Code:
' Shutdown Flags Const EWX_LOGOFF = 0 Const EWX_SHUTDOWN = 1 Const EWX_REBOOT = 2 Const EWX_FORCE = 4 Const SE_PRIVILEGE_ENABLED = &H2 Const TokenPrivileges = 3 Const TOKEN_ASSIGN_PRIMARY = &H1 Const TOKEN_DUPLICATE = &H2 Const TOKEN_IMPERSONATE = &H4 Const TOKEN_QUERY = &H8 Const TOKEN_QUERY_SOURCE = &H10 Const TOKEN_ADJUST_PRIVILEGES = &H20 Const TOKEN_ADJUST_GROUPS = &H40 Const TOKEN_ADJUST_DEFAULT = &H80 Const SE_SHUTDOWN_NAME = "SeShutdownPrivilege" Const ANYSIZE_ARRAY = 1 Private Type LARGE_INTEGER lowpart As Long highpart As Long End Type Private Type Luid lowpart As Long highpart As Long End Type Private Type LUID_AND_ATTRIBUTES 'pLuid As Luid pLuid As LARGE_INTEGER Attributes As Long End Type Private Type TOKEN_PRIVILEGES PrivilegeCount As Long Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES End Type Private Declare Function InitiateSystemShutdown Lib "advapi32.dll" Alias "InitiateSystemShutdownA" (ByVal lpMachineName As String, ByVal lpMessage As String, ByVal dwTimeout As Long, ByVal bForceAppsClosed As Long, ByVal bRebootAfterShutdown As Long) As Long Private Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long Private Declare Function GetCurrentProcess Lib "kernel32" () As Long Private Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LARGE_INTEGER) As Long Private Declare Function AdjustTokenPrivileges Lib "advapi32.dll" (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 GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long Private Declare Function GetLastError Lib "kernel32" () As Long Public Function InitiateShutdownMachine(ByVal Machine As String, Optional Force As Variant, Optional Restart As Variant, Optional AllowLocalShutdown As Variant, Optional Delay As Variant, Optional Message As Variant) As Boolean Dim hProc As Long Dim OldTokenStuff As TOKEN_PRIVILEGES Dim OldTokenStuffLen As Long Dim NewTokenStuff As TOKEN_PRIVILEGES Dim NewTokenStuffLen As Long Dim pSize As Long If IsMissing(Force) Then Force = False If IsMissing(Restart) Then Restart = True If IsMissing(AllowLocalShutdown) Then AllowLocalShutdown = False If IsMissing(Delay) Then Delay = 0 If IsMissing(Message) Then Message = "" 'Make sure the Machine-name doesn't start with '\\' If InStr(Machine, "\\") = 1 Then Machine = Right(Machine, Len(Machine) - 2) End If 'check if it's the local machine that's going to be shutdown If (LCase(GetMyMachineName) = LCase(Machine)) Then 'may we shut this computer down? If AllowLocalShutdown = False Then Exit Function 'open access token If OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, hProc) = 0 Then MsgBox "OpenProcessToken Error: " & GetLastError() Exit Function End If 'retrieve the locally unique identifier to represent the Shutdown-privilege name If LookupPrivilegeValue(vbNullString, SE_SHUTDOWN_NAME, OldTokenStuff.Privileges(0).pLuid) = 0 Then MsgBox "LookupPrivilegeValue Error: " & GetLastError() Exit Function End If NewTokenStuff = OldTokenStuff NewTokenStuff.PrivilegeCount = 1 NewTokenStuff.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED NewTokenStuffLen = Len(NewTokenStuff) pSize = Len(NewTokenStuff) 'Enable shutdown-privilege If AdjustTokenPrivileges(hProc, False, NewTokenStuff, NewTokenStuffLen, OldTokenStuff, OldTokenStuffLen) = 0 Then MsgBox "AdjustTokenPrivileges Error: " & GetLastError() Exit Function End If 'initiate the system shutdown If InitiateSystemShutdown("\\" & Machine, Message, Delay, Force, Restart) = 0 Then Exit Function End If NewTokenStuff.Privileges(0).Attributes = 0 'Disable shutdown-privilege If AdjustTokenPrivileges(hProc, False, NewTokenStuff, Len(NewTokenStuff), OldTokenStuff, Len(OldTokenStuff)) = 0 Then Exit Function End If Else 'initiate the system shutdown If InitiateSystemShutdown("\\" & Machine, Message, Delay, Force, Restart) = 0 Then Exit Function End If End If InitiateShutdownMachine = True End Function Function GetMyMachineName() As String Dim sLen As Long 'create a buffer GetMyMachineName = Space(100) sLen = 100 'retrieve the computer name If GetComputerName(GetMyMachineName, sLen) Then GetMyMachineName = Left(GetMyMachineName, sLen) End If End Function Private Sub Form_Load() 'KPD-Team 2000 'URL: [url]http://www.allapi.net/[/url] 'E-Mail: [email][email protected][/email] InitiateShutdownMachine GetMyMachineName, True, True, True, 60, "You initiated a system shutdown..." End Sub
Here is the code you need, this reboots the computer.
Jenova, the code is working. This will allow me to turn off all PC at night.
The Task Manager will run it. Once I make some small...very small changes I will summit for your approval for the Forumn.