哪位老大有C#的禁用网卡和启用网卡的程序?100相送。
我找到了C++的程序,可惜水平太次,不会转成C#的,请各位帮忙,分不够再加.
如何编程实现启用禁用网卡
演示如何编程实现启用禁用网卡
Mady By ZwelL
2004.7.29
zwell@sohu.com
#include windows.h
#include setupapi.h
#include tchar.h
#include stdio.h
#pragma comment(lib,ws2_32.lib)
#pragma comment(lib,setupapi.lib)
BOOL DisableNetInterface(bool bStatus)
{
IN LPTSTR HardwareId ;
硬件ComponentId,注册表地址:systemcurrentcontrolsetclass{4D36E972-E325-11CE-BFC1-08002BE10318}0000
HardwareId=PCIVEN_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_ALLCLASSESDIGCF_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&buffer[buffersize]);p+=lstrlen(p)+sizeof(TCHAR))
{
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]rn, exefile);
printf(t-e Enable the network card.rn);
printf(t-d Disable the network card.rn);
exit(0);
}
int main(int argc,charargv)
{
if(argc2)
usage(argv[0]);
if(!DisableNetInterface((strstr(argv[1],-d)0TRUEFALSE)))
printf(对网卡操作失败!);
return 0;
}
问题点数:100、回复次数:14Top
1 楼hxhbluestar(贺星河)回复于 2005-12-01 10:16:38 得分 20
先看show interface 的结果, 然后选择你要disable的interface. 注意带空格的名称需要用引号.
netsh interface show interface
Admin State State Type Interface Name
-------------------------------------------------------------------------
Enabled Unreachable Dedicated Local Area Connection 2
Enabled Unreachable Dedicated Local Area Connection
Enabled Unreachable Internal Internal
Enabled Unreachable Loopback Loopback
关闭
netsh interface set interface name="Local Area Connection" admin=DISABLED
开启
netsh interface set interface name="Local Area Connection" admin=ENABLE
如果是中文操作系统的话就name="本地连接",依此类推
C#代码如下:
Process pro = new Process();
pro.StartInfo.UseShellExecute = false;
pro.StartInfo.RedirectStandardError = true;
pro.StartInfo.RedirectStandardInput = true;
pro.StartInfo.RedirectStandardOutput = true;
pro.StartInfo.FileName = "netsh.exe";
pro.StartInfo.Arguments = "interface set interface name=\"Local Area Connection\" admin=Enable";
pro.StartInfo.CreateNoWindow = true;
pro.Start();
Top
2 楼hxhbluestar(贺星河)回复于 2005-12-01 10:31:05 得分 0
Sorry,我在win2003 英文版下测试通过,winxp不行,好像这个命令不支持中文Top
3 楼q_po_o(两个人)回复于 2005-12-01 10:43:49 得分 0
markTop
4 楼argo_lzq(李生)回复于 2005-12-01 11:11:43 得分 0
我把“本地连接”改成了英文,也不行,报错
没有指定一个或多个关键性参数
此命令提供的语法不正确。请查看帮助以获取正确的语法信息。
用法 set interface [name = ] IfName
[ [admin = ] ENABLED|DISABLED
[connect = ] CONNECTED|DISCONNECTED
[newname = ] NewName ]
设置接口参数。
IfName - 接口名称
admin - 接口是否被启用 (仅用于非 LAN)。
connect - 是否连接接口 (仅用于非 LAN)。
newname - 接口的新名称 (仅用于非 LAN)。
注意:
- 除名称外,还必须至少指定一个选项。
- 如果 connect = CONNECTED 被指定,那么接口被自动
启用,甚至在 admin = DISABLED 选项被指定时也是如
此。Top
5 楼argo_lzq(李生)回复于 2005-12-01 11:12:54 得分 0
现在命令行是:
netsh interface set interface name="localnet" admin=DISABLEDTop
6 楼myblind(敲键盘的农民)回复于 2005-12-01 13:48:21 得分 5
高手啊Top
7 楼argo_lzq(李生)回复于 2005-12-01 15:18:16 得分 0
可惜,还是没有解决,如果分不够,再加也行啊,Top
8 楼s5689412(华君)回复于 2005-12-01 15:34:50 得分 20
From forums.microsoft.com
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=114198&SiteID=1
MSDN论坛上也有人问到类似的问题,下面的这两个链接帮助他解决了问题,也希望能帮助你。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/wmi_tasks__networking.asp
http://www.codeproject.com/csharp/wmimadeeasy.asp
Top
9 楼argo_lzq(李生)回复于 2005-12-02 16:50:22 得分 0
有点思路,但是还没有解决。Top
10 楼argo_lzq(李生)回复于 2005-12-06 12:57:56 得分 0
哪位高手可否帮忙看看这段代码,为何实现不了?
public void SetNetCard(bool sEnable)
{
ManagementClass objMC = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection objMOC = objMC.GetInstances();
foreach(ManagementObject objMO in objMOC)
{
try
{
ManagementBaseObject objSetIP = null;
ManagementBaseObject objNewGate = null;
objNewGate = objMO.GetMethodParameters("IPEnabled");
objNewGate["IPEnabled"] = new bool[] {sEnable};
objSetIP = objMO.InvokeMethod("IPEnabled",objNewGate,null);
}
catch(Exception ex)
{
Console.WriteLine("Unable to Set IP : " + ex.Message);
}
}
}Top
11 楼huanggj(新人)回复于 2005-12-06 16:28:38 得分 5
学习
Top
12 楼sxlfybb(房客)回复于 2005-12-06 16:56:28 得分 0
markTop
13 楼jinjazz(近身剪)回复于 2005-12-06 17:14:50 得分 50
//添加引用-COM-浏览-C:\WINDOWS\system32\shell32.dll-添加
private bool SetNetworkAdapter(bool status)
{
const string discVerb = "禁用(&B)";
const string connVerb = "启用(&A)";
const string networkConnection = "网络连接";
string sVerb;
if (status) sVerb = connVerb;
else sVerb = discVerb;
Shell32.Shell sh = new Shell32.Shell();
Shell32.Folder folder;
folder = sh.NameSpace(3); //Shell32.ShellSpecialFolderConstants.ssfCONTROLS
try
{
foreach (Shell32.FolderItem myItem in folder.Items())
{
if (myItem.Name == networkConnection)
{
Shell32.Folder fd = (Shell32.Folder)myItem.GetFolder;
foreach (Shell32.FolderItem fi in fd.Items())
{
if (fi.Name.IndexOf("VMware") > -1)
{
foreach (Shell32.FolderItemVerb Fib in fi.Verbs())
{
// listBox1.Items.Add(Fib.Name);
if (Fib.Name == sVerb)
{
Fib.DoIt();
break;
}
}
}
}
}
}
}
catch (Exception e)
{
//sbpnl2.Text = e.Message;
MessageBox.Show(e.Message);
return false;
}
return true;
}Top
14 楼argo_lzq(李生)回复于 2005-12-06 17:39:28 得分 0
在XP中测试过,还是不行,不过非常感谢Top




