5-8万年薪顶级嵌入式,京沪深就业地 浅谈并行编程中的任务分解模式
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

Win2000下自动关机的问题??????

楼主wxq888(我要我要我就要我还要)2002-07-18 10:05:43 在 VC/MFC / 基础类 提问

WIN2000下  
  锁定计算机后,我想实现定时自动关机,现在有两个问题:  
  1:WIN2000关闭系统的程序的路径?  
  2:如何自动解除锁定?  
  有没有人做个的程序参考一下。 问题点数:100、回复次数:11Top

1 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-07-18 10:19:11 得分 10

ExitWindowsTop

2 楼wxq888(我要我要我就要我还要)回复于 2002-07-18 10:47:55 得分 0

我试过了,在CMainFrame::OnDestroy()中调用ExitWindows不行Top

3 楼FreeSeagull(蓝天,白云,松花江)回复于 2002-07-18 10:56:39 得分 5

ExitWindowsEx()Top

4 楼HKer_007(伙计,拿杆烟来吃)回复于 2002-07-18 11:00:20 得分 0

同意Top

5 楼liuliangbo(liu)回复于 2002-07-18 11:00:57 得分 10

在WINDOWS   2000中要有关机的权限才能够关闭计算机,单ExitWindows函数是不行的,调用调整权限的函数使应用程序具有关机的权限,然后调用关机函数就OK了。Top

6 楼52cgi(鬼行者)回复于 2002-07-18 11:01:19 得分 0

顺便问问,Win98和Win2K的关机方法好像不同,  
   
  谁知道分别如何实现的?Top

7 楼chkdsk(猪是的念来过倒)回复于 2002-07-18 11:01:43 得分 0

InitiateSystemShutdown()?Top

8 楼AaronLiu(放不稳的鸡蛋)回复于 2002-07-18 11:15:08 得分 40

我给你一段代码吧,下面是我的关机程序的部分代码  
   
   
   
  void   CShutDownView::OnLogoff()    
  {  
  HANDLE   hToken;    
  TOKEN_PRIVILEGES   tkp;    
  LUID   sedebugnameValue;    
  if(!IsWin98())  
  {  
  if(!OpenProcessToken(   GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES   |   TOKEN_QUERY,   &hToken   )   )  
  return   ;    
  if(!LookupPrivilegeValue(   NULL,   SE_SHUTDOWN_NAME   ,   &sedebugnameValue   )   )  
  {    
  CloseHandle(   hToken   );  
  return   ;  
  }    
  tkp.PrivilegeCount   =   1;    
  tkp.Privileges[0].Luid   =   sedebugnameValue;    
  tkp.Privileges[0].Attributes   =   SE_PRIVILEGE_ENABLED;  
  AdjustTokenPrivileges(   hToken,   FALSE,   &tkp,   sizeof   tkp,   NULL,   NULL   );  
  CloseHandle(   hToken   );    
  }  
  if(!ExitWindowsEx(EWX_LOGOFF,0L))  
  AfxMessageBox("关闭计算机失败!");   ////EWX_REBOOT可以用其它参数代替来实现关闭电源等功能。  
   
   
  }  
   
  void   CShutDownView::OnExit()    
  {  
   
   
  CWnd*   pMainWindow   =   AfxGetMainWnd();  
   
  ::PostMessage(pMainWindow->m_hWnd,WM_CLOSE,0,0);  
  }  
   
  void   CShutDownView::OnRestart()    
  {  
  /*  
  步骤:  
  1、opens   the   access   token   associated   with   a   process.  
  */  
   
  HANDLE   hToken;    
  TOKEN_PRIVILEGES   tkp;    
  LUID   sedebugnameValue;    
  if(!IsWin98())  
  {  
  if(!OpenProcessToken(   GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES   |   TOKEN_QUERY,   &hToken   )   )  
  return   ;    
  /*     The   LookupPrivilegeValue   function   retrieves   the   locally   unique   identifier   (LUID)  
  used   on   a   specified   system   to   locally   represent   the   specified   privilege   name.    
  BOOL   LookupPrivilegeValue(  
      LPCTSTR   lpSystemName,//   address   of   string   specifying   the   system  
         
      LPCTSTR   lpName,     //   address   of   string   specifying   the   privilege  
      PLUID   lpLuid           //   address   of   locally   unique   identifier  
  );  
  */    
  if(!LookupPrivilegeValue(   NULL,   SE_SHUTDOWN_NAME   ,   &sedebugnameValue   )   )  
  {    
  CloseHandle(   hToken   );  
  return   ;  
  }    
  tkp.PrivilegeCount   =   1;    
  tkp.Privileges[0].Luid   =   sedebugnameValue;    
  tkp.Privileges[0].Attributes   =   SE_PRIVILEGE_ENABLED;  
  /*  
  The   AdjustTokenPrivileges   function   enables   or   disables   privileges   in   the   specified   access   token.   Enabling   or   disabling   privileges   in   an   access   token   requires   TOKEN_ADJUST_PRIVILEGES   access.    
  TokenPrivileges(  
  HANDLE   TokenHandle,     //   handle   to   token   that   contains   privileges  
  BOOL   DisableAllPrivileges,//   flag   for   disabling   all   privileges  
  PTOKEN_PRIVILEGES   NewState,//   pointer   to   new   privilege   information  
  DWORD   BufferLength,     //   size,   in   bytes,   of   the   PreviousState   buffer  
  PTOKEN_PRIVILEGES   PreviousState,   //   receives   original   state   of   changed   privileges  
  PDWORD   ReturnLength     //   receives   required   size   of   the     PreviousState   buffer  
  );*/  
     
  AdjustTokenPrivileges(   hToken,   FALSE,   &tkp,   sizeof   tkp,   NULL,   NULL   );  
  CloseHandle(   hToken   );    
  }  
  if(!ExitWindowsEx(EWX_REBOOT,0L))  
  AfxMessageBox("重新启动失败!");   ////EWX_REBOOT可以用其它参数代替来实现关闭电源等功能。  
   
   
  }  
   
  void   CShutDownView::OnShutdown()    
  {  
   
  HANDLE   hToken;    
  TOKEN_PRIVILEGES   tkp;    
  LUID   sedebugnameValue;    
  if(!IsWin98())  
  {  
  if(!OpenProcessToken(   GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES   |   TOKEN_QUERY,   &hToken   )   )  
  return   ;    
  if(!LookupPrivilegeValue(   NULL,   SE_SHUTDOWN_NAME   ,   &sedebugnameValue   )   )  
  {    
  CloseHandle(   hToken   );  
  return   ;  
  }    
  tkp.PrivilegeCount   =   1;    
  tkp.Privileges[0].Luid   =   sedebugnameValue;    
  tkp.Privileges[0].Attributes   =   SE_PRIVILEGE_ENABLED;  
  AdjustTokenPrivileges(   hToken,   FALSE,   &tkp,   sizeof   tkp,   NULL,   NULL   );  
  CloseHandle(   hToken   );    
  }  
  if(!ExitWindowsEx(EWX_SHUTDOWN,0L))  
  AfxMessageBox("关闭计算机失败!");   ////EWX_REBOOT可以用其它参数代替来实现关闭电源等功能。  
   
  }  
   
   
  void   CShutDownView::OnPoweroff()    
  {  
   
  HANDLE   hToken;    
  TOKEN_PRIVILEGES   tkp;    
  LUID   sedebugnameValue;    
  if(!IsWin98())  
  {  
   
  if(!OpenProcessToken(   GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES   |   TOKEN_QUERY,   &hToken   )   )  
  return   ;    
  if(!LookupPrivilegeValue(   NULL,   SE_SHUTDOWN_NAME   ,   &sedebugnameValue   )   )  
  {    
  CloseHandle(   hToken   );  
  return   ;  
  }    
  tkp.PrivilegeCount   =   1;    
  tkp.Privileges[0].Luid   =   sedebugnameValue;    
  tkp.Privileges[0].Attributes   =   SE_PRIVILEGE_ENABLED;  
  AdjustTokenPrivileges(   hToken,   FALSE,   &tkp,   sizeof   tkp,   NULL,   NULL   );  
  CloseHandle(   hToken   );    
  }  
  if(!ExitWindowsEx(EWX_POWEROFF,0L))  
  AfxMessageBox("关闭计算机失败!");   ////EWX_REBOOT可以用其它参数代替来实现关闭电源等功能。  
   
  }  
   
  BOOL   CShutDownView::IsWin98()  
  {  
  DWORD   dwVersionNum   =   GetVersion();  
  if(dwVersionNum<0x80000000)//NT  
  return   FALSE;  
  else                                               //WIN98  
  return   TRUE;  
  }  
   
   
   
  Top

9 楼wxq888(我要我要我就要我还要)回复于 2002-07-18 11:17:19 得分 0

哪个函数具有调整权限的功能,使应用程序具有关机的权限?Top

10 楼cdutgch(欢喜游龙)回复于 2002-07-18 11:41:15 得分 35

这段代码应该也是可以的,先获取特权然后再.....  
   
  BOOL   CMainFrame::shutdown()  
  {  
  HANDLE                       hToken;          
  TOKEN_PRIVILEGES   tkp;              
  BOOL                           fResult;           //   Get   the   current   process   token   handle   so   we   can   get   shutdown   privilege.      
  if(!OpenProcessToken(GetCurrentProcess(),   TOKEN_ADJUST_PRIVILEGES   |   TOKEN_QUERY,   &hToken))          
  return   FALSE;     //   Get   the   LUID   for   shutdown   privilege.      
  LookupPrivilegeValue(NULL,   SE_SHUTDOWN_NAME,   &tkp.Privileges[0].Luid);      
  tkp.PrivilegeCount   =   1;      
  tkp.Privileges[0].Attributes   =   SE_PRIVILEGE_ENABLED;     //   Get   shutdown   privilege   for   this   process.      
  AdjustTokenPrivileges(hToken,   FALSE,   &tkp,   0,   (PTOKEN_PRIVILEGES)   NULL,   0);     //   Cannot   test   the   return   value   of   AdjustTokenPrivileges.      
  if(GetLastError()   !=   ERROR_SUCCESS)          
  return   FALSE;        
  //   Actually   shutdown      
  fResult   =   InitiateSystemShutdown(NULL,   NULL,   0,   TRUE,   FALSE);      
  //   to   shutdown      
  // fResult   =   InitiateSystemShutdown(NULL,   NULL,   0,   TRUE,   TRUE);        
  //   to   reboot        
  if(!fResult)          
  return   FALSE;         //   Disable   shutdown   privilege.      
  tkp.Privileges[0].Attributes   =   0;      
  AdjustTokenPrivileges(hToken,   FALSE,   &tkp,   0,   (PTOKEN_PRIVILEGES)   NULL,   0);        
  if(GetLastError()   !=   ERROR_SUCCESS)          
  return   FALSE;        
  return   TRUE;  
  }  
  Top

相关问题

  • win 98自动关机之问题!
  • 自动关机
  • 如何在WIN2000下自动关机?
  • Windows2000下自动关机问题?
  • WIN2K下怎样实现自动关机??
  • 关于WINDOWS下自动关机。
  • win NT4.0下的关机和重启!
  • 如何实现在NT下关机时自动切断电源?
  • win2000下播放MP3时怎么自动关机?来者有分!
  • Win2000下怎么不能自动关机了呢?

关键词

  • win2000
  • win98
  • 函数
  • 计算机
  • tkp
  • htoken
  • sedebugnamevalue
  • privilege
  • cshutdownview
  • iswin98

得分解答快速导航

  • 帖主:wxq888
  • jiangsheng
  • FreeSeagull
  • liuliangbo
  • AaronLiu
  • cdutgch

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
x 提问