在Delphi中识别计算机的子网掩码



我正在寻找一种能够检索当前计算机的IP子网掩码的方法在Delphi中,在运行时继续运行。

代码中有没有一种方法可以让我检索子网掩码并存储它,以便在其他操作中使用它?

感谢

您可以使用Win32_NetworkAdapterConfiguration WMI类和IPSubnet属性。

试试这个示例代码

{$APPTYPE CONSOLE}

uses
  SysUtils,
  ActiveX,
  ComObj,
  Variants;
function VarArrayToStr(const vArray: variant): string;
    function _VarToStr(const V: variant): string;
    var
    Vt: integer;
    begin
    Vt := VarType(V);
        case Vt of
          varSmallint,
          varInteger  : Result := IntToStr(integer(V));
          varSingle,
          varDouble,
          varCurrency : Result := FloatToStr(Double(V));
          varDate     : Result := VarToStr(V);
          varOleStr   : Result := WideString(V);
          varBoolean  : Result := VarToStr(V);
          varVariant  : Result := VarToStr(Variant(V));
          varByte     : Result := char(byte(V));
          varString   : Result := String(V);
          varArray    : Result := VarArrayToStr(Variant(V));
        end;
    end;
var
i : integer;
begin
    Result := '[';
     if (VarType(vArray) and VarArray)=0 then
       Result := _VarToStr(vArray)
    else
    for i := VarArrayLowBound(vArray, 1) to VarArrayHighBound(vArray, 1) do
     if i=VarArrayLowBound(vArray, 1)  then
      Result := Result+_VarToStr(vArray[i])
     else
      Result := Result+'|'+_VarToStr(vArray[i]);
    Result:=Result+']';
end;
procedure  GetWin32_NetworkAdapterConfigurationInfo;
const
  WbemUser            ='';
  WbemPassword        ='';
  WbemComputer        ='localhost';
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService   : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject   : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;
begin;
  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService   := FSWbemLocator.ConnectServer(WbemComputer, 'rootCIMV2', WbemUser, WbemPassword);
  FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_NetworkAdapterConfiguration Where IpEnabled=True','WQL',wbemFlagForwardOnly);
  oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
  while oEnum.Next(1, FWbemObject, iValue) = 0 do
  begin
    Writeln(Format('Caption       %s',[String(FWbemObject.Caption)]));// String
    if not VarIsNull(FWbemObject.DHCPServer) then
      Writeln(Format('DHCPServer    %s',[String(FWbemObject.DHCPServer)]));// String
    if not VarIsNull(FWbemObject.IPAddress) then
      Writeln(Format('IPAddress     %s',[VarArrayToStr(FWbemObject.IPAddress)]));// array String
    if not VarIsNull(FWbemObject.IPSubnet) then
      Writeln(Format('IPSubnet      %s',[VarArrayToStr(FWbemObject.IPSubnet)]));// array String
    if not VarIsNull(FWbemObject.MACAddress) then
      Writeln(Format('MACAddress     %s',[VarArrayToStr(FWbemObject.MACAddress)]));// array String
    Writeln;
    FWbemObject:=Unassigned;
  end;
end;

begin
 try
    CoInitialize(nil);
    try
      GetWin32_NetworkAdapterConfigurationInfo;
    finally
      CoUninitialize;
    end;
 except
    on E:EOleException do
        Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode]));
    on E:Exception do
        Writeln(E.Classname, ':', E.Message);
 end;
 Writeln('Press Enter to exit');
 Readln;
end. 

1)计算机可能是不同网/子网的一部分。每个网络适配器通常都有一些。有时甚至不止一个。

2) 即使您实际上只有一个网卡,您也有环回网络-127.x.x.x子网。如果你安装了一些VPN,比如Hamachi或Comodo,那就多了一个网络适配器。连接时,电话调制解调器也是如此。类似XP兼容模式的虚拟机也是如此。所以你无论如何都必须根据一些标准对它们进行筛选。

3) 您可以使用WMI的FindAdaptor功能登记网卡:http://www.magsys.co.uk/delphi/magwmi.asp然后可以读取这些适配器的特性。还有提到的设置IP的函数,可能还有读取它们的函数。

即使没有,如何读取属性也会在演示中的URL中显示。要读取哪些属性,您可以使用任何WMI资源管理器来确定。就我个人而言,我以ks-soft.net的WMI资源管理器和微软的WMI工具结束。您可以像使用SQLite一样调试WMI请求,然后将其传递给WMI包装器并读取结果。然而,回到前面提到的Set IP Address函数,它们的源可能已经包含了属性名称,只是为了节省探索时间。

最新更新