请问在win2k中怎样用API函数关机

解决方案 »

  1.   

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

  2.   

    由于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  
      

  3.   

    同志,多看看FAQ和以前的贴子:http://expert.csdn.net/Expert/FAQ/FAQ_Index.asp?id=18622