关机代码

给你一段代码吧,下面是我的关机程序的部分代码

 

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;
}
 
这段代码应该也是可以的,先获取特权然后再.....

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值