LAN Ip ändern (auslesen funzt schon) [IP Helper API]
-
Hi!
In letzter Zeit sind ja vermehrt Anforderungen gekommen die IP auszulesen und ggf. auch zu ändern. Da ich selber auch immer zwischen 3 IPs, Gateways und DNS umschalten muß, wollte ich mir ein kleines Programm schreiben, wo ich die verschiedenen Configs einfach auswählen und per Button eintragen kann.
Viele meinten es per Registry zu tun, was aber recht umständlich ist. Beim stöbern in der Platform SDK und bei diversen Seiten stieß ich auf die IP Helper API. Ist wirklich ganz nett gemacht, aber mit dem ändern der IP habe ich einfach noch Probleme.
ipconfig zeigt die geänderten IPs und Subnetmasken als zusätzliche an. Ich würde aber gerne die Hauptaddresse ändern. Dazu dann noch die DNS und das Gateway.
Vielleicht kann mir jemand einen Schubs in die richtige Richtung geben?
Im folgenden noch etwas Code:
Hier einmal der Code zum Speichern:
void CLanCfgChangerDlg::OnButtonCfgSave() { IPAddr ipaddr_NewIpAddress, ipaddr_NewSubnetMask; ULONG NTEContext = 0; ULONG NTEInstance; DWORD dw_Error = 0; m_ctrl_IPAddress.GetWindowText(m_cstr_IpAddress); m_ctrl_Subnet.GetWindowText(m_cstr_SubnetMask); ipaddr_NewIpAddress = inet_addr(m_cstr_IpAddress); ipaddr_NewSubnetMask = inet_addr(m_cstr_SubnetMask); int i_AdapterIndex = m_ctrl_Adapter.GetCurSel(); if ((dw_Error = AddIPAddress(ipaddr_NewIpAddress, ipaddr_NewSubnetMask, m_parr_IpAdapter[i_AdapterIndex]->Index, &NTEContext, &NTEInstance)) != 0) { CString cstr_Error; cstr_Error.Format("AddIPAddress failed with error %d, %d\n", NTEContext, dw_Error); MessageBox( cstr_Error, "Fehler...", MB_ICONERROR ); return; } }Und hier der Code zum Auslesen:
BOOL CLanCfgChangerDlg::getAdaptersInfo() { m_dw_NumberOfInterfaces = 0; m_p_IpAdapterInfo = NULL; m_p_IpAdapt = NULL; m_p_IpPerAdapterInfo = NULL; m_p_IpPerAdapt = NULL; ULONG ul_AdapterInfoSize = sizeof(m_p_IpAdapterInfo); m_dw_Err = GetAdaptersInfo(m_p_IpAdapterInfo, &ul_AdapterInfoSize); if( m_dw_Err != ERROR_SUCCESS ) { if( m_dw_Err == ERROR_BUFFER_OVERFLOW ) { // Allocate memory from sizing information if ((m_hGlobalAdapterInfo = (PIP_ADAPTER_INFO) GlobalAlloc(GPTR, ul_AdapterInfoSize)) == NULL) { MessageBox("Memory allocation error\n"); return FALSE; } m_p_IpAdapterInfo = (PIP_ADAPTER_INFO) m_hGlobalAdapterInfo; // Get actual adapter information DWORD Err = 0; if ((Err = GetAdaptersInfo(m_p_IpAdapterInfo, &ul_AdapterInfoSize)) != 0) { CString cstr_Error = ""; cstr_Error.Format("GetAdaptersInfo failed with error %d\n", Err); MessageBox(cstr_Error); return FALSE; } } else { DWORD dw_Err = GetLastError(); if(dw_Err != ERROR_SUCCESS) { TRACE("Anderer Fehler als ERROR_BUFFER_OVERFLOW. Implementierung folgt."); return FALSE; } } } m_p_IpAdapt = m_p_IpAdapterInfo; while(m_p_IpAdapt && m_dw_NumberOfInterfaces <= 10) { m_ctrl_Adapter.AddString(m_p_IpAdapt->Description); m_cstrarr_AdapterDescription.Add(m_p_IpAdapt->Description); m_parr_IpAdapter[m_dw_NumberOfInterfaces] = m_p_IpAdapt; m_p_IpAdapt = m_p_IpAdapt->Next; m_dw_NumberOfInterfaces++; } return TRUE; } BOOL CLanCfgChangerDlg::getAdaptersAddresses( int i_AdapterIndex ) { m_IpAddressString = m_parr_IpAdapter[i_AdapterIndex]->IpAddressList.IpAddress; m_cstr_IpAddress = m_IpAddressString.String; m_ctrl_IPAddress.SetWindowText(m_cstr_IpAddress); m_IpAddressString = m_parr_IpAdapter[i_AdapterIndex]->IpAddressList.IpMask; m_cstr_SubnetMask = m_IpAddressString.String; m_ctrl_Subnet.SetWindowText(m_cstr_SubnetMask); m_IpAddressString = m_parr_IpAdapter[i_AdapterIndex]->GatewayList.IpAddress; m_cstr_Gateway = m_IpAddressString.String; m_ctrl_Gateway.SetWindowText(m_cstr_Gateway); //GetPerAdaptersInfo m_dw_Err = 0; m_p_IpPerAdapterInfo = NULL; ULONG ul_PerAdapterInfoSize = sizeof(m_p_IpPerAdapterInfo); m_dw_Err = GetPerAdapterInfo(m_parr_IpAdapter[i_AdapterIndex]->Index, m_p_IpPerAdapterInfo, &ul_PerAdapterInfoSize); if( m_dw_Err != ERROR_SUCCESS ) { if( m_dw_Err == ERROR_BUFFER_OVERFLOW ) { // Allocate memory from sizing information if ((m_hGlobalPerAdapterInfo = (PIP_PER_ADAPTER_INFO) GlobalAlloc(GPTR, ul_PerAdapterInfoSize)) == NULL) { MessageBox("Memory allocation error\n"); return FALSE; } m_p_IpPerAdapterInfo = (PIP_PER_ADAPTER_INFO) m_hGlobalPerAdapterInfo; // Get actual adapter information DWORD Err = 0; if ((Err = GetPerAdapterInfo(m_parr_IpAdapter[i_AdapterIndex]->Index, m_p_IpPerAdapterInfo, &ul_PerAdapterInfoSize)) != 0) { CString cstr_Error = ""; cstr_Error.Format("GetPerAdaptersInfo failed with error %d\n", Err); MessageBox(cstr_Error); return FALSE; } } else { DWORD dw_Err = GetLastError(); if(dw_Err != ERROR_SUCCESS) { TRACE("Anderer Fehler als ERROR_BUFFER_OVERFLOW. Implementierung folgt."); return FALSE; } } } m_p_IpPerAdapt = m_p_IpPerAdapterInfo; m_IpAddrString = m_p_IpPerAdapt->DnsServerList; m_IpAddressString = m_IpAddrString.IpAddress; m_cstr_DNS1 = m_IpAddressString.String; m_ctrl_DNS1.SetWindowText(m_cstr_DNS1); if( m_IpAddrString.Next != NULL ) { m_IpAddrString = *m_IpAddrString.Next; m_IpAddressString = m_IpAddrString.IpAddress; m_cstr_DNS2 = m_IpAddressString.String; m_ctrl_DNS2.SetWindowText(m_cstr_DNS2); } else { m_cstr_DNS2 = "0.0.0.0"; m_ctrl_DNS2.SetWindowText(m_cstr_DNS2); } return TRUE; }
-
Keiner eine Idee?
*schaut ratlos*
Muß doch nen anderen Weg geben, als die Registry zu bearbeiten (was bei mir auch nur mäßig bis garnicht ging).
-
*nochmal nach oben schiebt*
Also das Problem ist noch akut und ich werde einfach nicht fündig.
Ich kann bislang nur weitere IPs hinzufügen, was aber nicht gewollt ist. In der Registry herumzufummeln ist ja wohl auch nicht der Sinn.
Kennt denn keiner ne Möglichkeit die primäre IP etc zu ändern?
-
Also ich hab auch mal versucht, so ein Prog zu schreiben.
Ich hab's über die Registry gemacht, da ging auch alles (DNS,Gateway, Proxy,..) eben bis auf die IP.
Ich weiß bis heute nicht warum.
-
Aber das muß doch eigentlich irgendwas dafür geben (ob MFC oder WinApi)....
Die Berechtigung sowas zu machen ist ja wohl eher über die Benutzerverwaltung gesteuert.
Habe mich nun schon dumm und dusselig gesucht...


-
Du fügst mit AddIPAddress ja nur eine Adresse hinzu. Du musst die, die schon drin steht wohl acuh noch löschen. Maybe mit DeleteIPAddress?
-
Ich glaube das Problem ist, daß ich mit DeleteIpAddress nur welche löschen kann die ich vorher mit AddIpAddress hinzufügte, wenn ich richtig gelesen habe.
Bei AddIpAddress bekomme ich ja nen pointer auf NTEContext. Den muß ich bei DeleteIpAddress dann übergeben und schwups ist sie gelöscht. Gilt aber halt nur für welche, die ich zur Laufzeit hinzufügte.
Mit AddIpAddress hinzugefügte IPs sind ja auch nach dem Neustart des Rechners wieder futsch.... Das will ich ja auch nicht.
Unmöglich sollte es ja nicht sein..
-
Jo, stimmt ... Was ist mit diesen ARP-Funktionen? (SetIpNetEntry zb?)
Allerdings steht ARP für Address Resolution Protocol und nciht für Transmission Control Protocol (TCP).
Vielleicht probierst du noch die Funktion SetTcpEntry aus ...