2015-06-19 101 views
-2

说我有两个网卡或适配器卡我的系统上,也是我发现自己的IP地址,通过下面的代码:如何连接到知道其IP地址的NIC卡或网络适配器?

procedure TForm4.RetrieveLocalAdapterInformation(strings: Tmemo); 
var 
    pAdapterInfo, pTempAdapterInfo: PIP_ADAPTER_INFO; 
    AdapterInfo: IP_ADAPTER_INFO; 
    BufLen: DWORD; 
    Status: DWORD; 
    strMAC: String; 
    i: Integer; 
begin 
    strings.Clear; 

    BufLen:= sizeof(AdapterInfo); 
    pAdapterInfo:= @AdapterInfo; 

    Status:= GetAdaptersInfo(nil, BufLen); 
    pAdapterInfo:= AllocMem(BufLen); 
    try 
Status:= GetAdaptersInfo(pAdapterInfo, BufLen); 

if (Status <> ERROR_SUCCESS) then 
    begin 
    case Status of 
     ERROR_NOT_SUPPORTED: 
     strings.lines.Add('GetAdaptersInfo is not supported by the operating ' + 
        'system running on the local computer.'); 
     ERROR_NO_DATA: 
     strings.lines.Add('No network adapter on the local computer.'); 
    else 
     strings.Lines.Add('GetAdaptersInfo failed with error #' + IntToStr(Status)); 
    end; 
    Dispose(pAdapterInfo); 
    Exit; 
    end; 

while (pAdapterInfo <> nil) do 
    begin 
    strings.Lines.Add('Description: ' + pAdapterInfo^.Description); 
    strings.lines.Add('Name: ' + pAdapterInfo^.AdapterName); 

    strMAC := ''; 
    for I := 0 to pAdapterInfo^.AddressLength - 1 do 
     strMAC := strMAC + '-' + IntToHex(pAdapterInfo^.Address[I], 2); 

    Delete(strMAC, 1, 1); 
    strings.lines.Add('MAC address: ' + strMAC); 
    strings.lines.Add('IP address: ' + pAdapterInfo^.IpAddressList.IpAddress.S); 
    strings.lines.Add('IP subnet mask: ' + pAdapterInfo^.IpAddressList.IpMask.S); 
    strings.lines.Add('Gateway: ' + pAdapterInfo^.GatewayList.IpAddress.S); 
    strings.lines.Add('DHCP enabled: ' + IntTOStr(pAdapterInfo^.DhcpEnabled)); 
    strings.lines.Add('DHCP: ' + pAdapterInfo^.DhcpServer.IpAddress.S); 
    strings.lines.Add('Have WINS: ' + BoolToStr(pAdapterInfo^.HaveWins,True)); 
    strings.lines.Add('Primary WINS: ' + pAdapterInfo^.PrimaryWinsServer.IpAddress.S); 
    strings.lines.Add('Secondary WINS: ' + pAdapterInfo^.SecondaryWinsServer.IpAddress.S); 

    pTempAdapterInfo := pAdapterInfo; 
    pAdapterInfo:= pAdapterInfo^.Next; 
    if assigned(pAdapterInfo) then Dispose(pTempAdapterInfo); 
end; 
finally 
Dispose(pAdapterInfo); 
end; 
end; 

如何或直接我所有的网络流量通过特定的网卡或网络适配器连接到卡?

我能够在Windows 7上通过以下代码完成此操作,但此代码不会在Windows 10上运行。它在程序作为用户运行时不断提高Access Denied消息,但不会在运行时为管理员。然而作为管理员我的程序将无法正常运行,但只能作为Windows 10后台进程....

procedure TDXCommdlg.GetConnectionList(Strings,IdList: TStrings); 
var 
    pEnum: IEnumVariant; 
    vNetCon: OleVARIANT; 
    dwRetrieved: Cardinal; 
    pUser: NETCONLib_TLB.PUserType1; 
    NetCon : INetConnection; 
begin 
    Strings.Clear; 
    IdList.Clear; 
    pEnum := (NetSharingManager1.EnumEveryConnection._NewEnum as IEnumVariant); 
    while (pEnum.Next(1, vNetCon, dwRetrieved) = S_OK) do 
    begin 
     (IUnknown(vNetCon) as INetConnection).GetProperties(pUser); 
     NetCon := (IUnknown(vNetCon) as INetConnection); 

if (pUser.Status in [NCS_CONNECTED,NCS_CONNECTING])//remove if you want disabled NIC cards also 
and (pUser.MediaType in [NCM_LAN,NCM_SHAREDACCESSHOST_LAN,NCM_ISDN]) 
and (GetMacAddress(GuidToString(pUser.guidId))<>'') then 
begin 
    //we only want valid network cards that are enabled 
    Strings.Add(pUser.pszwName); 
    IdList.Add(GuidToString(pUser.guidId)); 
end; 
end; 
end; 

function TDXCommdlg.GetMacAddress(CardID: string): String; 
var 
    Reg: TRegistry; 
    KeyValues: TSTringList; 
    i: integer; 
    CardInstanceID,CardAddress: string; 
begin 
    Result := ''; 
    Reg := TRegistry.Create; 
    KeyValues := TStringList.Create; 
    try 
     Reg.RootKey:=HKEY_LOCAL_MACHINE; 
     if Reg.OpenKey(MacLocation,false) then 
     begin 
     Reg.GetKeyNames(KeyValues); 
     Reg.CloseKey; 

     for i := 0 to KeyValues.Count-1 do 
     if reg.OpenKey(MacLocation+'\'+KeyValues[i],false) then 
     begin 
      CardInstanceID := Reg.ReadString('NetCfgInstanceId'); 
      CardAddress := Reg.ReadString('NetworkAddress'); 
      Reg.CloseKey; 

      if CardInstanceID = CardId then 
      begin 
       if CardAddress='' then CardAddress := 'Hardware'; 
        Result := CardAddress; 
       break; 
      end; 
     end; 
    end; 
    finally 
    Reg.Free; 
    KeyValues.Free; 
    end; 
end; 

procedure TDXCommdlg.ResetNIC(const aConnection: string); 
var 
    pEnum: IEnumVariant; 
    vNetCon: OleVARIANT; 
    dwRetrieved: Cardinal; 
    pUser: NETCONLib_TLB.PUserType1; 
begin 
    enabled := false; 
    try 
    pEnum := (NetSharingManager1.EnumEveryConnection._NewEnum as IEnumVariant); 
    while (pEnum.Next(1, vNetCon, dwRetrieved) = S_OK) do 
    begin 
     (IUnknown(vNetCon) as INetConnection).GetProperties(pUser); 
     if pUser.pszwName = aConnection then 
     begin 
      (IUnknown(vNetCon) as INetConnection).Disconnect; 
      (IUnknown(vNetCon) as INetConnection).Connect; 
      sleep(2000); 
      break; 
     end; 
    end; 
    finally 
    enabled := true; 
end; 
end; 

UPDATE 拒绝访问是通过从上面下面的行提出,然后该程序退出。它不会再进一步​​。

pEnum := (NetSharingManager1.EnumEveryConnection._NewEnum as IEnumVariant); 
+0

什么部分的代码是提高访问被拒绝? – Graymatter

+0

'pEnum:=(NetSharingManager1.EnumEveryConnection._NewEnum as IEnumVariant);' – ThN

+0

如果您的应用程序以管理员身份执行,但是以管理员身份运行您的程序会导致它在后台运行,则可以这样做。对?所以我的问题是你如何以管理员身份启动你的程序?这是通过在Windows资源管理器中右键单击内容菜单完成的吗如果您是在尝试使用清单文件请求权限提升?当您在Explorer中选择“以管理员身份运行”时,Windows 10可能会改变应用程序的启动方式。 – SilverWarior

回答

0

听起来好像您使用的库需要提升权限。关于UAC,Windows 10没有什么重大变化。如果你的程序正在运行,它会成功。不升高时失败。所以你的问题似乎是你没有执行提升。

由于您的程序需要提升,请确保您明确表示。将requireAdministrator选项添加到您的应用程序清单。

您请求写入访问HKLM,这将不会授予标准用户。致电OpenKeyReadOnly而不是OpenKey。当你只在阅读时没有要求写入权限。

+0

我在最后添加了更新。 – ThN

+0

在Windows 10上,实际的错误消息是“拒绝访问”,并点击“确定”按钮。 TNetSharingManager使您的程序可以访问系统的网络层。换句话说,您编程请求以列出系统中所有可用的网络连接及其属性,启用或禁用它们等。MCVE? – ThN

+0

好的...这对我来说是新的。我猜我的程序使用了默认的或者之前建立的清单。所以,我现在不需要做任何事情。当我将自定义清单链接到我的项目文件编译我的程序时,它会将其应用到我的程序的exe文件中。如果我在另一台机器上运行我的程序,是否需要将这些软件与这些rc,res或manifest xml文件一起发货? – ThN

相关问题