python 禁用网卡_如何编程实现启用禁用网卡

展开全部

/*****************************************************************************

演示如何编程62616964757a686964616fe58685e5aeb931333335343935实现启用禁用网卡

Mady

By ZwelL

2004.7.29

zwell@sohu.com

*****************************************************************************/

#include

#include

#include

#include

#pragma

comment(lib,”ws2_32.lib”)

#pragma

comment(lib,”setupapi.lib”)

BOOL DisableNetInterface(bool bStatus)

{

IN LPTSTR HardwareId

;

//硬件ComponentId,注册表地址:system\currentcontrolset\class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0000

HardwareId=”PCI\\VEN_10EC&DEV_8139&SUBSYS_813910EC” ;

DWORD NewState ;

if(bStatus)

{

NewState=DICS_DISABLE ;

//禁用

}

else

{

NewState=DICS_ENABLE ;

//启用

}

//调用ddk函数,来禁用网卡

DWORD i,err ;

BOOL Found=false

;

HDEVINFO hDevInfo ;

SP_DEVINFO_DATA spDevInfoData

;

//访问系统的硬件库

hDevInfo=SetupDiGetClassDevs(NULL,”PCI”,NULL,DIGCF_ALLCLASSES|DIGCF_PRESENT);

if(hDevInfo==INVALID_HANDLE_VALUE)

{

printf(”访问系统硬件出错!”);

return false ;

}

//枚举硬件,获得需要的接口

spDevInfoData.cbSize=sizeof(SP_DEVINFO_DATA);

for(i=0;SetupDiEnumDeviceInfo(hDevInfo,i,&spDevInfoData);i++)

{

DWORD DataT ;

LPTSTR p,buffer=NULL ;

DWORD

buffersize=0 ;

//获得硬件的属性值

while(!SetupDiGetDeviceRegistryProperty(

hDevInfo,

&spDevInfoData,

SPDRP_HARDWAREID,

&DataT,

(PBYTE)buffer,

buffersize,

&buffersize))

{

if(GetLastError()==ERROR_INVALID_DATA)

{

//不存在HardwareID. Continue.

break

;

}

else

if(GetLastError()==ERROR_INSUFFICIENT_BUFFER)

{

//buffer size不对.

if(buffer)

LocalFree(buffer);

buffer=(char*)LocalAlloc(LPTR,buffersize);

}

else

{

//未知错误

goto

cleanup_DeviceInfo ;

}

}

if(GetLastError()==ERROR_INVALID_DATA)

continue

;

//比较,找到和网卡ID相同的项

for(p=buffer;*p&&(p

{

if(!_tcscmp(HardwareId,p))

{

//找到网卡

Found=TRUE ;

break ;

}

}

if(buffer)

LocalFree(buffer);

//如果相等

if(Found)

{

//禁用该设备

SP_PROPCHANGE_PARAMS spPropChangeParams

;

spPropChangeParams.ClassInstallHeader.cbSize=sizeof(SP_CLASSINSTALL_HEADER);

spPropChangeParams.ClassInstallHeader.InstallFunction=DIF_PROPERTYCHANGE

;

spPropChangeParams.Scope=DICS_FLAG_GLOBAL ;

spPropChangeParams.StateChange=NewState ;

//禁用:DICS_DISABLE,DICS_ENABLE启用

//

if(!SetupDiSetClassInstallParams(hDevInfo,&spDevInfoData,(SP_CLASSINSTALL_HEADER*)&spPropChangeParams,sizeof(spPropChangeParams)))

{

DWORD errorcode=GetLastError();

}

if(!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,hDevInfo,&spDevInfoData))

{

DWORD errorcode=GetLastError();

}

switch(NewState)

{

case DICS_DISABLE

:

printf(”成功禁用网络!”);

break ;

case

DICS_ENABLE :

printf(”成功启用网络!”);

break

;

}

break ;

}

}

//退出时,清理工作环境

cleanup_DeviceInfo

:

err=GetLastError();

SetupDiDestroyDeviceInfoList(hDevInfo);

SetLastError(err);

return true ;

}

void usage(char *exefile)

{

printf(”Usage:%s [-e|-d]\r\n”,

exefile);

printf(”\t-e: Enable the network card.\r\n”);

printf(”\t-d:

Disable the network card.\r\n”);

exit(0);

}

int main(int

argc,char**argv)

{

if(argc<2)

usage(argv[0]);

if(!DisableNetInterface((strstr(argv[1],”-d”)>0?TRUE:FALSE)))

printf(”对网卡操作失败!”);

return 0;

}

//————————————————————————————————————

例子二:

#include

#include

#include

#include

#pragma comment (lib,”setupapi”)

#define UnknownDevice TEXT(””)

HDEVINFO hDevInfo = 0;

BOOL StateChange(DWORD NewState, DWORD SelectedItem,HDEVINFO

hDevInfo)

{

SP_PROPCHANGE_PARAMS PropChangeParams =

{sizeof(SP_CLASSINSTALL_HEADER)};

SP_DEVINFO_DATA DeviceInfoData =

{sizeof(SP_DEVINFO_DATA)};

HCURSOR hCursor;

//

// This may take a while :^(

//

hCursor =

SetCursor(LoadCursor(NULL, IDC_WAIT));

//

// Get a handle to the Selected Item.

//

if

(!SetupDiEnumDeviceInfo(hDevInfo,SelectedItem,&DeviceInfoData))

{

printf(”EnumDeviceInfo”);

return FALSE;

}

//

// Set the PropChangeParams structure.

//

PropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;

PropChangeParams.Scope = DICS_FLAG_GLOBAL;

PropChangeParams.StateChange =

NewState;

if (!SetupDiSetClassInstallParams(hDevInfo,

&DeviceInfoData,

(SP_CLASSINSTALL_HEADER

*)&PropChangeParams,

sizeof(PropChangeParams)))

{

printf(”SetClassInstallParams”);

SetCursor(hCursor);

return FALSE;

}

//

// Call the ClassInstaller and perform the change.

//

if (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,

hDevInfo,

&DeviceInfoData))

{

printf(”SetClassInstallParams”);

SetCursor(hCursor);

return TRUE;

}

SetCursor(hCursor);

return TRUE;

}

BOOL IsClassNet( GUID * ClassGuid )

{

#define MAX_NUM 50

HKEY hKeyClass;

LONG lRet;

char

ClassType[MAX_NUM];

char NetClass[MAX_NUM] = “Net”;

DWORD dwLength =

MAX_NUM,dwType = REG_SZ;

if (hKeyClass =

SetupDiOpenClassRegKey(ClassGuid,KEY_READ))

{

lRet =

RegQueryValueEx(hKeyClass,

TEXT(”Class”),

NULL,

&dwType, LPBYTE(ClassType), &dwLength);

RegCloseKey(hKeyClass);

if (lRet != ERROR_SUCCESS)

return FALSE;

if (!strcmp(ClassType,NetClass))

return TRUE;

}

return FALSE;

}

int main(int argc, char* argv[])

{

if (INVALID_HANDLE_VALUE ==

(hDevInfo =

SetupDiGetClassDevs(NULL,NULL,0,

DIGCF_PRESENT|DIGCF_ALLCLASSES)))

{

printf(”GetClassDevs”);

return 0;

}

DWORD i, Status, Problem;

SP_DEVINFO_DATA DeviceInfoData =

{sizeof(SP_DEVINFO_DATA)};

HKEY hKeyClass;

char DeviceName[200];

for

(i=0;SetupDiEnumDeviceInfo(hDevInfo,i,&DeviceInfoData);i++)

{

if

(IsClassNet(&DeviceInfoData.ClassGuid))

{

//printf(” the class’s

index is %d\n”,i);

//DICS_DISABLE–>禁用网络

//DICS_ENABLE—>恢复网络

if

(StateChange(DICS_ENABLE,i,hDevInfo))

printf(”.”);

//printf(”NetWork

%s”, (DICS_ENABLE)?”enabled”:”disabled”);

}

}

return 0;

}

本回答由电脑网络分类达人 郭强推荐

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
xp下用netsh禁用启用网卡 在XP系统中不支持netsh interface set interface name命令扩展,所以此命令是无法正常运行的,提取2003下的ifmon.dll文件覆盖,就可以用了。 winxp下使用: netsh interface set interface "本地连接" "disabled" 会出现 如下错误提示: 代码: C:\>netsh interface set interface "本地连接" "disabled" 没有指定一个或多个关键性参数 此命令提供的语法不正确。请查看帮助以获取正确的语法信息。 用法 set interface [name = ] IfName [ [admin = ] ENABLED|DISABLED [connect = ] CONNECTED|DISCONNECTED [newname = ] NewName ] 设置接口参数。 IfName - 接口名称 admin - 接口是否被启用 (仅用于非 LAN)。 connect - 是否连接接口 (仅用于非 LAN)。 newname - 接口的新名称 (仅用于非 LAN)。 注意: - 除名称外,还必须至少指定一个选项。 - 如果 connect = CONNECTED 被指定,那么接口被自动 启用,甚至在 admin = DISABLED 选项被指定时也是如 此。 =========================== 替换XP下的ifmon.dll步骤: 但是你可以把win2003系统下 C:\\WINDOWS\\system32\\ifmon.dll文件 拷贝到winxp系统下来使用,从而实现网卡禁用启用拷贝时候需要注意:需要先把 ifmon.dll文件拷贝到 C:\\WINDOWS\\system32\\dllcache 替换掉系统文件再拷贝到 C:\\WINDOWS\\system32 替换掉系统文件,若系统会提示 文件被修改了,是否从安装盘还原,选择保持修改的文件就替换成功了。 替换后就可以正常使用netsh命令来禁用启用网卡了 =========================== 根目录附件中上有win2003的ifmon.dll文件备份 DOS下重启网卡 @ rem 关闭网卡: netsh interface set interface name="本地连接" admin=DISABLED @ rem 开启网卡: netsh interface set interface name="本地连接" admin=ENABLED 使用PPPOE协议进行宽带拨号时,若要重新拨号,不要对使用PPPOE的“宽带连接”netsh,而应该对“本地连接”netsh WN7可直接用批处理 如果还不会下载我的附件吧0分。内含有XP用win2003的ifmon.dll文件备份及所用所有批处理文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值