如何拦截其他程序的关机命令

如何拦截其他程序的关机命令,第1张

运行gpeditmsc,用户配置→管理器模板→任务栏和开始菜单,双击“删除和阻止访问关机命令”,选择已启用就行了Ntshudownsystem这种ring0级别的关机命令我想可能阻止不了

这是用MFC开发的程序的默认图标,本身不能代表什么,如果他阻止关机可能是后台在执行什么,可以用Process Explorer强制结束它。

微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是微软公司提供的一个类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。

MFC(MicrosoftFoundationClasses)是微软基础类库的简称,是微软公司实现的一个c++类库,主要封装了大部分的windows API函数,vc++是微软公司开发的c/c++的集成开发环境,所谓集成开发环境,就是说利用它可以编辑,编译,调试,而不是使用多种工具轮换 *** 作,灵活性较大。vc也指它的内部编译器,集成开发环境必须有一个编译器内核,例如DevC++其中一个编译器内核就是gcc。

MFC除了是一个类库以外,还是一个框架,在vc++里新建一个MFC的工程,开发环境会自动帮你产生许多文件,同时它使用了mfcxxdll。xx是版本,它封装了mfc内核,所以你在你的代码看不到原本的SDK编程中的消息循环等等东西,因为MFC框架帮你封装好了,这样你就可以专心的考虑你程序的逻辑,而不是这些每次编程都要重复的东西,但是由于是通用框架,没有最好的针对性,当然也就丧失了一些灵活性和效率。但是MFC的封装很浅,所以效率上损失不大。

参考资料:

百度百科-MFC

有时侯关机,在看到注销的画面之后就直接离开了。但是第二天上班时却惊奇地发现,电脑还在运行。出现此问题的原因是系统还有未关闭这些程序,如何在关机时强制关闭这些程序呢’

Windows 7关机时强制关闭程序的设置方法需要修改组策略编辑器。

进入系统后,按“WIN+R”组合键,打开“运行”对话框,输入“GPEDITMSC”命令.单击“确定”按钮, 打开“本地组策略编辑器”窗口,依次找到并展开“计算机配置”“管理模板”“系统”“关机选项”节点,双击右侧窗格中的“关闭会阻止或取消关机的应用程序的自动终止功能” 在d出的“关闭会阻止或取消关机的应用程序的自动终止功能”对话框中。将“未配置”修改为“启用”如图所示。单击“确定”按钮退出后,以后再遇到未关闭的程序时,windows 7系统将自动终止关强止关机。

using System;

using SystemCollectionsGeneric;

using SystemText;

using SilverWin32Api;namespace SilverOffComputer

{

/// <summary>

/// 注销系统 *** 作类

/// </summary>

public class LogOut

{

public LogOut() { } public static void LogOutComputer()

{

DoExitWin(UtilEWX_LOGOFF + UtilEWX_FORCE);

} private static void DoExitWin(int flg)

{

bool ok;

UtilTokPriv1Luid tp;

IntPtr hproc = Kernel32GetCurrentProcess();

IntPtr htok = IntPtrZero;

ok = Advapi32OpenProcessToken(hproc, UtilTOKEN_ADJUST_PRIVILEGES | UtilTOKEN_QUERY, ref htok);

tpCount = 1;

tpLuid = 0;

tpAttr = UtilSE_PRIVILEGE_ENABLED;

ok = Advapi32LookupPrivilegeValue(null, UtilSE_SHUTDOWN_NAME, ref tpLuid);

ok = Advapi32AdjustTokenPrivileges(htok, false, ref tp, 0, IntPtrZero, IntPtrZero);

ok = User32ExitWindowsEx(flg, 0);

}

}

}

using System;

using SystemCollectionsGeneric;

using SystemText;

using SilverWin32Api;namespace SilverOffComputer

{

/// <summary>

/// 关闭计算机 *** 作类

/// </summary>

public class ShutDown

{

public ShutDown()

{ } public enum ShutFlag

{

shutDown,

reBoot

} public static void ShutDownComputer(ShutFlag flag)

{

if (flag == ShutFlagshutDown)

{

DoExitWin(UtilEWX_SHUTDOWN + UtilEWX_FORCE);

}

else if (flag == ShutFlagreBoot)

{

DoExitWin(UtilEWX_REBOOT + UtilEWX_FORCE);

}

} private static void DoExitWin(int flg)

{

bool ok;

UtilTokPriv1Luid tp;

IntPtr hproc = Kernel32GetCurrentProcess();

IntPtr htok = IntPtrZero;

ok = Advapi32OpenProcessToken(hproc, UtilTOKEN_ADJUST_PRIVILEGES | UtilTOKEN_QUERY, ref htok);

tpCount = 1;

tpLuid = 0;

tpAttr = UtilSE_PRIVILEGE_ENABLED;

ok = Advapi32LookupPrivilegeValue(null, UtilSE_SHUTDOWN_NAME, ref tpLuid);

ok = Advapi32AdjustTokenPrivileges(htok, false, ref tp, 0, IntPtrZero, IntPtrZero);

ok = User32ExitWindowsEx(flg, 0);

}

}

}

调用上面的类就能实现关机注销重启等

再你第一次关机时

系统进程

里可能存在1个或多个无响应进程!这样会造成你说的情况!提供一个解决方法共你参考!安装用

windows优化大师

优化下"关机的时候自动结束任务""结束无响应的程序""结束无响应的服务"各项.

2是你CPU的由于运行时间过长所发生的一种延时现象!一般出现在中端配置的机器上!解决方法就是

优化系统

再给你个官方点的解释希望你能解决问题!

对于Windows

XP来说,由于其采用了安全性能较高的NT内核,系统运行还算稳定,除了关机速度较慢之外,一般情况下很少发生关机故障。但有时在关闭Windows

XP时却莫名其妙地重启,该故障是Windows

XP *** 作系统关机故障中最容易出现的故障。造成该故障的原因可能有以下几方面原因:

系统设置

Windows

XP默认情况下,当系统出现错误时会自动重新启动,这样当用户关机时,如果关机过程中系统出现错误就会重新启动计算机。将该功能关闭往往可以解决自动重启的故障。

在桌面上右键点击“我的电脑”,在d出的右键菜单中选择“属性”,d出“系统属性”窗口,点选“高级”

选项卡

,点击“启动和故障恢复”栏目中的“设置”按钮,d出“启动和故障恢复”窗口。在“系统失败”栏目中将“自动重新

启动”选项前的

对勾

去掉,点“确定”按钮。

高级电源管理

众所周知,关机是与电源管理密切相关的,造成关机故障的原因很有可能是电源管理对系统支持不好造成的。

点击“开始→设置→控制面板→性能与维护→电源选项”,在d出的窗口中,根据需要启用或取消“高级电源支持”即可。

如果你在

故障发生时使用的是启用“高级电源支持”,就试着取消它,如果在故障发生时,你使用的是取消“高级电源支持”就试着启用它,故障往往会迎刃而解。

我们有必要先了解一下WINDOWS XP的关机。Windows XP系统通过一个名为Shutdownexe的程序来完成关机 *** 作(位置在Windows\System下),一般情况下XP的关机是由关机程序shutdownexe来实现的,关机的时候调用shutdownexe。由此可知要阻止强行关机就是要取消对shutdownexe的调用。而笔者发现冲击波和震荡波的关机重启都要调用这个程序,于是答案由此而生:

在d出强行关机的对话框时,快速打开[运行]窗口(按下CTRL+R),输入“shutdownexe -a”(注意有一个空格),回车,这时你可以看到强行关机的对话框消失了。然后就可以轻松地干掉冲击波和震荡波。

当然这种方法不仅可用于此,其它一些原因引起的关机也如法炮制。

既然谈到shutdownexe,有必要将其它重要参数介绍一下:

shutdownexe -a 取消关机

shutdownexe -f 强行关闭应用程序。

shutdownexe -m \计算机名 控制远程计算机。

shutdownexe -i 显示图形用户界面,但必须是Shutdown的第一个参数。

shutdownexe -l 注销当前用户。

shutdownexe -r 关机并重启。

shutdownexe -t时间 设置关机倒计时。

shutdownexe -c"消息内容" 输入关机对话框中的消息内容(不能超127个字符)。

比如你的电脑要在23:00关机,可以选择“开始→运行”,输入“at 23:00 Shutdown -s”,这样,到了23点,电脑就会出现“系统关机”对话框,默认有30秒钟的倒计时并提示你保存工作。如果你想以倒计时的方式关机,可以输入“Shutdownexe -s -t 3600”,这里表示60分钟后自动关机,“3600”代表60分钟。

如果想取消的话,可以在运行中输入“shutdown -a”。另外输入“shutdown -i”,则可以打开设置自动关机对话框,对自动关机进行设置。

虽然shutdownexe是Windows XP下的程序,在Windows2000中是调用Windows下System中的Shell32dll文件来实现关机的,例如“indir\RunDLL32exe indir\System\Shell32dll,SHExitWindowsEx 8”,但在Win2000也可利用它,方法如下:

在WinXP安装目录下的System32文件夹中找到Shutdownexe,将它复制到Win2000安装目录下的System32文件夹中,在“运行”中输入“Shutdownexe”,即可像在Windows XP中一样使用该程序了。

当然,shutdownexe还有一些强大的功能,读者可以进一步实践探讨,充分利用 shutdownexe 的强大功能。

==

关机文件SHUTDOWN常用参数

在Windows XP中,新增了一条命令行工具“shutdown”,其作用是“关闭或重新启动本地或远程计算机”。利用它,我们不但可以注销用户,关闭或重新启动计算机,还可以实现定时关机、远程关机。

该命令的语法格式如下:

shutdown [-i |-l|-s |-r |-a] [-f] [-m [\\ComputerName]] [-t xx] [-c "message"] [-d[u][p]:xx:yy] 其中,各参数的含义为:

-i 显示图形界面的对话框。

-l 注销当前用户,这是默认设置。-m ComputerName 优先。

-s 关闭计算机。

-r 关闭之后重新启动。

-a 中止关闭。除了 -l 和 ComputerName 外,系统将忽略其它参数。在超时期间,您只可以使用 -a。

-f 强制运行要关闭的应用程序。

-m [\\ComputerName] 指定要关闭的计算机。

-t xx 将用于系统关闭的定时器设置为 xx 秒。默认值是 20 秒。

-c "message" 指定将在“系统关闭”窗口中的“消息”区域显示的消息。最多可以使用 127 个字符。引号中必须包含消息。

-d [u][p]:xx:yy 列出系统关闭的原因代码。

首先,我们来看一下该命令的一些基本用法:

1、注销当前用户

shutdown - l

该命令只能注销本机用户,对远程计算机不适用。

2、关闭本地计算机 shutdown - s

3、重启本地计算机

shutdown - r

4、定时关机

shutdown - s -t 30

指定在30秒之后自动关闭计算机。

5、中止计算机的关闭

有时我们设定了计算机定时关机后,如果出于某种原因又想取消这次关机 *** 作,就可以用 shutdown - a 来中止。如:

shutdown -s – t 300 设定计算机在5分钟后关闭。

Shutdown – a 取消上述关机 *** 作。

以上是shutdown命令在本机中的一些基本应用。前面我们已经介绍过,该命令除了关闭、重启本地计算机外,更重要的是它还能对远程计算机进行 *** 作,但是如何才能实现呢?

在该命令的格式中,有一个参数[-m [\\ComputerName],用它可以指定将要关闭或重启的计算机名称,省略的话则默认为对本机 *** 作。于是,我用以下命令试了一下:

shutdown –s –m \\netproxy -t 30

(在30秒内关闭计算机名为netproxy的机器;注:netproxy为局域网内一台同样装有Windows XP的电脑)

但该命令执行后,计算机netproxy一点反应都没有,我的屏幕上却返回这样一句话:Access is denied (拒绝访问)。

为什么会出现这种情况呢?我想了半天,四处查找有关的资料,终于发现,在Windows XP默认的安全策略中,只有管理员组的用户才有权从远端关闭计算机,而一般情况下我们从局域网内的其他电脑来访问该计算机时,则只有guest用户权限,所以当我们执行上述命令时,便会出现“拒绝访问”的情况。

找到问题的根源之后,解决的办法也很简单,只要在客户计算机(能够被远程关闭的计算机,如上述的netproxy)中赋予guest用户远程关机的权限即可。这可利用Windows XP的“组策略”或“管理工具”中的“本地安全策略”来实现。下面以“组策略”为例进行介绍:

1、单击“开始”按钮,选择“运行”,在对话框中输入“gpeditmsc”,然后单击“确定”,打开“组策略编辑器”。

2、在“组策略”窗口的左窗格中打开“计算机配置”—“Windows 设置”—“安全设置”—“本地策略”—“用户权利指派”。

3、在“组策略”窗口的右窗格中选择“Force shutdown from a remote system (从远端系统强制关机)”,双击。

4、在d出的对话框中显示目前只有“Administrators”组的成员才有权从远程关机;单击对话框下方的“添加用户或组”按钮,然后在新d出的对话框中输入“guest”,再单击“确定”。

5、这时在“从远端系统强制关机”的属性中便添加了一个“guest”用户,单击“确定”即可。

6、关闭“组策略”窗中。

通过上述 *** 作后,我们便给计算机netproxy的guest用户授予了远程关机的权限。以后,我们要远程关闭计算机netproxy,只要在网络中其他装有Windows XP 的电脑中输入以下命令即可:

shutdown -s –m \\netproxy -t 30 (其他参数用法同上)

这时,在netproxy计算机的屏幕上将显示一个“系统关机”的对话框,提示“系统即将关机。请保存所有正在运行的工作,然后注销。未保存的改动将会丢失。关机是由netproxy\guest初始的。”在对话框下方还有一个计时器,显示离关机还有多少时间。在等待关机的时间里,用户还可以执行其他的任务,如关闭程序、打开文件等,但无法关闭该对话框,除非你用shutdown –a命令来中止关机任务。

最后,有一点要说明的是,shutdown命令不但可以远程关闭装有Windows XP系统的计算机,它还可以远程关闭装有Windows 2000系统的计算机(对于Win9X嘛,好像不适用)。有关Windows 2000客户计算机上的一些设置, *** 作方法同上,这里就不再多说了。

另外shutdown作为一个外部命令(其对应文件为\Windows\system32文件夹下的shutdownexe),我们还可将它复制到Windows 2000的机器上,这样,在装有Windows 2000系统的机器之间便也能相互实现远程关机。

以上就是关于如何拦截其他程序的关机命令全部的内容,包括:如何拦截其他程序的关机命令、mfc三个字母成一个品字型的图标阻止关机,是什么程序,怎样处理、win7怎样设置关机时自动关闭正在运行的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9529033.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存