C#遠程開機


什么是網絡喚醒
網絡喚醒實現了對網絡的集中管理,即在任何時刻,網管中心的IT管理人員可以經由網絡遠程喚醒一台處於休眠或關機狀態的計算機。使用這一功能,IT管理人員可以在下班后,網絡流量最小以及企業的正常運作最不受影響的時候完成所有操作系統及應用軟件的升級及其他管理任務。

為了喚醒網絡上的計算機,用戶必須發出一種數據包,該數據包的格式與普通數據包不同,而且還必須使用相應的專用軟件才能產生。當前比較普遍采用的是AMD公司制作的Magic
Packet,這套軟件可以生成網絡喚醒所需要的特殊數據包。該數據包包含有連續6個字節的“FF”和連續重復16次的MAC地址。Magic Packet
雖然只是AMD公司開發推廣的一項技術,並非業界公認的標准,但是仍受到很多網卡制造商的支持,因此許多具有網絡喚醒功能的網卡都能與之兼容。

今天說的就是如何用C#程序來遠程喚醒局域網中的計算機,

要使用網絡喚醒,你必須擁有:

1:可向網卡發送網絡“喚醒幀”的軟件。
2:可解碼“喚醒幀”的網卡,該網卡同時還必須可以從輔助電源中獲取能量,並能夠向主板發送“喚醒信號”。

先說被喚醒機器如何設置
必須將被喚醒計算機BIOS中“Wake On LAN”或者“Resume by LAN”選項必須設置為“Enable”。
必須獲取到被喚醒計算機網卡MAC

C#代碼如下

    private IPEndPoint point;
    private UdpClient client = new UdpClient();
       
/***喚醒遠程機器方法
 * @param
 * mac 要喚醒的機器的MAC
 *IP
 * port udp消息發送端口
 *摘要:喚醒方法為網卡提供的魔術封包功能,即以廣播模式發送6個FF加上16遍目標MAC地址的字節數組     
**/
private void wakeUp(string mac,int port)
{
    byte[] magicBytes =StrUtility.getMagicPacket(mac);
    point = new IPEndPoint(IPAddress.Parse("255.255.255.255"),port);//廣播模式:255.255.255.255
           
try
{
               
client.Send(magicBytes, magicBytes.Length,point);
}
catch (SocketException) { }
       
}
StrUtility.getMagicPacket代碼如下

///<summary>
///字符串轉16進制字節數組
///</summary>
/// <param name="hexString"></param>
///<returns></returns>
public static byte[] strToHexByte(string hexString)  
{
   hexString =hexString.Replace(" ","");
   if((hexString.Length % 2) !=0)   
   hexString += "";
   byte[] returnBytes = new byte[hexString.Length /2];
   for (int i =0; i < returnBytes.Length;i++)            
      returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2),16);
   return returnBytes;
      
}
 
      ///<summary>
       ///拼裝MAC魔術封包
       ///</summary>
       /// <param name="hexString"></param>
       ///<returns></returns>
public static byte[] getMagicPacket(string macString)
{
   byte[] returnBytes = new byte[102];
   string commandString ="FFFFFFFFFFFF";
          
   for (int i = 0; i < 6;i++)          
      returnBytes[i] = Convert.ToByte(commandString.Substring(i * 2, 2),16);
   byte[] macBytes =strToHexByte(macString);  
   for (int i = 6; i < 102;i++)   
   {          
     returnBytes[i] = macBytes[i %6];
   }
   return returnBytes;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM