轉自INTERNET

最近很多朋友問我: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;
}

上面的這段代碼取自響馬的一段程序,編譯以後的reboot.exe(http://www.patching.net/shotgun/reboot.exe)點這裡可以下載

點閱: 25

By tony

自由軟體愛好者~喜歡不斷的思考各種問題,有新的事物都會想去學習嘗試 做實驗並熱衷研究 沒有所謂頂天的技術 只有謙虛及不斷的學習 精進專業,本站主要以分享系統及網路相關知識、資源而建立。 Github http://stnet253.github.io

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料