Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As LongPrivate Sub cmdcolse_Click()
'关机ExitWindowsEx 1, 0
End SubPrivate Sub cmdreboot_Click()
'重新启动ExitWindowsEx 2, 0
End Sub'在win2000用vb
'我调用api函数,为什么没有用,我点击button,没有反映
'请问各位高人,我的程序哪里有错
'在win2000下用vb重新启动和关机,注销user,还有其他方法吗?
'关机ExitWindowsEx 1, 0
End SubPrivate Sub cmdreboot_Click()
'重新启动ExitWindowsEx 2, 0
End Sub'在win2000用vb
'我调用api函数,为什么没有用,我点击button,没有反映
'请问各位高人,我的程序哪里有错
'在win2000下用vb重新启动和关机,注销user,还有其他方法吗?
解决方案 »
- 网页截取
- 关于pdf文档编程问题,哪里有pdf的sdk下载.
- 不用定时器,怎样才能在状态栏显示时间包括秒,如"HH:MM:SS",设置状态栏的属性为什么不会显示秒?谢谢。
- vsflexgrid的问题
- 紧急求助:打包安装运行出现“ActiveX无法创建部件”的错误如何解决?
- 新手求帮忙。能看的大哥们都帮忙看看
- msdn突然打不开了,重新安装也不能解决。不知各位朋友遇见此类问题没有?
- 请教大家一个问题关于文本框与图片框的问题?(来者有分)
- 有没有谁知道在VB中有没有类似于Delphi中loadformfile和saveformfile的方法啊!
- 菜鸟请您推荐几本vb的书
- 求Adaptive Server Anywhere 6.0安装程序下载地址!
- 高分征解,来者有分,有没有那位老兄用VB写过域名查询程序?能说说具体实现思路和提供部分参考代码吗?
---------------------------------------------------------------
由于NT下关机还要获得相应的权限,你可以使用下面的代码
AdjustTokenPrivilegesForNT'先获得权限
ExitWindowsEx uFlags, 0
下面是相关的函数
Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
Public Const EWX_LOGOFF = 0
Public Const EWX_SHUTDOWN = 1
Public Const EWX_REBOOT = 2
Public Const EWX_FORCE = 4
Public Const TOKEN_ADJUST_PRIVILEGES = &H20
Public Const TOKEN_QUERY = &H8
Public Const SE_PRIVILEGE_ENABLED = &H2
Public Const ANYSIZE_ARRAY = 1
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
Declare Function GetCurrentProcess Lib "kernel32" () As Long
Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long
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
Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
Sub AdjustTokenPrivilegesForNT()
Dim hdlProcessHandle As Long
Dim hdlTokenHandle As Long
Dim tmpLuid As LUID
Dim tkp As TOKEN_PRIVILEGES
Dim tkpNewButIgnored As TOKEN_PRIVILEGES
Dim lBufferNeeded As Long
hdlProcessHandle = GetCurrentProcess()
OpenProcessToken hdlProcessHandle, (TOKEN_ADJUST_PRIVILEGES Or _
TOKEN_QUERY), hdlTokenHandle
LookupPrivilegeValue "", "SeShutdownPrivilege", tmpLuid
tkp.PrivilegeCount = 1
tkp.Privileges(0).pLuid = tmpLuid
tkp.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
AdjustTokenPrivileges hdlTokenHandle, False, tkp, _
Len(tkpNewButIgnored), tkpNewButIgnored, _
lBufferNeeded
End Sub
---------------------------------------------------------------
这是我做的一个定时关机的程序
Option Explicit
Dim mDattime As Date
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) 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 Long, ReturnLength As Long) As Long
Private Declare Function GetTokenInformation Lib "advapi32.dll" (ByVal TokenHandle As Long, ByVal TokenInformationClass As Long, TokenInformation As Any, ByVal TokenInformationLength As Long, ReturnLength As Long) As Long
Private Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, ByRef lpLuid As LARGE_INTEGER) 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 GetCurrentProcessId Lib "kernel32" () As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Const EWX_LOGOFF = 0 '注销当前用户
Private Const EWX_POWEROFF = 8 '关闭系统并关闭电源
Private Const EWX_SHUTDOWN = 1 '关闭系统使之能安全关闭电源
Private Const EWX_REBOOT = 2 '关闭系统并重启
Private Const EWX_FORCE = 4 '应用程序强制关闭
Private Const EWX_FORCEIFHUNG = 16 '如果应用程序已挂起,强制关闭
Private Const SE_PRIVILEGE_ENABLED = &H2
Private Const SE_PRIVILEGE_ENABLED_BY_DEFAULT = &H1
Private Const SE_PRIVILEGE_USED_FOR_ACCESS = &H80000000
Private Const TOKEN_ADJUST_PRIVILEGES = &H20
Private Const TOKEN_QUERY_SOURCE = &H10
Private Const TOKEN_QUERY = &H8
Private Const ANYSIZE_ARRAY = 1
Private Const SE_SHUTDOWN_NAME = "SeShutdownPrivilege"
Private Const PROCESS_SET_INFORMATION = &H200
Private Const PROCESS_QUERY_INFORMATION = &H400
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
Attributes As Long
End Type
Private Type TOKEN_PRIVILEGES
PrivilegeCount As Long
Privileges(0) As LUID_AND_ATTRIBUTES
End Type
Private Sub Command1_Click()
mDattime = CDate(txtHour.Text & ":" & txtMinute.Text)
Form1.WindowState = 1
End Sub
Private Sub Shutdown()
Dim lAPIReturn As Long
Dim tTOKPRI As TOKEN_PRIVILEGES
Dim tLUID As LUID
Dim tLarInt As LARGE_INTEGER
Dim lRequired As Long
Dim hTokHan As Long
Dim hProcess As Long
If LookupPrivilegeValue(vbNullString, SE_SHUTDOWN_NAME, tLarInt) = 0 Then
MsgBox "Get LUID error!", vbOKOnly, "Error"
Exit Sub
End If
tLUID.highpart = tLarInt.highpart
tLUID.lowpart = tLarInt.lowpart
tTOKPRI.PrivilegeCount = 1
tTOKPRI.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
tTOKPRI.Privileges(0).pLuid = tLUID
hProcess = GetCurrentProcess()
lAPIReturn = OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hTokHan)
lAPIReturn = AdjustTokenPrivileges(hTokHan, 0, tTOKPRI, Len(tTOKPRI), 0, 0)
' lAPIReturn = ExitWindowsEx(EWX_LOGOFF, 0)
' lAPIReturn = ExitWindowsEx(EWX_SHUTDOWN, 0)
lAPIReturn = ExitWindowsEx(EWX_POWEROFF, 0)
' lAPIReturn = ExitWindowsEx(EWX_REBOOT, 0)
' lAPIReturn = ExitWindowsEx(EWX_FORCE, 0)
' lAPIReturn = ExitWindowsEx(EWX_FORCEIFHUNG, 0)
If lAPIReturn = 0 Then
MsgBox "Function calling error!", vbOKOnly, "错误"
End If
lAPIReturn = CloseHandle(hTokHan)
End Sub
Private Sub Form_Load()
Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer()
If Format(Time, "hh:mm:ss") = mDattime Then
' If Minute(Time) = 0 Then
Shutdown
End If
End Sub
'在win2000下用vb重新启动和关机,注销user,还有其他方法吗?
'在win2000下用vb重新启动和关机,注销user,还有其他方法吗?