經過手機來實現遠程關機的思想

我說一下個人思想:先寫一個關機程序,這個程序一直訪問網絡上的一個文件,這個文件是咱們事先準備好的,裏面有命令字符串,程序讀取這個文件的內容,若是發現是關機命令,就執行關機命令,這樣就能夠經過一個網絡文件來向遠程計算機發命令了。想要經過手機來往網絡文件裏寫命令,最好不過的是採用網頁的形式了,只要在網站服務器上事先寫好一個網頁,該網頁能夠往配置文件裏寫命令,這樣就行了。網頁能夠採用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>


爲了全面起見,你還要提供刪除配置文件的代碼。否則那個程序一運行就會關機啊。服務器

相關文章
相關標籤/搜索