首页
社区
课程
招聘
[求助]XP下, 如何修改本机 IP?
发表于: 2010-5-5 05:07 10554

[求助]XP下, 如何修改本机 IP?

2010-5-5 05:07
10554
网上有很多例子介绍修改本机的 IP 地址:

一、修改注册表(要重启生效)

二、调用“DhcpNotifyConfigChange“, 但XP已不支持这个 API 了。

三、AddIPAddress 和 DelIPAddress (重启后没了)

  请问一下分析过或做过相关功能的朋友, WINDOWS XP 更改 IP 时,到底用什么方法来改 IP 的?

(注:不重起 Windows)

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 189
活跃值: (4810)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
已知是用 WMI 做了, 但难度相对我来说太高了(Delphi):

To create an IPv4 address that persists, the EnableStatic method of the Win32_NetworkAdapterConfiguration Class in the Windows Management Instrumentation (WMI) controls may be used. The netsh commands can also be used to create a persistent IPv4 address. For more information, please see the documentation on Netsh.exe in the Windows Sockets documentation.
2010-5-5 05:26
0
雪    币: 232
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
没必要那么复杂的,调用命令行也可以啊,比如:
netsh interface ip set address "本地连接" static 192.168.0.123 255.255.255.0 192.168.0.254 1

要改的IP  192.168.0.123
网关 192.168.0.254
2010-5-5 11:22
0
雪    币: 500
活跃值: (11)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
注册表修改完后

调用 SetAdapterIPAddress
2010-5-5 14:57
0
雪    币: 189
活跃值: (4810)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
谢谢你, 但这个方法不能知道调用成功与失败..
2010-5-5 23:56
0
雪    币: 189
活跃值: (4810)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
谢谢你, 但也查不到相关的 API 声明......
2010-5-6 00:49
0
雪    币: 500
活跃值: (11)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
7
未公开的API

但是google一定能找到啊。

google第一个链接Undocumented WinAPI进去

http://nibuthomas.wordpress.com/category/undocumented-winapi/

Changing IP Address of a machine!
October 13, 2007 Nibu Thomas Leave a comment
To change ip address of a machine use SetAdapterIpAddress. It’s an undocumented API found in iphlpapi.dll.

Function signature is as follows…

DWORD SetAdapterIpAddress( char *pszAdapGUID,  
                           DWORD dwDHCP,  
                           DWORD dwIP,  
                           DWORD dwMask,  
                           DWORD dwGateway );

Look here for a demo, it’s in Russian but code is in english

Russian的demo


Я спрашивал о сабже в сетевых технологиях и мне дали ответ...

код C++
typedef DWORD (WINAPI *_SetAdapterIpAddress )( char *szAdapterGUID,
DWORD dwDHCP,
DWORD dwIP,
DWORD dwMask,
DWORD dwGateway );

HINSTANCE lib = (HINSTANCE) LoadLibrary( T("iphlpapi.dll") );

_SetAdapterIpAddress SetAdapterIpAddress = (_SetAdapterIpAddress) GetProcAddress( lib,"SetAdapterIpAddress" );

CRegistry Reg;
PWSTR pszGUID = NULL;
char szGUID[64] = {0};
DWORD dwSize = 0;

// Достаем GUID карты (отсюда мне удобней было брать)
Reg.Read( T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards\\1"),
T("ServiceName"),
(PVOID&) pszGUID,
&dwSize );

WideCharToMultiByte( CP_ACP, 0, pszGUID, -1, szGUID, sizeof( szGUID ), NULL, NULL );

SetAdapterIpAddress( szGUID,
0,
inet_addr("192.168.1.2"),
inet_addr("255.255.255.0"),
inet_addr("192.168.1.100") );


Сложность состоит в том, что я не знаю как это перевести на Delphi. И даже MSDN ничего не знает о функции SetAdapterIpAddress, хотя и библиотеку, и функцию в ней я нашел.
2010-5-6 12:38
0
雪    币: 189
活跃值: (4810)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
很多谢你的热心帮助,谢谢!!!!

已解决。。。
2010-5-7 03:30
0
雪    币: 284
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
这个好,我要试试
DhcpNotifyConfigChange也是可以用的其实
2010-5-11 15:52
0
雪    币: 284
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
不错,试了下,比DhcpNotifyConfigChange简单多了
2010-5-11 16:45
0
雪    币: 56
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
和楼上要回答的一样,呵呵
2010-5-13 00:10
0
雪    币: 189
活跃值: (4810)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
WMI 更好....
2010-5-20 02:20
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
ip如果是dhcp分配的,该函数修改ip是能修改,但是修改的ip不起作用
2010-5-20 16:56
0
雪    币: 4580
活跃值: (992)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
/*************************************************
  Function:       NotifyChange
  Description:    通知系统网卡信息改变
  Input:          网卡GUID字符串指针
  LuaInput:       无
  Output:         无
  Return:         返回成功状态布尔值
  LuaReturn:      无
  Others:         非Lua直接调用函数,依赖于Setupapi.dll系统动态链接库
*************************************************/

BOOL NotifyChange(char * lpInsID)
{       
        struct DEVPARAM{DWORD a1;DWORD a2;DWORD a3;DWORD a4;DWORD a5;};
        BOOL bResult = FALSE;
        HDEVINFO hDevInfo;
        hDevInfo = SetupDiGetClassDevs(&GUID_DEVCLASS_NET, 0, 0, DIGCF_PRESENT | DIGCF_PROFILE);
        if (INVALID_HANDLE_VALUE != hDevInfo)
        {
                DWORD dLoop = 0;
                SP_DEVINFO_DATA DeviceInfoData;
                DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
                while ( SetupDiEnumDeviceInfo(hDevInfo, dLoop, &DeviceInfoData) )
                {
                        HKEY hKey = SetupDiOpenDevRegKey(hDevInfo, &DeviceInfoData, 1u, 0, 2u, 0x20019u);  
                        if ( INVALID_HANDLE_VALUE != hKey)
                        {
                                char szInsID[MAX_PATH];
                                DWORD dLen = MAX_PATH;
                                if ( !RegQueryValueEx(hKey,"NetCfgInstanceId",NULL,NULL,(BYTE*)szInsID,&dLen) )
                                {
                                        RegCloseKey(hKey);
                                        if (!lstrcmpi(szInsID,lpInsID))
                                        {
                                                DEVPARAM DevParams;
                                                DevParams.a1 = 8;
                                                DevParams.a2 = 18;
                                                DevParams.a3 = 3;
                                                DevParams.a4 = 2;
                                                DevParams.a5 = 0;
                                                if ( SetupDiSetClassInstallParams(hDevInfo, &DeviceInfoData,(PSP_CLASSINSTALL_HEADER) &DevParams, sizeof(DevParams)) )
                                                {
                                                        bResult = SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDevInfo, &DeviceInfoData);
                                                }
                                                break;
                                        }
                                }
                                RegCloseKey(hKey);
                        }
                        ++dLoop;
                }
                SetupDiDestroyDeviceInfoList(hDevInfo);
        }
        return bResult;
}
/*************************************************
  Function:       Lua_SetNetInfo
  Description:    设置所有网卡信息
  Input:          Lua虚拟机指针
  LuaInput:       网卡信息表数组
  Output:         无
  Return:         返回Lua返回值个数
  LuaReturn:      无
  Others:         网卡信息表{IP=“”,SubnetMask=“”,Gateway=“”,DNS=“”}
*************************************************/

int Lua_SetNetInfo(lua_State* luaVM)
{
        EXCEPTION_RECORD ExceptionRecord;
        __try
        {
                luaL_checktype( luaVM, 1, LUA_TTABLE);
                IP_ADAPTER_INFO NetCarInfo[10] = {0};
                ULONG uSize = sizeof(NetCarInfo);
                GetAdaptersInfo(NetCarInfo,&uSize);
                DWORD dCount = 0;
                while (*NetCarInfo[dCount].AdapterName && 10>=dCount)
                {
                        ++dCount;
                }

                for (DWORD i = 0; i <= dCount; i++)
                {
                        const char *lpIP = NULL;
                        const char *lpMask = NULL;
                        const char *lpGateway = NULL;
                        const char *lpDNS = NULL;

                        lua_rawgeti(luaVM,1,i+1);
                        GetTabVal(luaVM,2,"IP");
                        lpIP = lua_tostring(luaVM,-1);
                        lua_pop(luaVM,1);

                        GetTabVal(luaVM,2,"SubnetMask");
                        lpMask = lua_tostring(luaVM,-1);
                        lua_pop(luaVM,1);

                        GetTabVal(luaVM,2,"Gateway");
                        lpGateway = lua_tostring(luaVM,-1);
                        lua_pop(luaVM,1);

                        GetTabVal(luaVM,2,"DNS");
                        lpDNS = lua_tostring(luaVM,-1);
                        lua_pop(luaVM,2);
                        HKEY hInst;
                        char szInstKey[MAX_PATH] = "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\";
                        lstrcat(szInstKey,NetCarInfo[i].AdapterName);
                        if (ERROR_SUCCESS == RegOpenKey(HKEY_LOCAL_MACHINE,szInstKey,&hInst))
                        {
                                RegSetValueEx(hInst,"IPAddress",NULL,REG_MULTI_SZ,(LPBYTE)lpIP,strlen(lpIP));
                                RegSetValueEx(hInst,"SubnetMask",NULL,REG_MULTI_SZ,(LPBYTE)lpMask,strlen(lpMask));
                                RegSetValueEx(hInst,"DefaultGateway",NULL,REG_MULTI_SZ,(LPBYTE)lpGateway,strlen(lpGateway));
                                RegSetValueEx(hInst,"NameServer",NULL,REG_SZ,(LPBYTE)lpDNS,strlen(lpDNS));
                                DWORD dValue = 0;
                                RegSetValueEx(hInst,"EnableDHCP",NULL,REG_DWORD,(LPBYTE)&dValue,sizeof(dValue));
                                RegCloseKey(hInst);
                                NotifyChange(NetCarInfo[i].AdapterName);
                        }
                }
        }
        __except(ExceptionRecord = *(GetExceptionInformation())->ExceptionRecord ,EXCEPTION_EXECUTE_HANDLER)
        {
                CrackErr(luaVM,&ExceptionRecord);
        }
        return 0;
}
2010-5-22 13:11
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
这个API针对本机设置多个ip地址的情况下无效,不知道有没有什么有效的方法可以针对本机多个ip地址的修改
2010-5-24 11:41
0
雪    币: 76
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
支持下。我现在用windows7了。
2010-5-24 12:22
0
游客
登录 | 注册 方可回帖
返回
//