PDA

View Full Version : نوشتن برنامه برای قطع ارتباط یکی از کلاینت ها



Mahdi_Delphi
پنج شنبه 11 آبان 1385, 18:37 عصر
سلام

یک شبکه Lan داریم که به صورت WorkGroup هست و یکی از کامپیوترها سرور اینترنته و تعدادی هم کلاینت هستند.

چطور میشه برنامه ای نوشت که ارتباط بین سرور و یک کلاینت خاص رو برای مدت مشخصی قطع کنه؟

یعنی هیچ بسته ای بین سرور و اون کامپیوتر رد و بدل نشه؟!

در واقع میخوام از طریق سرور ارتباط اون کلاینت رو با اینترنت قطع کنم !

ممنون میشم راهنمایی کنید.

Touska
پنج شنبه 11 آبان 1385, 19:40 عصر
سلام

یک شبکه Lan داریم که به صورت WorkGroup هست و یکی از کامپیوترها سرور اینترنته و تعدادی هم کلاینت هستند.

چطور میشه برنامه ای نوشت که ارتباط بین سرور و یک کلاینت خاص رو برای مدت مشخصی قطع کنه؟

یعنی هیچ بسته ای بین سرور و اون کامپیوتر رد و بدل نشه؟!

در واقع میخوام از طریق سرور ارتباط اون کلاینت رو با اینترنت قطع کنم !

ممنون میشم راهنمایی کنید.
برای این کار شما باید یک سرور و کلاینت با Indy طراحی کنید که وقتی سرور دستور داد کلاینت

قفل گردد یا کارت شبکه فرد رو Disable کنید :


RE: Disable/Enable Network

Bowers, Michael P. ISD
Tue, 28 Jun 2005 23:05:14 -0700

I did this just recently as a quick test for a proof of concept. It
uses the SetupAPI header translation from Project Jedi and the rest is
adapted from source from the Microsoft Win2K3 DDK. It works in
Win2K/WinXP (the only platforms of interest in my work) but may work in
others. YMMV.


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms,
Dialogs, StdCtrls, SetupAPI;

const
GUID_DEVCLASS_NET: TGUID = '{4D36E972-E325-11CE-BFC1-08002BE10318}';

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

function StateChange(NewState, SelectedItem: cardinal; hDevInfo:
HDEVINFO): boolean;
var
PropChangeParams: SP_PROPCHANGE_PARAMS;
DeviceInfoData: SP_DEVINFO_DATA;
begin
DeviceInfoData.cbSize := SizeOf(SP_DEVINFO_DATA);

// Get handle to selected item
if not SetupDiEnumDeviceInfo(hDevInfo, SelectedItem, DeviceInfoData)
then
begin
Result := False;
Exit;
end;

// Set the PropChangeParams structure for this item
PropChangeParams.ClassInstallHeader.InstallFunctio n :=
DIF_PROPERTYCHANGE;
PropChangeParams.ClassInstallHeader.cbSize :=
SizeOf(SP_CLASSINSTALL_HEADER);
PropChangeParams.Scope := DICS_FLAG_GLOBAL;
PropChangeParams.StateChange := NewState;

if not SetupDiSetClassInstallParams(hDevInfo, @DeviceInfoData,
PSPCLASSINSTALLHEADER(@PropChangeParams), SizeOf(PropChangeParams)) then
begin
Result := False;
Exit;
end;

// Call the ClassInstaller and perform the change
if not SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDevInfo,
@DeviceInfoData) then
begin
Result := False;
Exit;
end;

Result := True;
end;

//
------------------------------------------------------------------------
-----

function DisableNetAdapter: boolean;
var
hdi: HDEVINFO;
begin
hdi := SetupDiGetClassDevs(@GUID_DEVCLASS_NET, nil, 0, DIGCF_PRESENT);

if cardinal(hdi) = INVALID_HANDLE_VALUE then
begin
Result := False;
end
else
begin
Result := StateChange(DICS_DISABLE, 0, hdi);
SetupDiDestroyDeviceInfoList(hdi);
end;
end;

//
------------------------------------------------------------------------
-----

function EnableNetAdapter: boolean;
var
hdi: HDEVINFO;
begin
hdi := SetupDiGetClassDevs(@GUID_DEVCLASS_NET, nil, 0, DIGCF_PRESENT);

if cardinal(hdi) = INVALID_HANDLE_VALUE then
begin
Result := False;
end
else
begin
Result := StateChange(DICS_ENABLE, 0, hdi);
SetupDiDestroyDeviceInfoList(hdi);
end;
end;

//
------------------------------------------------------------------------
-----

procedure TForm1.Button1Click(Sender: TObject);
begin
EnableNetAdapter;
end;

//
------------------------------------------------------------------------
-----

procedure TForm1.Button2Click(Sender: TObject);
begin
DisableNetAdapter;
end;

//
------------------------------------------------------------------------
-----

end.

ولی فکر کنم این کد در Win9X جواب بده تو Xp تست نکردم.

موفق باشید :)

Identifier
جمعه 12 آبان 1385, 09:04 صبح
برای این کار شما باید یک سرور و کلاینت با Indy طراحی کنید که وقتی سرور دستور داد کلاینت
قفل گردد یا کارت شبکه فرد رو Disable کنید :

???????????????????

برای فعال کردن دوباره اش هم حتماً ادمین باید زحمت بکشه بره پای سیستم کارت شبکه را enable کنه :D

Mahdi_Delphi
جمعه 12 آبان 1385, 09:21 صبح
خیلی ممنون

جناب Touska مثال فوق با Indy نوشته شده ؟!

SetupAPI مزبوط به کامپوننت خاصیه ؟


برای فعال کردن دوباره اش هم حتماً ادمین باید زحمت بکشه بره پای سیستم کارت شبکه را enable کنه

من هنوز نتونستم کد رو تست کنم. ولی توی کد یه تابع برای Enable کردن هست.

البته اطلاعات من در حدی نیست که قضاوت کنم و شما مسلماً بهتر میدونید.

آیا راهی هست که فقط از طریق سرور، ادمین بتونه ارتباط یک کلاینت رو قطع کنه؟!
(مثل برنامه های محدود کردن پهنای باند و سرعت کلاینتها)

ممنون از راهنمایی دوستان گرامی

Identifier
جمعه 12 آبان 1385, 09:27 صبح
من هنوز نتونستم کد رو تست کنم. ولی توی کد یه تابع برای Enable کردن هست. این در حالت Local بهت جواب میده اما زمانی که Lan غیر فعال میشه، به طور معمول امکان برقراری ارتباط با کامپیوتر مربوطه در شبکه غیر ممکن میشه

Mahdi_Delphi
جمعه 12 آبان 1385, 16:11 عصر
این در حالت Local بهت جواب میده اما زمانی که Lan غیر فعال میشه، به طور معمول امکان برقراری ارتباط با کامپیوتر مربوطه در شبکه غیر ممکن میشه

درسته،اصلاً به این موضوع فکر نکرده بودم !!!

Touska
جمعه 12 آبان 1385, 22:55 عصر
من به اون فکر کرده بودم سرور زمان مشخص رو به کلاینت ارسال می کنه و

کلاینت سر موقعش اونو فعال می کنه.

پرسیدن برای زمان مشخصی :)

Identifier
شنبه 13 آبان 1385, 06:55 صبح
حامد جان من به اون فکر کرده بودم سرور زمان مشخص رو به کلاینت ارسال می کنه و
کلاینت سر موقعش اونو فعال می کنه.
پرسیدن برای زمان مشخصی :) در این صورت انعطاف پذیری رو از دست میدهد؛
برای انجام این کار میتونید از روش های مختلفی استفاده کنید

1- استفاده از VPN Connection و مدیریت اتصال آن توسط 3rd party Application جهت کنترل اینترنت.

2- استفاده از Windows Packet Filter Framework و ایجاد محدودیت در زمان های مشخص، این فریم ورک به شما امکان می دهد که بتونید Packet ها ردو بدل شده را بررسی و ویرایش کنید .و با استفاده از این فریم ورک شما هیچ نیازی به برنامه نویسی سطح پایین ندارید.

WinpkFilter (http://www.ntkernel.com/w&p.php?id=7)

موفق باشید

nasr
چهارشنبه 25 مهر 1386, 10:51 صبح
برای این کار شما باید یک سرور و کلاینت با Indy طراحی کنید که وقتی سرور دستور داد کلاینت

قفل گردد یا کارت شبکه فرد رو Disable کنید :


RE: Disable/Enable Network

Bowers, Michael P. ISD
Tue, 28 Jun 2005 23:05:14 -0700

I did this just recently as a quick test for a proof of concept. It
uses the SetupAPI header translation from Project Jedi and the rest is
adapted from source from the Microsoft Win2K3 DDK. It works in
Win2K/WinXP (the only platforms of interest in my work) but may work in
others. YMMV.


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms,
Dialogs, StdCtrls, SetupAPI;

const
GUID_DEVCLASS_NET: TGUID = '{4D36E972-E325-11CE-BFC1-08002BE10318}';

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

function StateChange(NewState, SelectedItem: cardinal; hDevInfo:
HDEVINFO): boolean;
var
PropChangeParams: SP_PROPCHANGE_PARAMS;
DeviceInfoData: SP_DEVINFO_DATA;
begin
DeviceInfoData.cbSize := SizeOf(SP_DEVINFO_DATA);

// Get handle to selected item
if not SetupDiEnumDeviceInfo(hDevInfo, SelectedItem, DeviceInfoData)
then
begin
Result := False;
Exit;
end;

// Set the PropChangeParams structure for this item
PropChangeParams.ClassInstallHeader.InstallFunctio n :=
DIF_PROPERTYCHANGE;
PropChangeParams.ClassInstallHeader.cbSize :=
SizeOf(SP_CLASSINSTALL_HEADER);
PropChangeParams.Scope := DICS_FLAG_GLOBAL;
PropChangeParams.StateChange := NewState;

if not SetupDiSetClassInstallParams(hDevInfo, @DeviceInfoData,
PSPCLASSINSTALLHEADER(@PropChangeParams), SizeOf(PropChangeParams)) then
begin
Result := False;
Exit;
end;

// Call the ClassInstaller and perform the change
if not SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDevInfo,
@DeviceInfoData) then
begin
Result := False;
Exit;
end;

Result := True;
end;

//
------------------------------------------------------------------------
-----

function DisableNetAdapter: boolean;
var
hdi: HDEVINFO;
begin
hdi := SetupDiGetClassDevs(@GUID_DEVCLASS_NET, nil, 0, DIGCF_PRESENT);

if cardinal(hdi) = INVALID_HANDLE_VALUE then
begin
Result := False;
end
else
begin
Result := StateChange(DICS_DISABLE, 0, hdi);
SetupDiDestroyDeviceInfoList(hdi);
end;
end;

//
------------------------------------------------------------------------
-----

function EnableNetAdapter: boolean;
var
hdi: HDEVINFO;
begin
hdi := SetupDiGetClassDevs(@GUID_DEVCLASS_NET, nil, 0, DIGCF_PRESENT);

if cardinal(hdi) = INVALID_HANDLE_VALUE then
begin
Result := False;
end
else
begin
Result := StateChange(DICS_ENABLE, 0, hdi);
SetupDiDestroyDeviceInfoList(hdi);
end;
end;

//
------------------------------------------------------------------------
-----

procedure TForm1.Button1Click(Sender: TObject);
begin
EnableNetAdapter;
end;

//
------------------------------------------------------------------------
-----

procedure TForm1.Button2Click(Sender: TObject);
begin
DisableNetAdapter;
end;

//
------------------------------------------------------------------------
-----

end.ولی فکر کنم این کد در Win9X جواب بده تو Xp تست نکردم.

موفق باشید :)

سلام
این کد نمی تونه کارت شبکه را Disable یا Enable کنه!

nasr
یک شنبه 04 آذر 1386, 12:22 عصر
راهی نیست که بشه کارت شبکه را Disable و Enable کرد؟

dkhatibi
دوشنبه 05 آذر 1386, 06:22 صبح
در واقع میخوام از طریق سرور ارتباط اون کلاینت رو با اینترنت قطع کنم !
شاید نوشتن یک سرویس و استفاده از ایندی برای فرستادن یک کد خاص به کلاینت خوب باشه.
در این صورت سرویس مذکور موقعی که کد خاصی را دریافت کرد می تواند به جای غیر فعال کردن شبکه IP ی کلاینت را تغییر داده و مقدار Default Getway اونو حذف کند. البته این کار در صورتی که IP ها اتوماتیک تنظیم می شوند ممکنه موجب Confrit شدن بشه. ولی بهتر از Disable کردن شبکه است. برای این مشکل هم می تونید از Ip ی استفاده نمایید که در محدوده ی شبکه ی شما نیست البته باز هم سبب از دست دادن کل شبکه ی کلاینت مذکور می شوید.
برای فرستادن پیام توسط ایندی مثال هست. تنظیم Ip هم قبلا توسط من یک برنامه گذاشته شده است.

دنیای دلفی
سه شنبه 07 اسفند 1386, 23:59 عصر
بهترین راه kill کردن وب برازرها است . از Task Manager

mortezakiaee
چهارشنبه 08 اسفند 1386, 08:59 صبح
سرویس مذکور موقعی که کد خاصی را دریافت کرد می تواند به جای غیر فعال کردن شبکه IP ی کلاینت را تغییر داده و مقدار Default Getway اونو حذف کند. البته این کار در صورتی که IP ها اتوماتیک تنظیم می شوند ممکنه موجب Confrit شدن بشه. ولی بهتر از Disable کردن شبکه است.
که کارت شبکه رو غیر فعال یا تغییر IP می دین دیگه از شبکه کامل خارج می شه؟ توصیه می کنم از security policy ها استفاده کنید. نمی دونم تو دلفی می شه تغییرشون داد ولی تو سایت مایکروسافت یه سری مثال برای security policy ها هست

dkhatibi
چهارشنبه 08 اسفند 1386, 19:13 عصر
که کارت شبکه رو غیر فعال یا تغییر IP می دین دیگه از شبکه کامل خارج می شه؟
به هیچ وجه اینجوری نیست.