delphi programowanie, jak wykryć czy IP jest dynamiczne czy statyczne
DHCPEnabled = True → adres dynamiczny (DHCP)DHCPEnabled = False → adres statyczny (manualny) GetAdaptersInfo / GetAdaptersAddresses), lub Win32_NetworkAdapterConfiguration.DHCPEnabled). Najmniejszy narzut, brak zależności od usług systemowych.
uses
Windows, SysUtils, IpHlpApi;
function IsAdapterDhcpEnabled(const AdapterDescMask: string = ''): Boolean;
var
BufLen: ULONG;
PInfo, PIt: PIP_ADAPTER_INFO;
begin
Result := False;
BufLen := 0;
// Najpierw pobieramy wymagany rozmiar bufora
if GetAdaptersInfo(nil, BufLen) <> ERROR_BUFFER_OVERFLOW then Exit;
GetMem(PInfo, BufLen);
try
if GetAdaptersInfo(PInfo, BufLen) = NO_ERROR then
begin
PIt := PInfo;
while PIt <> nil do
begin
// opcjonalnie filtrujemy po opisie karty
if (AdapterDescMask = '') or
(Pos(LowerCase(AdapterDescMask), LowerCase(AnsiString(PIt^.Description))) > 0) then
begin
Result := PIt^.DhcpEnabled <> 0; // True → dynamiczny
Exit;
end;
PIt := PIt^.Next;
end;
end;
finally
FreeMem(PInfo);
end;
end;
‐ Zmienna DhcpEnabled jest wspólna dla wszystkich adresów przypisanych do danego interfejsu (IPv4).
‐ Dla Windows Vista+ można użyć nowszego GetAdaptersAddresses, które obsługuje też IPv6.
uses
ActiveX, ComObj, Variants;
function IsAnyDhcpEnabledViaWmi: Boolean;
var
Locator, Services, ObjSet, Item: OleVariant;
Enum: IEnumVariant; Fetched: Cardinal;
begin
Result := False;
CoInitialize(nil);
try
Locator := CreateOleObject('WbemScripting.SWbemLocator');
Services := Locator.ConnectServer('.', 'root\CIMV2');
ObjSet := Services.ExecQuery(
'SELECT DHCPEnabled FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled=TRUE');
Enum := IUnknown(ObjSet._NewEnum) as IEnumVariant;
while Enum.Next(1, Item, Fetched) = S_OK do
begin
if Item.DHCPEnabled then
Exit(True); // znaleziono interfejs z DHCP
end;
finally
CoUninitialize;
end;
end;
‐ Zwraca wynik również dla IPv6 (właściwość DHCPv6Enabled).
‐ WMI bywa wyłączone na systemach „odchudzonych”, a zapytania są wolniejsze niż IP Helper.
ipconfig /allDostęp awaryjny, ale wymaga parsowania tekstu lub struktury kluczy:
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\<GUID>\EnableDHCP
ConvertInterfaceLuidToAlias + GetAdapterAddresses (obsługa IPv6, mobilne interfejsy, tunelowanie). DHCPEnabled, ale adresy mogą być stale przekazywane z hosta — warto filtrować po typie NIC. Ipv6EnableDhcp albo DHCPv6Enabled.DHCPEnabled = True. LeaseObtained, LeaseExpires) – przydatne do diagnostyki.netsh interface ip set) wymaga uprawnień administratora. CoInitialize, CoUninitialize) przy kodzie WMI. "iphlpapi.lib" lub użyj delayload dla iphlpapi.dll. Type (Ethernet = 6, Wi-Fi = 71) lub po nazwie/ GUID. ipconfig /renew lub wyłącz/ włącz adapter poprzez netsh.GetAdaptersInfo nie pokazuje IPv6. ip addr, systemd-networkd, pliki /etc/netplan itp.).Get-NetIPConfiguration) wywoływanego z Delphi. Sprawdzenie, czy IP jest „dynamiczne”, sprowadza się do odczytu flagi DHCP na interfejsie.
W Delphi najpewniej zrobisz to wywołując GetAdaptersInfo / GetAdaptersAddresses (WinAPI) lub zapytaniem WMI. Wynik DHCPEnabled = True oznacza adres przydzielony dynamicznie, False – statycznie. Nie istnieje metoda umożliwiająca rozpoznanie tego faktu wyłącznie po samym numerze IP.