最近很多朋友问我:NT的机器如果远程管理软件坏了,怎么重起呢?其实,如果服务器的139端口开着,重起是很简单的,步骤如下:
1、net use \\xxx.xxx.xxx.xxx\ipc$ password /user:username
建立一个IPC会话
2、net use H: \\xxx.xxx.xxx.xxx\c$
将对方的C盘映射为自己的H盘
3、copy con h:\reboot.bat
iisreset /reboot
CTRL+Z
在对方的C盘上生成了一个能重启计算机的文件
4、net time \\xxx.xxx.xxx.xxx
得到对方的时间
5、at \\xxx.xxx.xxx.xxx 重起的时间 c:\reboot.bat
重起的时间等于对方的时间加几分钟
6、at \\xxx.xxx.xxx.xxx
看看任务加上没有
7、等......
上面的第三步是only for WIN2K的,如果是NT,你需要用一个特定的重起程序,我们可以自己编写一个reboot.exe来取代reboot.bat,原理很简单,代码如下:
#include "stdio.h"
#include "windows.h"
int main()
{
//定义重起的时候发送给所有用户的消息
LPSTR msg="Reboot Tool By Lion Hook\nhttp://www.xici.net";
//尝试用最简单的API函数重起
if(ExitWindowsEx(EWX_REBOOT, 0))return TRUE;
if(ExitWindowsEx(EWX_REBOOT EWX_FORCE, 0))return TRUE;
//因为上面的重起不成功,所以需要调整本进程的特权
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES TOKEN_QUERY, &hToken)) return FALSE;
//获取重起的特权SE_SHUTDOWN_NAME
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
//判断是NT内核还是9x内核,选择用不同的方式
if(!(GetVersion() & 0x80000000))
InitiateSystemShutdown(NULL, msg, 20, TRUE, TRUE);
else if (!ExitWindowsEx(EWX_REBOOT, 0))
if(!ExitWindowsEx(EWX_REBOOT EWX_FORCE, 0))
return FALSE;
return TRUE;
}