我說一下個人思想:先寫一個關機程序,這個程序一直訪問網絡上的一個文件,這個文件是咱們事先準備好的,裏面有命令字符串,程序讀取這個文件的內容,若是發現是關機命令,就執行關機命令,這樣就能夠經過一個網絡文件來向遠程計算機發命令了。想要經過手機來往網絡文件裏寫命令,最好不過的是採用網頁的形式了,只要在網站服務器上事先寫好一個網頁,該網頁能夠往配置文件裏寫命令,這樣就行了。網頁能夠採用JSP、PHP、asp.net等書寫,固然要取決於你的網站服務器了。這樣經過手機訪問相關網頁,相關網頁往配置文件裏寫入關機命令,再由運行在遠程主機上的程序讀取,最後實現關機。廢話不說了,上代碼。php
//這是關機函數 void CShutdownApp::ShutDown() { OSVERSIONINFO OsVersionInfo; //包含操做系統版本信息的數據結構 OsVersionInfo.dwOSVersionInfoSize= sizeof(OSVERSIONINFO); GetVersionEx(&OsVersionInfo); //獲取操做系統版本信息 if(OsVersionInfo.dwPlatformId!= VER_PLATFORM_WIN32_WINDOWS) // 對於Windows NT系統 { HANDLE hToken; // 指向 access token的指針。 TOKEN_PRIVILEGES tkp; //保存用戶權限列表的數據結構。 // Get a token for this process. 獲得一個進程的access token,並將它放入到hToken中。 if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) AfxMessageBox("OpenProcessToken"); // Get the LUID for the shutdown privilege. 獲得關機權限的LUID,而且放入到TOKEN_PRIVILEGES結構體的第一個列表項中。 LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1; // one privilege to set 將關機權限對應的LUID的對應屬性改成可用 SE_PRIVILEGE_ENABLED; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; // Get the shutdown privilege for this process. 調整進程的access token,使它具備shutdown權限的可用屬性。 AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); // Cannot test the return value of AdjustTokenPrivileges. if (GetLastError() != ERROR_SUCCESS) AfxMessageBox("AdjustTokenPrivileges"); // Shut down the system and force all applications to close. if (!ExitWindowsEx(EWX_SHUTDOWN |EWX_POWEROFF, 0)) //EWX_REBOOT,EWX_LOGOFF (uFlags) //EWX_FORCE,EWX_FORCEIFHUNG (Value) AfxMessageBox("ExitWindowsEx"); } else { //Windows98,調用ExitWindowsEx()函數從新啓動計算機 ExitWindowsEx(EWX_SHUTDOWN |EWX_POWEROFF,0); //能夠改變第一個參數,實現註銷用戶、 //關機、關閉電源等操做 } } //這是讀取網絡文件的函數 void CShutdownDlg::ShutDownByRemote() { char url[256] = "http://www.renyugang.cn/s/shutdown.ini"; HINTERNET hNet = ::InternetOpen("1986", //當HTTP協議使用時,這個參數隨意賦值 PRE_CONFIG_INTERNET_ACCESS, //訪問類型指示Win32網絡函數使用登記信息去發現一個服務器。 NULL, INTERNET_INVALID_PORT_NUMBER, //使用INTERNET_INVALID_PORT_NUMBER至關於提供卻省的端口數。 0 //標誌去指示使用返回句句柄的未來的Internet函數將"不"爲回調函數發送狀態信息 ) ; HINTERNET hUrlFile = ::InternetOpenUrl(hNet, //從InternetOpen返回的句柄 (char *)url, //須要打開的URL NULL, //用來向服務器傳送額外的信息,通常爲NULL 0, //用來向服務器傳送額外的信息,通常爲 0 INTERNET_FLAG_RELOAD, //InternetOpenUrl行爲的標誌 0) ; //信息將不會被送到狀態回調函數 char buffer[1024] ; memset(buffer,0,1024); DWORD dwBytesRead = 0; BOOL bRead = ::InternetReadFile(hUrlFile, //InternetOpenUrl返回的句柄 buffer, //保留數據的緩衝區 sizeof(buffer), &dwBytesRead); //指向包含讀入緩衝區字節數的變量的指針; //若是返回值是TRUE,並且這裏指向0,則文件已經讀到了文件的末尾。 ::InternetCloseHandle(hUrlFile); ::InternetCloseHandle(hNet) ; if (strcmp(buffer,"<?command shutdown ?>")==0) { this->SetWindowText("接收到遠程指令,系統即將關機!"); SetDlgItemText(IDC_STATIC_NOWTIME,"接收到遠程指令,系統即將關機!"); KillTimer(1); shutdown(); } }
//網頁代碼也上了吧 PHP的html
//notify.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>遠程控制端</title> </head> <body> <center> <a href="notify.php">通知遠程主機關機</a><br/> <a href="deleteini.php">刪除shutdown.ini</a> <?php if(copy("../shutdown.ini","shutdown.ini")==true) { echo "<br/>notify target host successfully"; } ?> </center> </body> </html>
爲了全面起見,你還要提供刪除配置文件的代碼。否則那個程序一運行就會關機啊。服務器