精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● VB和Basic>>〓〓..API 函数使用..〓〓>>[转载]NT/2000下的关闭计算机

主题:[转载]NT/2000下的关闭计算机
发信人: winsy(鹰派)
整理人: winsy(2003-03-05 15:16:20), 站内信件
原文转自CSDN

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

[关闭][返回]