怎样实现利用API关闭winnt(如:2000,XP)系统??

解决方案 »

  1.   

    现象
    当使用ExitWindowsEx API在Windows NT和Windows 2000下重启系统时,机器不重启。原因
    要通过程序重启Windows NT或Windows 2000系统,进程要求有SE_SHUTDOWN_NAME权限。缺省状态下,Visual Basic应用程序没有此权限,因此无法重启机器。
     
    解决方法
    为了使ExitWindowsEx API能在Windows NT或Windows 2000下重启系统,必须设置SE_SHUTDOWN_NAME权限。下列步骤说明了如何使ExitWindowsEx API在Windows NT和Windows 2000下生效。 分步实现的例子
    1.在Visual Basic中新建一个标准EXE,默认创建Form1。 
    2.在Form1代码视图中,在Declarations段中加入下列代码:
          Private Type LUID
             UsedPart As Long
             IgnoredForNowHigh32BitPart As Long
          End Type      Private Type TOKEN_PRIVILEGES
            PrivilegeCount As Long
            TheLuid As LUID
            Attributes As Long
          End Type      Private Const EWX_SHUTDOWN As Long = 1
          Private Const EWX_FORCE As Long = 4
          Private Const EWX_REBOOT = 2      Private Declare Function ExitWindowsEx Lib "user32" (ByVal _
               dwOptions As Long, ByVal dwReserved As Long) As Long      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
    3.添加一个名为AdjustToken的过程,包含下列代码:      
          Private Sub AdjustToken()
             Const TOKEN_ADJUST_PRIVILEGES = &H20
             Const TOKEN_QUERY = &H8
             Const SE_PRIVILEGE_ENABLED = &H2
             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      ' Get the LUID for shutdown privilege.
             LookupPrivilegeValue "", "SeShutdownPrivilege", tmpLuid         tkp.PrivilegeCount = 1    ' One privilege to set
             tkp.TheLuid = tmpLuid
             tkp.Attributes = SE_PRIVILEGE_ENABLED     ' Enable the shutdown privilege in the access token of this process.
             AdjustTokenPrivileges hdlTokenHandle, False, _
             tkp, Len(tkpNewButIgnored), tkpNewButIgnored, lBufferNeeded     End Sub
    4.在表单上添加CommandButton,在Click事件中添加下列代码:
          Private Sub Command1_Click()
             AdjustToken
             ExitWindowsEx (EWX_SHUTDOWN Or EWX_FORCE Or EWX_REBOOT), &HFFFF
          End Sub
    5.保存工程并声称可执行文件。当运行可执行文件并点击CommandButton机器将如预期重启。
      

  2.   

    http://expert.csdn.net/Expert/FAQ/FAQ_Index.asp?id=18622