PDA

View Full Version : Turn Off Computer



Ali_Fallah
جمعه 20 مرداد 1385, 10:16 صبح
این برنامه رو هم ببینید.
فکر کنم بد نباشه.
ممنون

شاپرک
شنبه 21 مرداد 1385, 07:37 صبح
از این ماجول هم می تونید استفاده کنید :


Private Declare Function apiExitWindowsEx _
Lib "user32" _
Alias "ExitWindowsEx" _
(ByVal dwOptions As Long, _
ByVal dwReserved As Long) _
As Long

'Const for the dwOptions
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 = 8

Private Const EWX_FORCEIFHUNG As Long = 10

'Because you can't use the AdjustToken in W9x
'must check what is the system
Private Declare Function apiGetVersion _
Lib "Kernel32.dll" _
Alias "GetVersion" _
() As Long

Private Const OS_NT = 0
Private Const OS_W9x = 1

Private Type LUID
LowPart As Long
HighPart As Long 'unused
End Type

'This one was obtained from a KB article,
'still need to understand what is going on
Private Type TOKEN_PRIVILEGES
PrivilegeCount As Long
pLuid As LUID
Attributes As Long
End Type

'This is the way that this UDT is defined on the WINNT.h
'Private Const ANYSIZE_ARRAY = 1
'Type TOKEN_PRIVILEGES
' PrivilegeCount As Long
' Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
'End Type
'Private Type LUID_AND_ATTRIBUTES
' pLuid As LUID
' Attributes As Long
'End Type

'Const for the Attributes of the TOKEN_PRIVILEGES/LUID_AND_ATTRIBUTES
Private Const SE_PRIVILEGE_ENABLED = &H2
Private Const SE_PRIVILEGE_ENABLED_BY_DEFAULT = &H1
Private Const SE_PRIVILEGE_USED_FOR_ACCESS = &H80000000

'First we need to get a processHandle to pass
'to the API that get the TokenHandle
Private Declare Function apiGetCurrentProcess _
Lib "Kernel32.dll" _
Alias "GetCurrentProcess" _
() As Long

'Get the TokenHandle
Private Declare Function apiOpenProcessToken _
Lib "advapi32.dll" _
Alias "OpenProcessToken" _
(ByVal ProcessHandle As Long, _
ByVal DesiredAccess As Long, _
TokenHandle As Long) _
As Long
'Const used in the DesiredAccess, Not from the WIN32API but from WINNT.h
'--- const Used in some of the tokens ---
Private Const READ_CONTROL = &H20000
Private Const STANDARD_RIGHTS_REQUIRED = &HF0000
Private Const STANDARD_RIGHTS_EXECUTE = (READ_CONTROL)
Private Const STANDARD_RIGHTS_READ = (READ_CONTROL)
Private Const STANDARD_RIGHTS_WRITE = (READ_CONTROL)
'--- End
Private Const TOKEN_ADJUST_PRIVILEGES = &H20
'Required to query an access token.
Private Const TOKEN_QUERY = &H8
'Required to change the default owner, primary group, or DACL of an access token.
Private Const TOKEN_ADJUST_DEFAULT = &H80
'Required to adjust the attributes of the groups in an access token.
Private Const TOKEN_ADJUST_GROUPS = &H40
'Required to duplicate an access token.
Private Const TOKEN_DUPLICATE = &H2
'Required to attach an impersonation access token to a process.
Private Const TOKEN_IMPERSONATE = &H4
'Required to query the source of an access token.
Private Const TOKEN_QUERY_SOURCE = &H10
'Don't Known what does ---Start
Private Const TOKEN_ASSIGN_PRIMARY = &H1
Private Const TOKEN_ADJUST_SESSIONID = &H100
'---End
'Combines STANDARD_RIGHTS_EXECUTE and TOKEN_IMPERSONATE.
Private Const TOKEN_EXECUTE = STANDARD_RIGHTS_EXECUTE And TOKEN_IMPERSONATE
'Combines STANDARD_RIGHTS_READ and TOKEN_QUERY.
Private Const TOKEN_READ = STANDARD_RIGHTS_READ And TOKEN_QUERY
'Combines STANDARD_RIGHTS_WRITE, TOKEN_ADJUST_PRIVILEGES, TOKEN_ADJUST_GROUPS, and TOKEN_ADJUST_DEFAULT.
Private Const TOKEN_WRITE = STANDARD_RIGHTS_WRITE And TOKEN_ADJUST_PRIVILEGES And TOKEN_ADJUST_GROUPS And TOKEN_ADJUST_DEFAULT
'Combines all possible access rights for a token.
Private Const TOKEN_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED And _
TOKEN_ASSIGN_PRIMARY And _
TOKEN_DUPLICATE And _
TOKEN_IMPERSONATE And _
TOKEN_QUERY And _
TOKEN_QUERY_SOURCE And _
TOKEN_ADJUST_PRIVILEGES And _
TOKEN_ADJUST_GROUPS And _
TOKEN_ADJUST_SESSIONID And _
TOKEN_ADJUST_DEFAULT

'I need this one to get the LUID for the privilege i want to obtain
Private Declare Function apiLookupPrivilegeValue _
Lib "advapi32.dll" _
Alias "LookupPrivilegeValueA" _
(ByVal lpSystemName As String, _
ByVal lpname As String, _
lpLuid As LUID) _
As Long
'Const for the lpname
Private Const SE_SHUTDOWN_NAME = "SeShutdownPrivilege"

'This is to set the shutdown privileges to the process
Private Declare Function apiAdjustTokenPrivileges _
Lib "advapi32.dll" _
Alias "AdjustTokenPrivileges" _
(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

Sub ShutdownWindows()
Dim lngRet As Long
Dim lngOSVersion As Long

lngOSVersion = GetOS_Version()
If lngOSVersion = OS_NT Then
Debug.Print lngOSVersion & "NT"
SetPermissionToken
Else
Debug.Print lngOSVersion & "W9x"
End If
lngRet = apiExitWindowsEx(EWX_LogOff And EWX_FORCEIFHUNG, 0)

End Sub

Private Function GetOS_Version() As Byte
Dim lngVer As Long

lngVer = apiGetVersion()
If ((lngVer And &H80000000) = 0) Then
GetOS_Version = 0
Else
GetOS_Version = 1
End If

End Function

Private Sub SetPermissionToken()
Dim lngRet As Long
Dim hProcess As Long
Dim hToken As Long
Dim udtLUID_get As LUID
Dim udtTokenP_old As TOKEN_PRIVILEGES
Dim udtTokenP_new As TOKEN_PRIVILEGES
Dim lBufferNeeded As Long

hProcess = apiGetCurrentProcess()
lngRet = apiOpenProcessToken(hProcess, _
TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, _
hToken)
lngRet = apiLookupPrivilegeValue(vbNullString, _
SE_SHUTDOWN_NAME, _
udtLUID_get)
With udtTokenP_new
.PrivilegeCount = 1
.pLuid = udtLUID_get
.Attributes = SE_PRIVILEGE_ENABLED
End With
lngRet = apiAdjustTokenPrivileges(hToken, _
False, _
udtTokenP_new, _
Len(udtTokenP_old), _
udtTokenP_old, _
lBufferNeeded)
End Sub