安全关机程序[通俗易懂]

安全关机程序[通俗易懂]安全关机程序最近在实验室用ftp下点东西,但是由于实验室晚上12点就会断电。于是需要在此之前关掉机器,图省事就用WindowsXP自带的计划任务每次设置成11:50就调用“shutdown-s”命令自动关机。但是好几次都发现没法正常关机,第二天早上起来就会检测磁盘。于是就做了个实验,发现确实当使用flashfxp下载东西时,关机会不能正常关机,等待确定终止flashfxp程序。发现原因后,很简单

大家好,又见面了,我是你们的朋友全栈君。

安全关机程序

最近在实验室用ftp下点东西,但是由于实验室晚上12点就会断电。于是
需要在此之前关掉机器,图省事就用WindowsXP自带的计划任务每次设置
成11:50就调用“shutdown -s”命令自动关机。但是好几次都发现没法
正常关机,第二天早上起来就会检测磁盘。于是就做了个实验,发现确实
当使用flashfxp下载东西时,关机会不能正常关机,等待确定终止flashfxp
程序。

发现原因后,很简单,先把用户进程全部terminate掉,然后再自动关机。
于是就有了本文。

具体内容很简单,用CreateToolhelp32Snapshot函数得到当前进程快照,
然后Process32First和Process32Next函数循环得到进程的ID号。然后再
调用OpenProcess得到进程句柄和其优先级类。从而判断是否是用户进程,
将之Terminate掉(使用TerminateProcess函数)。最后调用ExitWindowsEx
函数关闭机器。

为了防止意外,在程序中还再次调用windows程序:shutdown -s命令来关
闭机器。

具体代码如下:

/*
   AutoShutDown.cpp
*/

#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>

BOOL fn_KillAllUserProcess();

BOOL fn_ShutdownComputer();

void error(char * szErrorMessage);

void main( )
{

  fn_KillAllUserProcess();
  fn_ShutdownComputer();
}

BOOL fn_KillAllUserProcess()
{

 HANDLE hProcessSnap;
 HANDLE hProcess;
 PROCESSENTRY32 pe32;
 DWORD  dwPriorityClass;

 
 // Take a snapshot of all processes in the system.
 hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0

);
 if( hProcessSnap == INVALID_HANDLE_VALUE )
 {

  return FALSE;
 }
 
 // Set the size of the structure before using it.
 pe32.dwSize = sizeof( PROCESSENTRY32 );
 
 // Retrieve information about the first process,
 // and exit if unsuccessful
 if( !Process32First( hProcessSnap, &pe32 ) )
 {

  CloseHandle( hProcessSnap );     // Must clean up the

snapshot object!
  return  FALSE;
 }
 
 // Now walk the snapshot of processes, and
 // display information about each process in turn
 do
 {

  // Retrieve the priority class.
  dwPriorityClass = 0;
  hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE,

pe32.th32ProcessID );
  if( hProcess != NULL )
  {

   dwPriorityClass = GetPriorityClass( hProcess );
  }
  
  //judge if the user’s process and if the process of

this program
  if (dwPriorityClass == 32 && stricmp(pe32.szExeFile,

“AutoShutDown.exe”) != 0)
  {

   //terminate the prcess
   TerminateProcess(hProcess, 0);
  }
  
  if (hProcess != NULL)
   CloseHandle(hProcess);
  
 } while( Process32Next( hProcessSnap, &pe32 ) );
 
 CloseHandle( hProcessSnap );

 return TRUE ;

}

BOOL fn_ShutdownComputer()
{

 HANDLE hToken;
 TOKEN_PRIVILEGES tkp;
 
 // Get a token for this process.
 
 if (!OpenProcessToken(GetCurrentProcess(),
        TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
  error(“OpenProcessToken”);
 
 // Get the LUID for the shutdown privilege.
 
 LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
        &tkp.Privileges[0].Luid);
 
 tkp.PrivilegeCount = 1;  // one privilege to set   
 tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
 
 // Get the 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)
  error(“AdjustTokenPrivileges”);
 
 // Shut down the system and force all applications to close.
 
 if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0))
  error(“ExitWindowsEx”);

 //sleep 30 seconds
 Sleep(30000);

 //use the onther way to shundown the computer
 system(“shutdown -s”);

 return true;
}

void error(char * szErrorMessage)
{

 printf(“%s/n”, szErrorMessage);
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/162969.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 解决vscode中文乱码的代码_vscode终端

    解决vscode中文乱码的代码_vscode终端我们现在很多编程开放工作中,VSCode已经成了一款难以绕过去的轻量级完善好用的代码编辑器。功能完善兼容性好体验不错,受到越来越多的开发者的认可。所以涉及到编程工作,VScode的安装是个必备的准备工作。我们本文就介绍下Windows和Ubuntu这样的Linux两个操作系统下安装VScode编辑器并解决打开代码文件的时候其中中文显示乱码的问题。当然Windows版本的VScode安装很简单,我们…

  • layout_gravity和gravity的用法

    layout_gravity和gravity的用法也谈layout_gravity和gravity的用法相信对于Android的初学者来说,大家都曾经被layout里这两个极其相似的属性迷惑过。简单使用一下搜索工具,我们就不难找到下面这样的答案:layout_gravity表示组件自身在父组件中的位置gravity            表示组件的子组件在组件中的位置看似很简单嘛~)貌似大伙瞅一眼就明白了。

  • c++ map遍历的几种方式_对map进行遍历

    c++ map遍历的几种方式_对map进行遍历C++map遍历#include#include

    usingnamespacestd;intmain(){map_map;_map[0]=1;_map[1]=2;_map[10]=10;map::iteratoriter;iter=_map

  • jdbc如何连接mysql数据库_sqlplus连接远程数据库

    jdbc如何连接mysql数据库_sqlplus连接远程数据库好多朋友遇到了在本地可以连接mysql数据库,而在jsp页面连接远程mysql数据库而连不上的问题,现总结以下:1.配置远程mysql数据库,使其允许远程tcp/ip连接,开放默认端口(3306) 或者设置为3309,2.创建用户,使其具有在任意HOST连接任意database的权限;3.在jdbc连接串中设置端口,如:jdbc:mysql://192.168.0.2:3309/ic

    2022年10月10日
  • java集合系列——List集合之Vector介绍(四)

    Vector 类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector 的大小可以根据需要增大或缩小,以适应创建 Vector 后进行添加或移除项的操作。Vector 是同步的,可用于多线程。

  • 《开源安全运维平台-OSSIM最佳实践》已经上市

    《开源安全运维平台-OSSIM最佳实践》已经上市经多年潜心研究开源技术,历时三年创作的《开源安全运维平台OSSIM最佳实践》一书即将出版。该书用100多万字记录了作者10多年的OSSIM研究应用成果,重点展示了开源安全管理平台OSSIM在大型企业网运维管理中的实践。国内目前也有各式各样的运维系统,经过笔者对比分析得出这些工具无论在功能上、性能上还是在安全和稳定性易用性上都无法跟OSSIM系统想媲美,而且很多国内的开源安全运维项目在发布几年后就逐步淡出了舞台,而OSSIM持续发展了十多年。

    2022年10月25日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号