PDA

View Full Version : حرفه ای: روشن کردن کامپیوتر خاموش از طریق شبکه با استفاده از سی شارپ



hojjatshariffam
شنبه 20 شهریور 1389, 15:08 عصر
سلام به همه دوستان
خیلی وقت بود که به فکر این بودم که وقتی که تو برنامه هایی که می نویسم که تو شبکه کار می کنند ، اگه وسط کار یک کاربر برقا برن و سرور خاموش بشه (با فرض اینکه یو پی نداشته باشه) باید یکی از کاربرا بره و سرور رو روشن کنه ، حالا اگه این سرور نزدیک باشه که زیاد مساله ساز نیست ولی تو یکی از کارام که سرور دور تر از یکی از کاربران بود و این کاربر همیشه بع از وقت اداری کارش شروع میشد و برقا هم خیلی وقتا ادا در می اورد ، این بیچاره حد اقل دو سه روز یک بار مجبور بود وسط کار بره و سرور رو دوباره روشن کنه ، این بود که روشن کردن سرور از طریق شبکه برام پر رنگ تر شد
اولش یکم سرج کردم ولی مایوس شدم
نه از انجام این کار بلکه از انجامش از طریق برنامه نویسی و شبکه ، خواستم یک سخت افزار بسازم که از راه دور یا حد اقل با سیم کشی بشه سرور رو روشن کرد ، دنبالش هم رفتم ، کار عملی هم بود ولی یه روز نسشتم و بیشتر به Wake On Lan فکر کردم که دیم یکی از دوستان تو تالار شبکه مطلب پست بعدی رو نوشته

hojjatshariffam
شنبه 20 شهریور 1389, 15:14 عصر
اینگونه نرم افزار ها از خاصیت WakeOnLan مادربورد استفاده میکنند در صورتی که مادربورد شما این قابلیت را پشتیبانی کند میتونید از اینگونه نرم افزار ها استفاده کنید روش عملکرد این نرم افزار ها به شرح زیر است :

پکت های ارسالی که در WakeOnLan استفاده می شوند از نوع UDP هستند کهشامل MAC آدرس کارت شبکه کامپیوتر مقصد می باشد . که معمولا MAC آدرس به صورت string در مبنای 16 مشخص می شود به عنوان مثال (00:0D:61:08:22:4A ). که برای ارسال آن تنها نیاز به 6 بایت است و همچنین این پکت نیاز به 6 بایت جهت header و 16 برابر طول اطلاعات جهت مشخص شدن نوع آن که مجموعا برابر با 102 بایت می شود .


6 بایت اول پکت که مربوط به header آن است بایستی با 0Xff پر شود.
6 بایت دوم پکت بایستی برابر با MAC آدرس کامپیوتر مقصد شود .
و به ترتیب تا انتهای پکت هر 6 بایت بایستی برابر با مقدار MAC آدرس کامپیوتر شود تا انتهای پکت

این پکت UDP به صورت Broadcast بر روی پورت 9 ارسال می شود همانند 200.0.0.255 . این پکت توسط تمامی کامپیوتر هایی که در شبکه شما وجود دارند دریافت می شود . اما تنها کامپیوتری که MAC آدرس آن با MAC آدرسی که در پکت نوشته شده است یکی باشد روشن می شود .

توجه داشته باشید در صورتی که ترافیک شبکه شما بالا باشد هیچ تضمینی در دریافت این پکت نیست بنابر این شما بایستی این پکت را بیشتر از یک بار ارسال کنید .

موفق باشید .
البته با تشکر از این دوست عزیز
رفتم تو کد پروجکت و سرچ کردم یه مطلب شبیه کفته های این دوستمون پیدا کردم
روش کار کردم و به نتیجه رسیدم
البته تو کد پروجکت کامل بود ولی باید خودمم از سر در می آوردم دیگه
کدار رو تو پست بعی میزارم تا بقیه دوستان هم بتونن در صورت نیاز ازش استفاده کنند

hojjatshariffam
شنبه 20 شهریور 1389, 15:28 عصر
برای این کار باید تو تنظیمات بایوستون گزینه Wake On Lan رو فعال کنید
البته در برد ها متفاوت این گزینه متفاوت می تواند باشد مثلا Boot From NetWork یا Wake On PCI Card یا Power On With NetworkCard یا گزینه های مشابه دیگر
البته به یاد داشته باشید که ممکن است برد کامپیوتر شما حتما از این امکان سخت افزاری پشتیبانی کند وگر نه که تلاشتون بی نتیجه است ، ضمنا کامپیوتر های با پاور AT اصلا این قابلبت رو ندارند و باید پاورتون ATX باشد تا بردتان نیز امکان استفاده از این امکان رو داشته باشد

و اما کد ها:
ابتدا یک کلاس درست کنید که از UDPClient که در حوزه نام System.Net.Sockets قرار دارد ارث ببرد

public class WOLClass:UdpClient
{
public WOLClass():base()
{ }
//this is needed to send broadcast packet

public void SetClientToBrodcastMode()
{
if(this.Active)
this.Client.SetSocketOption(SocketOptionLevel.Sock et,
SocketOptionName.Broadcast,0);
}
}

بعدش تو کلاس اصلی که می خواین از اونجا این کار رو انجام یه متد به صورت زیر بسازید

private void WakeFunction(string MAC_ADDRESS)
{
WOLClass client = new WOLClass();
client.Connect(new
IPAddress(0xffffffff), //255.255.255.255 i.e broadcast

0x2fff); // port=12287 let's use this one

client.SetClientToBrodcastMode();

int counter = 0;

byte[] bytes = new byte[1024]; // more than enough :-)

//first 6 bytes should be 0xFF

for (int y = 0; y < 6; y++)
bytes[counter++] = 0xFF;
//now repeate MAC 16 times

for (int y = 0; y < 16; y++)
{
int i = 0;
for (int z = 0; z < 6; z++)
{
bytes[counter++] =
byte.Parse(MAC_ADDRESS.Substring(i, 2), System.Globalization.NumberStyles.HexNumber);
i += 2;
}
}

int reterned_value = client.Send(bytes, 1024);
}
کار دیگه تمومه
یه باتن بزارین رو فرمتون و توی رویداد کلیک این متد رو با مک آدرس کامپیوتر مورد نظرتون کال کنید
بصورت زیر



WakeFunction("0041a37f5fd2");

hojjatshariffam
شنبه 20 شهریور 1389, 15:34 عصر
اگه بخواید چند کامپیوتر رو با هم روشن کنید یه تکست باکس بزارید و مک آدرس رو از داخل اون به برنامه بدید ، البته می تونی لیست هم بسازید و تو یه فایل ذخیره کنید و با انتخاب نام کامپیوتر اون رو روشن کنید
خاموش کردن کامپیوتر ها هم امکان پذیر ، یه برنامه تو کمیاب آنلاین بود به اسم RemoteShutdown این کار رو می کنه ، اگه بشه می خوام روش اونم یاد بگیرم و کلا یه برنامه ساده و منسجم برای روشن و خاموش کردن کلاینت های شبکه درست کنم
اگه از دوستان در این مورد اطلاعی دارند ما رو هم راهنمائی کنند

hojjatshariffam
شنبه 20 شهریور 1389, 15:39 عصر
ضمنا برای اینکه مک آدرس یک سیستم رو بدست بیارید می تونید تو کامند پرومت از دستور زیر استفاده کنید



arp -a


مک آدرس اون سیستم براتون نشون داده میشه
البته ممکنه که بیش از یک کارت شبکه داشته باشد که در اینصورت مک آدرس همشون نمایش داده میشه . توجه داشته باشد که مک اون کارتی رو وارد برنامه کنید که به همون شبکتون وصله
ضمنا مک آدرس یه شماره 12 کاراکتری در مبنای 16 می باشد که دو تا دوتا از هم جدا شدند ، تو کد ما نباید فاصله و یا هیچ - بین این 6 قسمت مک آدرس قرار بگیره
موفق باشید

molana alavi
شنبه 20 شهریور 1389, 22:57 عصر
واقعا جالب بود

shima2006
شنبه 20 شهریور 1389, 23:53 عصر
شما الان از این برنامه استفاده میکنید؟
یعنی تست شده؟؟؟
اگه بشه که خیلی عالیه...

iman_me
یک شنبه 21 شهریور 1389, 07:11 صبح
من قبلا اين برنامه رو ساخته بودم و در كارگاه كامپيوتر دانشگاهمون امتحان كردم ولي نه با اين همه محدوديت
كه اگه فلان باشه نميشه ...
فقط مستلزم وصله شبكه بود
چون من از دستورات داس استفاده ميكردم خوب كه نه عالي جواب ميداد

ricky22
یک شنبه 21 شهریور 1389, 07:54 صبح
سلام
درباره Wake on lan جستجو کنید
using System; using System.Net.Sockets; //we derive our class from a standart one public class WOLClass:UdpClient { public WOLClass():base() { } //this is needed to send broadcast packet public void SetClientToBrodcastMode() { if(this.Active) this.Client.SetSocketOption(SocketOptionLevel.Sock et, SocketOptionName.Broadcast,0); } } ... //now use this class //MAC_ADDRESS should look like '013FA049' private void WakeFunction(string MAC_ADDRESS) { WOLClass client=new WOLClass(); client.Connect(new IPAddress(0xffffffff), //255.255.255.255 i.e broadcast 0x2fff); // port=12287 let's use this one client.SetClientToBrodcastMode(); //set sending bites int counter=0; //buffer to be send byte[] bytes=new byte[1024]; // more than enough :-) //first 6 bytes should be 0xFF for(int y=0;y<6;y++) bytes[counter++]=0xFF; //now repeate MAC 16 times for(int y=0;y<16;y++) { int i=0; for(int z=0;z<6;z++) { bytes[counter++]= byte.Parse(MAC_ADDRESS.Substring(i,2), NumberStyles.HexNumber); i+=2; } } //now send wake up packet int reterned_value=client.Send(bytes,1024); }

hojjatshariffam
یک شنبه 21 شهریور 1389, 11:42 صبح
شما الان از این برنامه استفاده میکنید؟
یعنی تست شده؟؟؟
اگه بشه که خیلی عالیه...
بله دوست من
من الان دارم ازش استفاده می کنم ، تو شبکم حدود 11 تا کامپیوتر دارم که بجز 2 تاش که مادربردشون این امکان رونداره ، همشون با ارسال پکت حاوی مک آدرشون ، روشن میشن
این امکان رو تو برنامم گذاشتم که بتونم همشونو با هم و یا هر کدومو تک تک بتونم Wake On کنم
--------------------

من قبلا اين برنامه رو ساخته بودم و در كارگاه كامپيوتر دانشگاهمون امتحان كردم ولي نه با اين همه محدوديت
كه اگه فلان باشه نميشه ...
فقط مستلزم وصله شبكه بود
چون من از دستورات داس استفاده ميكردم خوب كه نه عالي جواب ميداد
همه محدودیت اینه که برد کامپویتر از خاصیت Wake On Lan پشتیبانی کنه
ظاهرا تو کارگاه کامپیوتر اونجا همه برداشون اونو ساپورت میکرده ، اکثرا کارگاه های دانشگاه ها تقریبا همه کامپیوتر ها شبیه همند پس اگه یکی ساپورت میکرده پس همشون اینو ساپورت می کردند ، برا همین این محدودیت به چشمتون نیومده

flash118
یک شنبه 21 شهریور 1389, 11:51 صبح
ایول عالی بود داش حجت اگه میشه سورس رو هم بزارید منم یه نمونه نوشتم ولی یک در میان خاموش شدن خودم که موندم چطور شد این جور شد ولی خوب برای بازی عالیه اگه میشه سورس رو بهم برسونید تا امتحان کنم ببینم مشکل کار کجاست

hojjatshariffam
سه شنبه 23 شهریور 1389, 21:26 عصر
ایول عالی بود داش حجت اگه میشه سورس رو هم بزارید منم یه نمونه نوشتم ولی یک در میان خاموش شدن خودم که موندم چطور شد این جور شد ولی خوب برای بازی عالیه اگه میشه سورس رو بهم برسونید تا امتحان کنم ببینم مشکل کار کجاست
خاموش شدن یا روشن شدند؟
در مورد سورس هم ، چند روزیه درگیر یه امتحانم ، امتحانمو که تموم کردم ، یکم روش بیشتر کار می کنم و میزارمش اینجا
موفق باشید

A.Karimi
سه شنبه 02 فروردین 1390, 17:43 عصر
خاموش کردن کامپیوتر ها هم امکان پذیر ، یه برنامه تو کمیاب آنلاین بود به اسم RemoteShutdown این کار رو می کنه ، اگه بشه می خوام روش اونم یاد بگیرم و کلا یه برنامه ساده و منسجم برای روشن و خاموش کردن کلاینت های شبکه درست کنم
اگه از دوستان در این مورد اطلاعی دارند ما رو هم راهنمائی کنند

برای اینکار باید دو برنامه بسازید؛ 1. Server و 2. Client
شما برنامه نویسی سمت Client را به خوبی در همین مثال بسیار آموزنده، پیاده کردید. پس فقط باید سمت Server را پیاده کنید که با نگاهی به کلاس TcpListener و ارثبری از آن به راحتی می‌توانید یک سرور ساده که حتی قادر به انجام کارهایی بیشتر از خاموش کردن سیستم باشد را ایجاد نمایید. البته برای این‌کار نیاز به طراحی یک پروتکل ساده که می‌تواند فقط یک کلاس شامل چند فیلد و Property باشد را ایجاد کرده و با Serialize کردن آن این کلاس را بین Client و Server جابجا کنید.
در کل پیش‌نیاز این کار، یادگیری Socket Programming است که بی‌نهایت ساده و لذت بخش است.

بد نیست بدانید که همین کار را حتی با سادگی بیشتر، می‌توانید با استفاده از WCF پیاده کنید که اگر به WCF اشراف کمی هم داشته باشید کار کمتر از 1 ساعت خواهد بود.

موفق باشید.

sabloger
سه شنبه 02 فروردین 1390, 20:10 عصر
تاپیک جالبی بود
ممنون از همه دوستان

ashkan2005
سه شنبه 02 فروردین 1390, 20:35 عصر
سلام دوستان من هم در c# 2010 امتحان کردم خوب جواب داد با یک تغییر کوچک در یک سطر


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
namespace WindowsFormsApplication1
{
publicpartialclassForm1 : Form
{
public Form1()
{
InitializeComponent();
}

string h;
privatevoid button1_Click(object sender, EventArgs e)
{
مک آدرس رو از اینجا میدم.
h = "1C5465490795";
WOLClass client = newWOLClass();
در اینجا هم به جای new IPAddress از کد زیر استفاده کردم.
client.Connect(new System.Net.IPAddress(0xffffffff), 0x2fff);
client.SetClientToBrodcastMode();
int counter = 0;
byte[] bytes = newbyte[1024];
// more than enough :-)
//first 6 bytes should be 0xFF
for (int y = 0; y < 6; y++)
bytes[counter++] = 0xFF;
//now repeate MAC 16 times
for (int y = 0; y < 16; y++)
{
int i = 0;
for (int z = 0; z < 6; z++)
{
bytes[counter++] = byte.Parse(h.Substring(i, 2), System.Globalization.NumberStyles.HexNumber);
i += 2;
}
}
int reterned_value = client.Send(bytes, 1024);
MessageBox.Show("jjj");
}
 
}
}
publicclassWOLClass : UdpClient
{
public WOLClass()
: base()
{ }
publicvoid SetClientToBrodcastMode()
{
if (this.Active)
this.Client.SetSocketOption(SocketOptionLevel.Sock et, SocketOptionName.Broadcast, 0);
}
 
}

hadi-z
چهارشنبه 03 فروردین 1390, 14:23 عصر
سلام

منم قبلا یه نمونه کد پیدا کرده بودم
شاید مفید باشه

using System.Management;

public class Win32OperatingSystem
{

public static void Shutdown(string machineName, string username, string
password)
{
ManagementScope Scope = null;
ConnectionOptions
ConnOptions = null;
ObjectQuery ObjQuery = null;

ManagementObjectSearcher ObjSearcher = null;
try
{
ConnOptions =
new ConnectionOptions();
ConnOptions.Impersonation =
ImpersonationLevel.Impersonate;
ConnOptions.EnablePrivileges = true;

//local machine
if (machineName.ToUpper() ==
Environment.MachineName.ToUpper() )
Scope = new
ManagementScope(@"\ROOT\CIMV2", ConnOptions);

else
{
//remote
machine
ConnOptions.Username = username;
ConnOptions.Password =
password;
Scope = new ManagementScope(@"\\" + machineName + @"\ROOT\CIMV2",
ConnOptions);
}
Scope.Connect();
ObjQuery = new ObjectQuery("SELECT
* FROM Win32_OperatingSystem");
ObjSearcher = new
ManagementObjectSearcher(Scope, ObjQuery );
foreach( ManagementObject
operatingSystem in ObjSearcher.Get())
{
MessageBox.Show("Caption = " +
operatingSystem.GetPropertyValue("Caption"));
MessageBox.Show("Version = " +
operatingSystem.GetPropertyValue("Version"));
ManagementBaseObject outParams
= operatingSystem.InvokeMethod ("Shutdown",null,null);

}
}
catch
(Exception ex)
{
throw ex;
}
}
}

//Note:
Call
the function like:
[STAThread]
static void Main(string[] args)
{

Win32OperatingSystem.Shutdown(@"Machinename", @"UserName", @"Pwd");
}

m3raj_3
پنج شنبه 19 مرداد 1391, 10:30 صبح
سلام دوستان من هم در c# 2010 امتحان کردم خوب جواب داد با یک تغییر کوچک در یک سطر


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
namespace WindowsFormsApplication1
{
publicpartialclassForm1 : Form
{
public Form1()
{
InitializeComponent();
}

string h;
privatevoid button1_Click(object sender, EventArgs e)
{
مک آدرس رو از اینجا میدم.
h = "1C5465490795";
WOLClass client = newWOLClass();
در اینجا هم به جای new IPAddress از کد زیر استفاده کردم.
client.Connect(new System.Net.IPAddress(0xffffffff), 0x2fff);
client.SetClientToBrodcastMode();
int counter = 0;
byte[] bytes = newbyte[1024];
// more than enough :-)
//first 6 bytes should be 0xFF
for (int y = 0; y < 6; y++)
bytes[counter++] = 0xFF;
//now repeate MAC 16 times
for (int y = 0; y < 16; y++)
{
int i = 0;
for (int z = 0; z < 6; z++)
{
bytes[counter++] = byte.Parse(h.Substring(i, 2), System.Globalization.NumberStyles.HexNumber);
i += 2;
}
}
int reterned_value = client.Send(bytes, 1024);
MessageBox.Show("jjj");
}
 
}
}
publicclassWOLClass : UdpClient
{
public WOLClass()
: base()
{ }
publicvoid SetClientToBrodcastMode()
{
if (this.Active)
this.Client.SetSocketOption(SocketOptionLevel.Sock et, SocketOptionName.Broadcast, 0);
}
 
}


الان در قسمتی که تو کد بالا نوشتی new system.net Ip address توش یه کد نوشتی (0xfffffff) این کد رو باید تغییر بدم؟اگه باید تغییربدم چه جوری و ازکجا بفهمم چی بنویسم به جاش

saeed7007
دوشنبه 02 اردیبهشت 1392, 02:42 صبح
نمونه کد دلفی این وجود داره؟

fazelit
جمعه 18 مرداد 1392, 15:42 عصر
در قسمت آی پی آدرس و پورت باید چی بنویسیم؟
در ضمن اگه ما می خوایم از راه دور یعنی با اینترنت کامپیوترمون روشن کنیم باید آی پی و پورت رو چی بدیم؟