本帖最后由 小白龙 于 2026-5-7 15:11 编辑
我使用下面的代码, 获取当前正在使用的网卡的ip等参数设置为静态IP, 同时设置dns为223.5.5.5, 但是怎么搞都搞不定, 下面的还是用gpt搞的结果只有一个错误, 用deepseek, 上百轮下来都没解决, 求大佬支招. 或者分享更简洁有效的方法.
注意: 我需要兼容win7, 10, 11, 所以用com的方法, 其它的方法只能在win10
- $s = (New-Object -ComObject WbemScripting.SWbemLocator).
- ConnectServer('.', 'root\cimv2')
- foreach ($ad in $s.ExecQuery("SELECT * FROM Win32_NetworkAdapter")) {
- $status = $ad.Properties_.Item("NetConnectionStatus").Value
- $name = $ad.Properties_.Item("Name").Value
- if ($status -eq 2 -and $name -notlike '*VMware*') {
- $devID = $ad.Properties_.Item("DeviceID").Value
- $cfg = $s.ExecQuery(
- "SELECT * FROM Win32_NetworkAdapterConfiguration WHERE Index=$devID AND IPEnabled=TRUE"
- ) | Select -First 1
- if ($cfg) {
- $ips = [string[]]$cfg.Properties_.Item('IPAddress').Value
- $masks = [string[]]$cfg.Properties_.Item('IPSubnet').Value
- $gws = [string[]]$cfg.Properties_.Item('DefaultIPGateway').Value
- $idx = 0
- $found = $false
- foreach ($ip in $ips) {
- if (
- $ip -match '^\d+\.\d+\.\d+\.\d+$' `
- -and $ip -ne '127.0.0.1' `
- -and $ip -notlike '169.254.*'
- ) {
- $found = $true
- break
- }
- $idx++
- }
- if ($found) {
- $ipv4 = $ips[$idx]
- $mask = $masks[$idx]
- $gw = $gws[$idx]
- # EnableStatic
- $retIP = $cfg.GetType().InvokeMember(
- "EnableStatic",
- [System.Reflection.BindingFlags]::InvokeMethod,
- $null,
- $cfg,
- @(
- [string[]]@($ipv4),
- [string[]]@($mask)
- )
- )
- # Gateway
- if ($gw) {
- $retGW = $cfg.GetType().InvokeMember(
- "SetGateways",
- [System.Reflection.BindingFlags]::InvokeMethod,
- $null,
- $cfg,
- @(
- [string[]]@($gw),
- [int[]]@(1)
- )
- )
- }
- # DNS
- $retDNS = $cfg.GetType().InvokeMember(
- "SetDNSServerSearchOrder",
- [System.Reflection.BindingFlags]::InvokeMethod,
- $null,
- $cfg,
- @(
- [string[]]@("223.5.5.5")
- )
- )
- "设置完成 - IP:$ipv4 掩码:$mask 网关:$gw"
- if ($retIP) {
- "IP返回码: $($retIP.ReturnValue)"
- }
- if ($retGW) {
- "GW返回码: $($retGW.ReturnValue)"
- }
- if ($retDNS) {
- "DNS返回码: $($retDNS.ReturnValue)"
- }
- }
- }
- break
- }
- }
复制代码 |