精易论坛

标题: wmi对网络适配器设置 [打印本页]

作者: jingyi11023995    时间: 2024-3-27 15:27
标题: wmi对网络适配器设置
本帖最后由 jingyi11023995 于 2024-3-27 15:34 编辑

目前能找到的设置IP地址的方法是CMD或者VBS的方式,wmi的没有,经过多天努力和尝试,终于得到正确代码,希望能帮到大家。

.版本 2

.程序集变量 DescriptionArr, 文本型, , "0"
.程序集变量 PhysicalAdapterArr, 文本型, , "0"

’使用示例:
wmi_枚举网卡描述和是否物理网卡 (DescriptionArr, PhysicalAdapterArr)‘先执行这个,获取到相关信息数组



根据网卡描述找到Index (“TP-LINK Wireless USB Adapter”)'测试

wmi_修改IP地址和网关和子网掩码
和DNS (“TP-LINK Wireless USB Adapter”, { “192.168.0.138” }, { “255.255.255.0” }, { “192.168.0.1” }, { “202.96.128.86”, “202.96.128.166” })测试

wmi_IP设置为自动获取 (“TP-LINK Wireless USB Adapter”)
测试

wmi_DNS设置为自动获取 (“TP-LINK Wireless USB Adapter”)
测试

文本_是否IP格式()'精易没有这个,建议也加入


  
子程序名返回值类型公开备 注
wmi_枚举网卡描述和是否物理网卡整数型 Description,id从0开始
参数名类 型参考可空数组备 注
网卡描述数组文本型用于存放网卡描述的数组
是否物理网卡数组文本型-1是物理网卡,0是虚拟网卡
变量名类 型静态数组备 注
objWbemLocator对象 
objWMIService对象 
colClasses对象 
Properties对象 
NewEnum对象 
objClass对象 
hreslut整数型 
Variant变体型 
pcFetched整数型 
value文本型 
重定义数组 (网卡描述数组, 假, 0)
重定义数组 (是否物理网卡数组, 假, 0)
如果真 (objWbemLocator.创建 (“WbemScripting.SWbemLocator”, ))  ' 创建WMI对象
objWMIService = objWbemLocator.对象型方法 (“ConnectServer”, “.”, “root\CIMV2”, , , , , , )  ' 连接服务器
如果真 (objWMIService.是否为空 ())
colClasses = objWMIService.对象型方法 (“ExecQuery”, “SELECT * FROM Win32_NetworkAdapter”)
如果真 (colClasses.是否为空 ())
NewEnum = colClasses.对象型方法 (“_NewEnum”, )
如果真 (NewEnum.是否为空 ())
循环判断首 ()
hreslut = IEnumVARIANT_Next (取对象指针 (NewEnum), 1, 取变体型指针 (Variant), pcFetched)
如果真 (hreslut = 0)
objClass = Variant.取对象 ()
Properties = objClass.读对象型属性 (“Properties_”, )
value = Properties.对象型方法 (“Item”, “Description”).读文本属性 (“value”, )
' 调试输出 (value)
加入成员 (网卡描述数组, value)
value = Properties.对象型方法 (“Item”, “PhysicalAdapter”).读文本属性 (“value”, )
' 调试输出 (value)
加入成员 (是否物理网卡数组, value)
objClass.清除 ()
Variant.清除 ()
处理事件 ()
循环判断尾 (pcFetched = 1)
NewEnum.清除 ()
colClasses.清除 ()
objWMIService.清除 ()
objWbemLocator.清除 ()

调试输出 (网卡描述数组, 是否物理网卡数组)
返回 (取数组成员数 (网卡描述数组))


i支持库列表   支持库注释   
spec特殊功能支持库

  
子程序名返回值类型公开备 注
根据网卡描述找到Index整数型 
参数名类 型参考可空数组备 注
Description文本型
变量名类 型静态数组备 注
i整数型 
index整数型 
index = 0
计次循环首 (取数组成员数 (DescriptionArr), i)
判断 (DescriptionArr [i] = Description)
index = 到整数 (i - 1)
调试输出 (index, Description)
跳出循环 ()



计次循环尾 ()
返回 (index)


i支持库列表   支持库注释   
spec特殊功能支持库

  
子程序名返回值类型公开备 注
wmi_修改IP地址和网关和子网掩码和DNS文本型 修改IP地址和网关和子网掩码和DNS
参数名类 型参考可空数组备 注
Description文本型网卡描述 示例:"Realtek Gaming GbE Family Controller" 或 "TP-LINK Wireless USB Adapter"
IPAddress文本型IP地址 示例:{ “192.168.0.138” }
SubnetMask文本型掩码 示例:{ “255.255.255.0” }
Gateways文本型网关 示例:{ “192.168.0.1” }
DNS文本型主DNS 次DNS 示例:{ “202.96.128.86”, “202.96.128.166” }
变量名类 型静态数组备 注
objWbemLocator对象 
objWMIService对象 
objShare对象 
objInParam网址对象 
objInParam网关对象 
objInParamDNS对象 
objOutParams对象 
var变体型 
bool逻辑型 
变体变体型 
index整数型 
' 判断输入:
判断 (文本_是否IP格式 (IPAddress [1]))
返回 (“输入IP有误,正确示例:192.168.1.138”)


判断 (文本_是否IP格式 (SubnetMask [1]))
返回 (“输入掩码有误,正确示例:255.255.255.0”)


判断 (文本_是否IP格式 (Gateways [1]))
返回 (“输入网关有误,正确示例:192.168.1.1”)



判断 (文本_是否IP格式 (DNS [1]) 文本_是否IP格式 (DNS [2]))
返回 (“输入DNS有误,正确示例:{ ”#引号“202.96.128.86”#引号“, ”#引号“202.96.128.166”#引号“ }”#引号 )



index = 根据网卡描述找到Index (Description)
' https://learn.microsoft.com/zh-cn/windows/win32/cimwin32prov/win32-networkadapterconfiguration-methods
如果真 (objWbemLocator.创建 (“WbemScripting.SWbemLocator”, ))
' objWbemLocator.查看 ()
objWMIService = objWbemLocator.对象型方法 (“ConnectServer”, “.”, “\root\CIMV2”, , , , , , )  ' 连接服务器
如果真 (objWMIService.是否为空 ())
objShare = objWMIService.对象型方法 (“Get”, “Win32_NetworkAdapterConfiguration.Index='”到文本 (index)“'”)
如果真 (objShare.是否为空 ())
objInParam网址 = objShare.读对象型属性 (“Methods_”, ).对象型方法 (“Item”, “EnableStatic”).读对象型属性 (“InParameters”, ).对象型方法 (“SpawnInstance_”, )
' 设置IP:
' 添加输入参数
变体.赋值 (IPAddress, )  ' OK
bool = objInParam网址.对象型方法 (“Properties_”, ).对象型方法 (“Item”, “IPAddress”).写属性 (“value”, 变体)
调试输出 (objInParam网址.取错误 (), bool)
变体.赋值 (SubnetMask, )  ' OK
bool = objInParam网址.对象型方法 (“Properties_”, ).对象型方法 (“Item”, “SubnetMask”).写属性 (“value”, 变体)
调试输出 (objInParam网址.取错误 (), bool)
' 运行方法
objOutParams = objShare.对象型方法 (“ExecMethod_”, “EnableStatic”, objInParam网址)
如果真 (objOutParams.是否为空 ())
var = objOutParams.读对象型属性 (“Properties_”, ).对象型方法 (“Item”, “ReturnValue”).读属性 (“value”, )
调试输出 (“ReturnValue:”, 变体型类型 (var.取类型 ()), var.取数值 ())  ' 68:输入参数无效   97:接口不可配置   70:IP 地址无效
' https://learn.microsoft.com/zh-cn/windows/win32/cimwin32prov/enablestatic-method-in-class-win32-networkadapterconfiguration#syntax
objOutParams.清除 ()

' 网关:
objInParam网关 = objShare.读对象型属性 (“Methods_”, ).对象型方法 (“Item”, “SetGateways”).读对象型属性 (“InParameters”, ).对象型方法 (“SpawnInstance_”, )
变体.赋值 (Gateways, )  ' OK
bool = objInParam网关.对象型方法 (“Properties_”, ).对象型方法 (“Item”, “DefaultIPGateway”).写属性 (“value”, 变体)
调试输出 (objInParam网关.取错误 (), bool)
objOutParams = objShare.对象型方法 (“ExecMethod_”, “SetGateways”, objInParam网关)
' 运行方法
objOutParams = objShare.对象型方法 (“ExecMethod_”, “EnableStatic”, objInParam网址)
如果真 (objOutParams.是否为空 ())
var = objOutParams.读对象型属性 (“Properties_”, ).对象型方法 (“Item”, “ReturnValue”).读属性 (“value”, )
调试输出 (“ReturnValue:”, 变体型类型 (var.取类型 ()), var.取数值 ())  ' 68:输入参数无效   97:接口不可配置   70:IP 地址无效
' https://learn.microsoft.com/zh-cn/windows/win32/cimwin32prov/enablestatic-method-in-class-win32-networkadapterconfiguration#syntax
objOutParams.清除 ()

' DNS:
objInParamDNS = objShare.读对象型属性 (“Methods_”, ).对象型方法 (“Item”, “SetDNSServerSearchOrder”).读对象型属性 (“InParameters”, ).对象型方法 (“SpawnInstance_”, )
变体.赋值 (DNS, )
bool = objInParamDNS.对象型方法 (“Properties_”, ).对象型方法 (“Item”, “DNSServerSearchOrder”).写属性 (“value”, 变体)
调试输出 (objInParamDNS.取错误 (), bool)
' 运行方法
objOutParams = objShare.对象型方法 (“ExecMethod_”, “SetDNSServerSearchOrder”, objInParamDNS)
如果真 (objOutParams.是否为空 ())
var = objOutParams.读对象型属性 (“Properties_”, ).对象型方法 (“Item”, “ReturnValue”).读属性 (“value”, )
调试输出 (“ReturnValue:”, 变体型类型 (var.取类型 ()), var.取数值 ())  ' 68:输入参数无效   97:接口不可配置   70:IP 地址无效  84:适配器上未启用 IP
' https://learn.microsoft.com/zh-cn/windows/win32/cimwin32prov/enablestatic-method-in-class-win32-networkadapterconfiguration#syntax
objOutParams.清除 ()

objShare.清除 ()
objWMIService.清除 ()
objWbemLocator.清除 ()

返回 (“”)
' 官方设置IP代码:
' strComputer = "."
' Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
' Set objShare = objWMIService.Get("Win32_NetworkAdapterConfiguration.Index='1'")
' Set objInParam = objShare.Methods_("EnableStatic")._inParameters.SpawnInstance_()
' objInParam.Properties_.Item("IPAddress") =  "192.168.1.138"
' objInParam.Properties_.Item("SubnetMask") =  "255.255.255.0"
' Set objOutParams = objWMIService.ExecMethod("Win32_NetworkAdapterConfiguration.Index='1'", "EnableStatic", objInParam)
' Wscript.Echo "Out Parameters: "
' Wscript.echo "ReturnValue: " & objOutParams.ReturnValue



i支持库列表   支持库注释   
spec特殊功能支持库

  
子程序名返回值类型公开备 注
wmi_IP设置为自动获取 对没有连网的适配器设置可能会失败
参数名类 型参考可空数组备 注
Description文本型
变量名类 型静态数组备 注
objWbemLocator对象 
objWMIService对象 
objShare对象 
objInParam对象 
objOutParams对象 
var变体型 
index整数型 
index = 根据网卡描述找到Index (Description)
如果真 (objWbemLocator.创建 (“WbemScripting.SWbemLocator”, ))
objWMIService = objWbemLocator.对象型方法 (“ConnectServer”, “.”, “\root\CIMV2”, , , , , , )  ' 连接服务器
如果真 (objWMIService.是否为空 ())
objShare = objWMIService.对象型方法 (“Get”, “Win32_NetworkAdapterConfiguration.Index='”到文本 (index)“'”)
如果真 (objShare.是否为空 ())
objInParam = objShare.读对象型属性 (“Methods_”, ).对象型方法 (“Item”, “EnableDHCP”).读对象型属性 (“InParameters”, ).对象型方法 (“SpawnInstance_”, )
' 添加输入参数
' 运行方法
objOutParams = objShare.对象型方法 (“ExecMethod_”, “EnableDHCP”, objInParam)
如果真 (objOutParams.是否为空 ())
var = objOutParams.读对象型属性 (“Properties_”, ).对象型方法 (“Item”, “ReturnValue”).读属性 (“value”, )
调试输出 (“ReturnValue:”, 变体型类型 (var.取类型 ()), var.取数值 ())
' 84适配器上未启用 IP
objOutParams.清除 ()
objShare.清除 ()
objWMIService.清除 ()
objWbemLocator.清除 ()


i支持库列表   支持库注释   
spec特殊功能支持库

  
子程序名返回值类型公开备 注
wmi_DNS设置为自动获取 对没有连网的适配器设置可能会失败
参数名类 型参考可空数组备 注
Description文本型
变量名类 型静态数组备 注
index整数型 
objWbemLocator对象 
objWMIService对象 
objShare对象 
objInParam对象 
objOutParams对象 
var变体型 
index = 根据网卡描述找到Index (Description)
如果真 (objWbemLocator.创建 (“WbemScripting.SWbemLocator”, ))
objWMIService = objWbemLocator.对象型方法 (“ConnectServer”, “.”, “\root\CIMV2”, , , , , , )  ' 连接服务器
如果真 (objWMIService.是否为空 ())
objShare = objWMIService.对象型方法 (“Get”, “Win32_NetworkAdapterConfiguration.Index='”到文本 (index)“'”)
如果真 (objShare.是否为空 ())
objInParam = objShare.读对象型属性 (“Methods_”, ).对象型方法 (“Item”, “SetDNSServerSearchOrder”).读对象型属性 (“InParameters”, ).对象型方法 (“SpawnInstance_”, )
' 添加输入参数
' 运行方法
objOutParams = objShare.对象型方法 (“ExecMethod_”, “SetDNSServerSearchOrder”, objInParam)
如果真 (objOutParams.是否为空 ())
var = objOutParams.读对象型属性 (“Properties_”, ).对象型方法 (“Item”, “ReturnValue”).读属性 (“value”, )
调试输出 (“ReturnValue:”, 变体型类型 (var.取类型 ()), var.取数值 ())
objOutParams.清除 ()
objShare.清除 ()
objWMIService.清除 ()
objWbemLocator.清除 ()


i支持库列表   支持库注释   
spec特殊功能支持库


  
子程序名返回值类型公开备 注
文本_是否IP格式逻辑型 
参数名类 型参考可空数组备 注
ip文本型
变量名类 型静态数组备 注
arr文本型0
i整数型 
arr = 分割文本 (ip, “.”, )
判断 (取数组成员数 (arr) ≠ 4)
返回 ()



计次循环首 (4, i)
判断 (文本_是否为数字 (arr [i]) 到整数 (arr [i]) < 0 到整数 (arr [i]) > 255)
返回 ()



计次循环尾 ()
返回 ()




作者: jingyi11023995    时间: 2024-3-27 15:35
.版本 2

' 返回代码解释:https://learn.microsoft.com/zh-cn/windows/win32/cimwin32prov/enablestatic-method-in-class-win32-networkadapterconfiguration#syntax
代码数组 = { 0, 1, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 100, 2147786788 }
代码解释数组 = { “成功完成,无需重启。”, “成功完成,需要重新启动。”, “此平台不支持方法。”, “未知失败。”, “子网掩码无效。”, “处理返回的实例时出错。”, “输入参数无效。”, “指定的网关超过 5 个。”, “IP 地址无效。”, “网关 IP 地址无效。”, “访问注册表以获取请求的信息时出错。”, “无效的域名。”, “主机名无效。”, “未定义主 WINS 服务器或辅助 WINS 服务器。”, “文件无效。”, “系统路径无效。”, “文件复制失败。”, “无效的安全参数。”, “无法配置 TCP/IP 服务。”, “无法配置 DHCP 服务。 ”, “无法续订 DHCP 租约。”, “无法释放 DHCP 租约。”, “适配器上未启用 IP。”, “适配器上未启用 IPX。”, “帧或网络编号边界错误。”, “无效的帧类型。”, “网络号码无效。”, “重复的网络号码。”, “参数超出边界。”, “访问被拒绝。”, “内存不足。”, “已存在。”, “找不到路径、文件或对象。”, “无法通知服务。”, “无法通知 DNS 服务。”, “接口不可配置。”, “并非所有 DHCP 租约都可以释放或续订。”, “适配器上未启用 DHCP。”, “未启用写入锁定。” }

作者: 一指温柔    时间: 2024-3-28 16:01
感谢分享
作者: wxd520abc    时间: 2024-4-17 20:49
感谢分享
作者: qq1056123185    时间: 2024-4-25 14:51
本帖最后由 qq1056123185 于 2024-4-25 14:52 编辑

我的哥,IEnumVARIANT_Next这个命令找不到啊~
能发一个完整的.e文件吗?感谢~



作者: jingyi11023995    时间: 2024-4-25 23:32
qq1056123185 发表于 2024-4-25 14:51
我的哥,IEnumVARIANT_Next这个命令找不到啊~
能发一个完整的.e文件吗?感谢~

精易模块里面有!
作者: jacket12    时间: 2024-4-27 04:46
感谢楼主分享经验
作者: 高高小舟    时间: 2024-4-27 22:53
膜拜大佬
作者: cxswswswws    时间: 2024-5-6 14:52
感谢楼主分享经验
作者: 3708272    时间: 3 天前
感谢分享,已点赞收藏。




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4