忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT 视频 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 761 | 回复: 4

求助,写程序(自定义函数加调用WMI)遇到问题,实在搞不定了,请太神帮忙解答。 [复制链接]

论坛徽章:
0
发表于 2017-03-23 15:55 |显示全部楼层
本帖最后由 dalian_gq 于 2017-04-25 09:01 编辑

这个程序是用于在Windows环境中获取本机的网卡信息的。由于需要多次获得同类型信息。就自定义了一个函数,取类似信息。但取IP地址时遇到问题。第一种方法就能取得IP,第二种就取不到。

实在解决不了,请大神帮忙解答,谢谢!!!

下面是程序,和在我机器上的运行结果。

  1. use strict;
  2. use Win32::OLE qw(in);
  3. use Win32::OLE::Variant;

  4. my $DEBUG=0;

  5. my $strComputer = '.';
  6. my $objWMIService = Win32::OLE->GetObject('winmgmts:' .
  7.     '{impersonationLevel=impersonate}!\\\\' . $strComputer .
  8.     '\\root\\cimv2');
  9. my $wql = 'SELECT * FROM Win32_NetworkAdapterConfiguration Where IPEnabled = TRUE';
  10. my $results = $objWMIService->ExecQuery($wql);
  11. print "The System Information of this computer is as follows:\n\n";
  12. foreach my $obj (in $results) {
  13.     print "NAC : ", $obj->Caption, "\n";
  14.     print "IP : ", $obj->IPAddress(0), "\n";
  15.     print "MAC : ", $obj->MACAddress, "\n";
  16. }

  17. print "***************  1  ***************\n";


  18. sub get_wmi {
  19.   my($InstancesOf,$objSWbemObject,$Name,$Where) = @_;
  20.   my $strComputer = '.';
  21.   my $objWMIService = Win32::OLE->GetObject('winmgmts:' .
  22.     '{impersonationLevel=impersonate}!\\\\' . $strComputer .
  23.     '\\root\\cimv2');

  24.   my $wql;
  25.   if($Where eq ''){
  26.     $wql = "SELECT * FROM $InstancesOf";
  27.   }else{
  28.     $wql = "SELECT * FROM $InstancesOf Where $Where";
  29.   }
  30.   print "***************\tDebug ",$wql,"\t***************\n" if $DEBUG;
  31.   print "***************\tDebug ",$objSWbemObject,"\t***************\n" if $DEBUG;

  32.   my $results = $objWMIService->ExecQuery($wql);
  33.   my $lines=1;
  34.   foreach my $obj (in $results) {
  35.     print "***************\tDebug ",$lines++,"\t***************\n" if $DEBUG;
  36.     print "$Name\t\t\t:", $obj->$objSWbemObject, "\n";
  37.   }
  38. }

  39. get_wmi 'Win32_NetworkAdapterConfiguration','Caption','NAC','IPEnabled = TRUE';
  40. get_wmi 'Win32_NetworkAdapterConfiguration','IPAddress(0)','IP','IPEnabled = TRUE';
  41. get_wmi 'Win32_NetworkAdapterConfiguration','MACAddress','MAC','IPEnabled = TRUE';


  42. print "***************  2  ***************\n";
复制代码


运行结果:

The System Information of this computer is as follows:



NAC : [00000000] Intel(R) 82567LM-3 Gigabit Network Connection
IP : 192.168.111.50
MAC : 00:24:1D:09:2F:AC
***************  1  ***************
NAC                     :[00000000] Intel(R) 82567LM-3 Gigabit Network Connection
IP                      :
MAC                     :00:24:1D:09:2F:AC
***************  2  ***************



论坛徽章:
0
发表于 2017-04-10 22:45 |显示全部楼层
两个方法看上去就差了一个IP?估计读取字段IPAddress(0)这个不对,你应该去翻微软的WMI Win32_NetworkAdapterConfiguration的文档。

另外,你不是已经有一个方法可以了么?

论坛徽章:
0
发表于 2017-04-12 10:53 |显示全部楼层
感谢zhouzhen1的回答

我有一个方法可以用,但我不想每次都进行具体调用。
所以自定义了一个函数,但用自定义函数调用无法得到正确的结果。我想在参数传递上是否有问题我没有注意到?

论坛徽章:
112
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07巳蛇
日期:2014-05-09 16:43:18巨蟹座
日期:2014-10-23 17:48:38子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59
发表于 2017-04-12 16:51 |显示全部楼层
回复 1# dalian_gq

方法1
print "IP : ", $obj->IPAddress(0), "\n";



方法2

get_wmi 'Win32_NetworkAdapterConfiguration','Caption','NAC','IPEnabled = TRUE';
get_wmi 'Win32_NetworkAdapterConfiguration','IPAddress(0)','IP','IPEnabled = TRUE';

    print "$Name\t\t\t:", $obj->$objSWbemObject, "\n";


change to

        if($objSWbemObject !~ s/[(]([^)]+)[)]//){
          print "$Name\t\t\t:", $obj->$objSWbemObject, "\n";
        }
        else{
          print "$Name\t\t\t:", $obj->$objSWbemObject($1) , "\n";
        }   

论坛徽章:
0
发表于 2017-04-25 08:52 |显示全部楼层
回复 4# jason680

十分感谢jason680!!! 根据你说的改了,程序正常运行了。
我理解你的意思是括号不能直接带入到调用中去,必须重新用正则匹配出括号中参数,然后重新调用。

为了放便后来人学习,我把完整代码重新贴一下:

  1. use strict;
  2. use Win32::OLE qw(in);
  3. use Win32::OLE::Variant;

  4. my $DEBUG=0;

  5. my $strComputer = '.';
  6. my $objWMIService = Win32::OLE->GetObject('winmgmts:' .
  7.     '{impersonationLevel=impersonate}!\\\\' . $strComputer .
  8.     '\\root\\cimv2');
  9. my $wql = 'SELECT * FROM Win32_NetworkAdapterConfiguration Where IPEnabled = TRUE';
  10. my $results = $objWMIService->ExecQuery($wql);
  11. print "The System Information of this computer is as follows:\n\n";
  12. foreach my $obj (in $results) {
  13.     print "NAC : ", $obj->Caption, "\n";
  14.     print "IP : ", $obj->IPAddress(0), "\n";
  15.     print "MAC : ", $obj->MACAddress, "\n";
  16. }

  17. print "***************  1  ***************\n";


  18. sub get_wmi {
  19.   my($InstancesOf,$objSWbemObject,$Name,$Where) = @_;
  20.   my $strComputer = '.';
  21.   my $objWMIService = Win32::OLE->GetObject('winmgmts:' .
  22.     '{impersonationLevel=impersonate}!\\\\' . $strComputer .
  23.     '\\root\\cimv2');

  24.   my $wql;
  25.   if($Where eq ''){
  26.     $wql = "SELECT * FROM $InstancesOf";
  27.   }else{
  28.     $wql = "SELECT * FROM $InstancesOf Where $Where";
  29.   }
  30.   print "***************\tDebug ",$wql,"\t***************\n" if $DEBUG;
  31.   print "***************\tDebug ",$objSWbemObject,"\t***************\n" if $DEBUG;

  32.   my $results = $objWMIService->ExecQuery($wql);
  33.   my $lines=1;
  34.   foreach my $obj (in $results) {
  35.     print "***************\tDebug ",$lines++,"\t***************\n" if $DEBUG;
  36.     if($objSWbemObject !~ s/[(]([^)]+)[)]//){
  37.        print "$Name\t\t\t:", $obj->$objSWbemObject, "\n";
  38.     }
  39.     else{
  40.        print "$Name\t\t\t:", $obj->$objSWbemObject($1) , "\n";
  41.     }
  42.   }
  43. }

  44. get_wmi 'Win32_NetworkAdapterConfiguration','Caption','NAC','IPEnabled = TRUE';
  45. get_wmi 'Win32_NetworkAdapterConfiguration','IPAddress(0)','IP','IPEnabled = TRUE';
  46. get_wmi 'Win32_NetworkAdapterConfiguration','MACAddress','MAC','IPEnabled = TRUE';


  47. print "***************  2  ***************\n";
复制代码


您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP