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 /all
Dostę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.