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

解决方案 »

  1.   

    在我所看到的API资料中对于其关闭系统的描述只适用于WIN98的操作系统,但不能应用于WIN2000的操作系统,我想问一下WIN2000的关闭系统如何用API描述。  
    ---------------------------------------------------------------  
    由于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  
      

  2.   

    以上转贴自http://expert.csdn.net/Expert/FAQ/FAQ_Index.asp?id=18622