天天看點

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;
}