如何更改IP和DNS???(50分)

  • 主题发起人 主题发起人 javesun
  • 开始时间 开始时间
J

javesun

Unregistered / Unconfirmed
GUEST, unregistred user!
如何更改IP和DNS??
最近常常去客户那里,所以经常更改IP和DNS。就想用delphi写一个小程序做一下更改。不过本人水平有限,还要请大家帮忙。
更改IP和DNS,包括静态和动态的两种。
 
如果你的笔记本是IBM的,可上ibm的网站下一个软件!方便快捷!
 
网上很多!自己去找,源码都有!
 
帮忙一下,能找一下源码吗?
 
cmd.exe /c netsh interface ip set address "本地连接" static 172.16.100.100 255.255.0.0 172.16.200.2 1

DNS可以用
netsh interface ip set dns "本地连接" static 192.9.201.1
 
修改注册表
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters/Interfaces/{D963EC22-900C-498F-B42D-FC8402AF3524}

DefaultGateway 为网关
SubnetMask 为子网掩码
NameServer 为DNS
IPAddress 为IP地址
IPAutoconfigurationSeed 为IP是否系统自动配置
自己用DELPHI 写个程序 修改注册表这些地方
 
KeyLife富翁笔记
作者?: TYZhang
标题?: 如何在win98/win2000中禁用启用网卡
关键字: 禁用启用网卡
分类?: 个人专区
密级?: 公开
(评分: , 回复: 1, 阅读: 1521) »»
为响应LeeChange大侠的“授人鱼不如授人渔”号召,在此首度公开我的部分业余写作的原码。
如何在win98/win2000中禁用启用网卡,其实原理很简单,就是枚举出windows中的网络设备,然后设置他的状态,关键代码如下:(其实这个代码也非我原创,是我改写别人的VC代码来得)。
unit ChgEthernet;

interface

uses Classes, Windows, SetupApi, CfgMgr32, Cfg, SysUtils;

type
TNetCardStruct=record
Id :DWORD; // 网卡设备号
Name :String[255]; // 网卡名
Disabled:Boolean; // 当前是否禁用
Changed :Boolean; // 是否更改过
end;
PNetCardStruct=^TNetCardStruct;

procedure EnumNetCards(NetDeviceList:TList); //枚举系统中的网卡
function NetCardStateChange(var NetCardPoint:PNetCardStruct;Enabled:Boolean):Boolean; //设置网卡的状态

implementation

//读取系统的设备属性
function GetRegistryProperty(DeviceInfoSet: HDEVINFO;var DeviceInfoData: SP_DEVINFO_DATA; AProperty: ULONG;var Buffer: Pchar; var BufSize: ULONG): Boolean;
var Temp,OldSize:DWORD;
begin
Result:=False;Temp:=0;OldSize:=BufSize;
while not SetupDiGetDeviceRegistryProperty(DeviceInfoSet,DeviceInfoData, AProperty, Temp, PByte(Buffer), OldSize,BufSize) do
begin
if GetLastError()=ERROR_INSUFFICIENT_BUFFER then
begin
if OldSize>0 then FreeMem(Buffer,OldSize);
GetMem(Buffer,BufSize);OldSize:=BufSize;
end else Exit;
end;
Result:=True;
end;

procedure EnumNetCards(NetDeviceList: TList);
var DevValue:String;
NetCard:PNetCardStruct;
Status,Problem:DWORD;
Buffer:PChar;
BufSize:DWORD;
hDevInfo:Pointer;
DeviceInfoData:SP_DEVINFO_DATA;
DeviceId:DWORD;
begin
if Win32MajorVersion>=5 then BufSize:=0
else
begin
BufSize:=1024;
GetMem(Buffer,BufSize);
end;
hDevInfo:=SetupDiGetClassDevs(nil,nil,0,DIGCF_PRESENT or DIGCF_ALLCLASSES);
if DWORD(hDevInfo)=INVALID_HANDLE_VALUE then Exit;
DeviceInfoData.cbSize:=sizeof(SP_DEVINFO_DATA);
DeviceID:=0;
while SetupDiEnumDeviceInfo(hDevInfo,DeviceId,DeviceInfoData) do
begin
if CM_Get_DevNode_Status(@Status,@Problem,DeviceInfoData.DevInst,0)<>CR_SUCCESS then begin Inc(DeviceID); Continue; end;
if GetRegistryProperty(hDevInfo,DeviceInfoData,SPDRP_CLASS,Buffer,BufSize) then DevValue:=Buffer;
if DevValue='Net' then
begin
if GetRegistryProperty(hDevInfo,DeviceInfoData,SPDRP_ENUMERATOR_NAME,Buffer,BufSize) then DevValue:=Buffer;
if DevValue<>'ROOT' then
begin
new(NetCard);
NetCard.Id:=DeviceId;
NetCard.Name:='<Unknown Device>';
if GetRegistryProperty(hDevInfo,DeviceInfoData,SPDRP_DRIVER,Buffer,BufSize) then
if GetRegistryProperty(hDevInfo,DeviceInfoData,SPDRP_DEVICEDESC,Buffer,BufSize)
then NetCard.Name:=Buffer;
NetCard.Disabled:=((Status and DN_HAS_PROBLEM)<>0)and(CM_PROB_DISABLED=Problem);
NetCard.Changed:=false;
NetDeviceList.Add(NetCard);
end;
end;
Inc(DeviceID);
end;
end;

function NetCardStateChange(var NetCardPoint: PNetCardStruct; Enabled: Boolean): Boolean;
var hDevInfo:Pointer;
DeviceInfoData:SP_DEVINFO_DATA;
Status,Problem:DWORD;
PropChangeParams:SP_PROPCHANGE_PARAMS;
begin
Result:=False;
hDevInfo:=SetupDiGetClassDevs(nil,nil,0,DIGCF_PRESENT or DIGCF_ALLCLASSES);
if INVALID_HANDLE_VALUE=DWORD(hDevInfo) then Exit;
DeviceInfoData.cbSize:=sizeof(SP_DEVINFO_DATA);
if not SetupDiEnumDeviceInfo(hDevInfo,NetCardPoint.Id,DeviceInfoData) then Exit;
if CM_Get_DevNode_Status(@Status,@Problem,DeviceInfoData.DevInst,0)<>CR_SUCCESS then Exit;
PropChangeParams.ClassInstallHeader.cbSize:=sizeof(SP_CLASSINSTALL_HEADER);
PropChangeParams.ClassInstallHeader.InstallFunction:=DIF_PROPERTYCHANGE;
PropChangeParams.Scope:=DICS_FLAG_GLOBAL;
if Enabled then
begin
if not (((Status and DN_HAS_PROBLEM)<>0)and(CM_PROB_DISABLED=Problem)) then
begin
NetCardPoint.Disabled:=False;
Exit;
end;
PropChangeParams.StateChange:=DICS_ENABLE;
end
else
begin
if ((Status and DN_HAS_PROBLEM)<>0)and(CM_PROB_DISABLED=Problem) then
begin
NetCardPoint.Disabled:=True;
Exit;
end;
if not (((Status and DN_DISABLEABLE)<>0)and(CM_PROB_HARDWARE_DISABLED<>Problem)) then Exit;
PropChangeParams.StateChange:=DICS_DISABLE;
end;
if not SetupDiSetClassInstallParams(hDevInfo,@DeviceInfoData,PSPClassInstallHeader(@PropChangeParams),Sizeof(PropChangeParams)) then Exit;
if not SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,hDevInfo,@DeviceInfoData) then Exit;
if CM_Get_DevNode_Status(@Status,@Problem,DeviceInfoData.DevInst,0)=CR_SUCCESS then
NetCardPoint.Disabled:=((Status and DN_HAS_PROBLEM)<>0)and(CM_PROB_DISABLED=Problem);
Result:=True;
end;

initialization
LoadSetupApi;
LoadCfgMgr32;
finalization
UnLoadCfgMgr32;
UnloadSetupApi;
end.



注:对应部分98下不支持“即插即用”的网卡,上说代码可能无效。怎样判断98下的网卡是否支持“即插即用”,就是在设备管理器中先禁用网卡,然后启用网卡,如果系统不要求重启就表示支持“即插即用”。
 
1、修改注册表的,不能即时生效。
2、netsh interface ip set dns &quot;本地连接&quot; static 192.9.201.1没有设置成功。这个有例子吗?
 
to javesun:
看看以下这个吧:
问题: 續:Win2k如何改IP ( 积分: 100 )
分类: Internet/TCPIP

来自: W1979, 时间: 2001-09-14 20:59:00, ID: 626812
上帖見http://www.delphibbs.com/delphibbs/dispq.asp?lid=615858

我找到了注冊表相應位置﹐但是我改IP后必須重啟我的Win2000,這樣就沒用了!
我覺得應該通知一下windows網絡設置變了﹐象重啟網絡服務什么的﹐請問我
要怎么做呢?

来自: hongbo781202, 时间: 2001-09-14 21:54:00, ID: 626870
没有办法
我已经想32天了

来自: atorm, 时间: 2001-09-15 1:16:00, ID: 627111
做个批处理文件吧,很简单的。

来自: honestman, 时间: 2001-09-15 1:48:00, ID: 627129
好象在2000下修改IP是不用重新启动就可以生效的。
如果用改注册表的方法就应该要重启。

来自: mycoolis, 时间: 2001-09-15 4:08:00, ID: 627186
win98-设备管理器-禁用网卡-启用网卡
(仅供参考)

来自: CJF, 时间: 2001-09-15 11:25:00, ID: 627421
还是看看有什么可以更改IP地址的API吧.

来自: kindly, 时间: 2001-09-15 15:46:00, ID: 627749
简单的一条shell命令,如果不想显示窗口createprocess是sw_hide就行了
netsh interface ip set address 连接名 static IP MASK GATEWAY 1
例如
netsh interface ip set address local static 192.168.0.1 255.255.255.0 192.168.0.10 1

来自: W1979, 时间: 2001-09-15 17:43:00, ID: 627919
我這樣在命令行執行上面的話為什么出錯說 '指定的界面Local不正確'?

来自: kindly, 时间: 2001-09-15 18:26:00, ID: 627972
那个local是连接名啊,就是在网络连接中的那个&quot;本地连接&quot;
netsh interface ip set address 本地连接 static 192.168.0.1 255.255.255.0 192.168.0.10 1

来自: W1979, 时间: 2001-09-15 19:14:00, ID: 628027
我用2000,沒聽說過本地連接名?

另外我在/winnt 下找到了那個netsh.exe,我如何執行?
shellexecute(handle,'....','netsh',nil,nil,sw_hide)沒反應

来自: kindly, 时间: 2001-09-15 19:19:00, ID: 628032
我说的是2000啊,网上邻居->属性->本地连接,不知道你们的系统叫什么名字
netsh 要加上参数名啊
shellexecute(handle,'','netsh interface ip set address 本地连接 static 192.168.0.1 255.255.255.0 192.168.0.10 1',nil,nil,sw_hide)

来自: W1979, 时间: 2001-09-15 19:41:00, ID: 628043
我的Win2kAdv:
網路上的芳鄰->屬性->區域連線?

我們語言不通?
是指我的電腦名字?

来自: kindly, 时间: 2001-09-15 19:46:00, ID: 628047
那就是叫 區域連線
netsh interface ip set address 區域連線 static 192.168.0.1 255.255.255.0 192.168.0.10 1
不是语言不通啊
而是电脑上的有些术语不一样:)

来自: kindly, 时间: 2001-09-15 20:42:00, ID: 628075
解决了吗?

来自: W1979, 时间: 2001-09-17 17:38:00, ID: 630434
多人接受答案了。

问题讨论没有结束 ...
 
设置IP可以了,DNS呢,好象不行哦。。
 
后退
顶部