能力值:
( 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.
能力值:
( 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
能力值:
( 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, хотя и библиотеку, и функцию в ней я нашел.
能力值:
( 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;
}