PDA

View Full Version : Shut down không như ý muốn



duckhoan
12-11-2004, 15:44
Mình dùng hàm API ExitWindownEx để thoát khỏi Windown nhưng với WIN98 nó tắt nguồn sau khi tắt máy nhưng với WINXP sau khi tắt máy không tự tắt nguồn mà hiện thông báo "It is Safe to Turn off your Comptuter"> Xin hỏi các cao thủ làm sao cho nó tự tắt nguồn sau khi Shut down XP như khi chọn Chức năng của Shutdown WinXP nó tự tắt nguồn vậy. Có cần dùng hàm API nào khác không hay có cách nào khác không? Xin "Help Me!"

duckhoan
13-11-2004, 09:27
Cao thủ đâu rồi giúp mình với. Sao không có ai vậy trời? Chẳng lẽ đành pó tay sao? Nhiều người làm được thế sao tui không làm được vậy chời?

THE LAST LEAF
15-11-2004, 17:10
Ko hieu bạn chỉ dùng ExitWindow*** không thôi mà có thể Shutdown được WinXP ? Win NT mà không cần xin Privileges à?

tapsu
16-11-2004, 08:14
Chào,

Private Type LUID
LowPart As Long
HighPart As Long
End Type

Private Type TOKEN_PRIVILEGES
PrivilegeCount As Long
LuidUDT As LUID
Attributes As Long
End Type

Private Declare Function AdjustTokenPrivileges Lib "advapi32" ( _
ByVal TokenHandle As Long, _
ByVal DisableAllPrivileges As Long, _
ByRef NewState As TOKEN_PRIVILEGES, _
ByVal BufferLength As Long, _
ByRef PreviousState As Any, _
ByRef ReturnLength As Any _
) As Long
Private Declare Function ExitWindow*** Lib "user32" ( _
ByVal dwOptions As Long, _
ByVal dwReserved As Long _
) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" ( _
) As Long
Private Declare Function GetVersion Lib "kernel32" () As Long
Private Declare Function LookupPrivilegeValueA Lib "advapi32" ( _
ByVal lpSystemName As String, _
ByVal lpName As String, _
ByRef lpLuid As LUID _
) As Long
Private Declare Function OpenProcessToken Lib "advapi32" ( _
ByVal ProcessHandle As Long, _
ByVal DesiredAccess As Long, _
ByRef TokenHandle As Long _
) As Long

Public Sub ShutDown( _
Optional ByVal Reboot As Boolean = False, _
Optional ByVal Force As Boolean = False _
)
Const EWX_SHUTDOWN = 1
Const EWX_REBOOT = 2
Const EWX_FORCE = 4
Const EWX_POWEROFF = 8
Const SE_PRIVILEGE_ENABLED = &H2
Const TOKEN_ADJUST_PRIVILEGES = &H20
Const TOKEN_QUERY = &H8

Dim Flags As Long
Dim Token As Long
Dim TP As TOKEN_PRIVILEGES

'WinNT/2000 needs special privileges:
If GetVersion() >= 0 Then
OpenProcessToken _
GetCurrentProcess(), _
TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, Token
LookupPrivilegeValueA _
"", "SeShutdownPrivilege", TP.LuidUDT
TP.PrivilegeCount = 1
TP.Attributes = SE_PRIVILEGE_ENABLED
AdjustTokenPrivileges _
Token, False, TP, 0, ByVal 0&, ByVal 0&
End If

'Shutdown execute
Flags = EWX_SHUTDOWN
If Reboot Then
Flags = Flags Or EWX_REBOOT
Else
Flags = Flags Or EWX_POWEROFF
End If
If Force Then Flags = Flags Or EWX_FORCE
ExitWindow*** Flags, &HFFFF
End Sub

bye

duckhoan
16-11-2004, 12:44
Cảm ơn bạn rất nhiều, mình cũng làm cách như vậy nhưng mình không biết hằng TOKEN_QUERY = &H8, mình truyền nó làm tham số cho hàm ExitWindow*** trong chức năng Shutdown thì máy đã tự tắt nguồn sau khi thoát khỏi Xp. Cảm ơn bạn!