setIpInterfaceEntry 函数 (netioapi.h)

SetIpInterfaceEntry 函数设置本地计算机上 IP 接口的属性。

语法

IPHLPAPI_DLL_LINKAGE _NETIOAPI_SUCCESS_ NETIOAPI_API SetIpInterfaceEntry(
  [in, out] PMIB_IPINTERFACE_ROW Row
);

参数

[in, out] Row

指向接口 MIB_IPINTERFACE_ROW 结构条目的指针。 输入时,必须将MIB_IPINTERFACE_ROWFamily 成员设置为 AF_INET6AF_INET并且必须指定MIB_IPINTERFACE_ROWInterfaceLuidInterfaceIndex 成员。 成功返回后,如果指定了MIB_IPINTERFACE_ROW项的 InterfaceIndex 成员,则会填充MIB_IPINTERFACE_ROWInterfaceLuid 成员。

返回值

如果函数成功,则返回值NO_ERROR。

如果函数失败,则返回值为以下错误代码之一。

返回代码 说明
ERROR_ACCESS_DENIED
访问被拒绝。 此错误在以下几种情况下返回:用户在本地计算机上缺少所需的管理权限,或者应用程序未在增强的 shell 中运行,因为内置的管理员 (RunAs 管理员) 。
ERROR_FILE_NOT_FOUND
系统找不到指定的文件。 如果由 Row 参数指向的MIB_IPINTERFACE_ROWInterfaceLuidInterfaceIndex 成员指定的网络接口 LUID 或接口索引不是本地计算机上的值,则返回此错误。
ERROR_INVALID_PARAMETER
向该函数传递了无效参数。 如果在 Row 参数中传递 NULL 指针,Row 参数所指向MIB_IPINTERFACE_ROWFamily 成员未指定为 AF_INETAF_INET6,或者 Row 参数指向的MIB_IPINTERFACE_ROWInterfaceLuidInterfaceIndex 成员均未指定,则返回此错误。
ERROR_NOT_FOUND
找不到指定的接口。 如果 Row 参数指向的MIB_IPINTERFACE_ROWInterfaceLuidInterfaceIndex 成员指定的网络接口与 MIB_IPINTERFACE_ROW 结构中的 Family 成员中指定的 IP 地址系列不匹配,则返回此错误。
其他
使用 FormatMessage 获取返回错误的消息字符串。

注解

SetIpInterfaceEntry 函数在 Windows Vista 及更高版本上定义。

SetIpInterfaceEntry 函数可用于修改现有 IP 接口条目。

输入时,Row 参数指向的 MIB_IPINTERFACE_ROW 结构中的 Family 成员必须初始化为AF_INETAF_INET6。 此外,在输入时,必须初始化指向 Row 参数的 MIB_IPINTERFACE_ROW 结构中的至少一个成员:InterfaceLuidInterfaceIndex

字段按上面列出的顺序使用。 因此,如果指定了 InterfaceLuid ,则使用此成员来确定接口。 如果未为 InterfaceLuid 成员设置值 (此成员的值设置为零) ,则接下来使用 InterfaceIndex 成员来确定接口。

在输出中,如果指定了 InterfaceIndex,则填充 Row 参数指向的 MIB_IPINTERFACE_ROW 结构的 InterfaceLuid 成员。

调用 SetIpInterfaceEntry 函数时,将忽略指向的 MIB_IPINTERFACE_ROW 结构的 MaxReassemblySizeMinRouterAdvertisementIntervalConnectedSupportsWakeUpPatternsSupportsNeighborDiscoverySupportsRouterDiscoveryReachableTimeTransmitOffloadReceiveOffload 成员。 这些成员由网络堆栈设置,不能使用 SetIpInterfaceEntry 函数进行更改。

应用程序通常会调用 GetIpInterfaceTable 函数来检索本地计算机上的 IP 接口条目,或调用 GetIpInterfaceEntry 函数以仅检索要修改的 IP 接口条目。 然后,可以修改特定 IP 接口条目的MIB_IPINTERFACE_ROW结构,并将指向此结构的指针传递给 Row 参数中的 SetIpInterfaceEntry 函数。 但是,对于 IPv4,应用程序不得尝试修改MIB_IPINTERFACE_ROW结构的 SitePrefixLength 成员。 对于 IPv4,SitePrefixLength 成员必须设置为 0。

修改现有 IP 接口条目的另一种可能方法是使用 InitializeIpInterfaceEntry 函数使用默认值初始化 MIB_IPINTERFACE_ROW 结构条目的字段。 然后,在 Row 参数指向的 MIB_IPINTERFACE_ROW 结构中设置 Family 成员以及 InterfaceIndexInterfaceLuid 成员,以匹配要更改的 IP 接口。 然后,应用程序可以更改要修改 的MIB_IPINTERFACE_ROW 条目中的字段,然后调用 SetIpInterfaceEntry 函数。 但是,对于 IPv4,应用程序不得尝试修改MIB_IPINTERFACE_ROW结构的 SitePrefixLength 成员。 对于 IPv4,SitePrefixLength 成员必须设置为 0。 必须对此方法使用警告,因为确定要更改的所有字段的唯一方法是,在将MIB_IPINTERFACE_ROW初始化为默认值时,将特定 IP 接口条目MIB_IPINTERFACE_ROW中的字段与 InitializeIpInterfaceEntry 函数设置的字段进行比较。

无特权同时访问具有不同安全要求的多个网络会产生安全漏洞,并允许无特权应用程序意外地在两个网络之间中继数据。 典型示例是同时访问虚拟专用网络 (VPN) 和 Internet。 Windows Server 2003 和 Windows XP 使用弱主机模型,其中 RAS 通过增加所有默认路由的路由指标(超过其他接口)来阻止此类同时访问。 因此,所有流量都通过 VPN 接口路由,从而中断其他网络连接。

在 Windows Vista 及更高版本上,默认使用强主机模型。 如果使用 GetBestRoute2GetBestRoute 在路由查找中指定了源 IP 地址,则路由查找仅限于源 IP 地址的接口。 RAS 的路由指标修改不起作用,因为潜在路由列表甚至没有 VPN 接口的路由,从而允许流量发往 Internet。 MIB_IPINTERFACE_ROWDisableDefaultRoutes 成员可用于在接口上使用默认路由禁用。 VPN 客户端可以将此成员用作安全措施,以在 VPN 客户端不需要拆分隧道时限制拆分隧道。 VPN 客户端可以调用 SetIpInterfaceEntry 函数,以便在需要时将 DisableDefaultRoutes 成员设置为 TRUE 。 VPN 客户端可以通过调用 GetIpInterfaceEntry 函数查询 DisableDefaultRoutes 成员的当前状态。

The

SetIpInterfaceEntry 函数只能由以 Administrators 组成员身份登录的用户调用。 如果 SetIpInterfaceEntry 由不是 Administrators 组成员的用户调用,则函数调用将失败并返回 ERROR_ACCESS_DENIED 。 此函数也可能因为 Windows Vista 及更高版本上的用户帐户控制 (UAC) 而失败。 如果包含此函数的应用程序由以管理员组成员身份登录(而不是内置管理员)的用户执行,则此调用将失败,除非应用程序已在清单文件中标记为 requestedExecutionLevel 设置为 requireAdministrator。 如果应用程序缺少此清单文件,则作为管理员组成员(而不是内置管理员)登录的用户必须在增强的 shell 中执行应用程序,因为内置管理员 (RunAs 管理员) 此函数才能成功。

要求

要求
最低受支持的客户端 Windows Vista [仅限桌面应用]
最低受支持的服务器 Windows Server 2008 [仅限桌面应用]
目标平台 Windows
标头 netioapi.h (包括 Iphlpapi.h)
Library Iphlpapi.lib
DLL Iphlpapi.dll

另请参阅

GetBestRoute

GetBestRoute2

GetIfEntry2

GetIfTable2

GetIfTable2Ex

GetIpInterfaceEntry

GetIpInterfaceTable

IP 帮助程序函数参考

InitializeIpInterfaceEntry

MIB_IF_ROW2

MIB_IF_TABLE2

MIB_IPINTERFACE_ROW

MIB_IPINTERFACE_TABLE

NotifyIpInterfaceChange