The UNIX and Linux Forums  

Go Back   The UNIX and Linux Forums > Top Forums > Shell Programming and Scripting
Google UNIX.COM
Home Forums Register Rules & FAQ Members List Arcade Search Today's Posts Mark Forums Read


Shell Programming and Scripting Post questions about KSH, CSH, SH, BASH, PERL, PHP, SED, AWK and OTHER shell scripts here. Shell Script Page.


Other UNIX.COM Threads You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
Having a problem with a FTP Script using perl scottzx7rr Shell Programming and Scripting 6 12-19-2007 02:26 PM
Calling a perl script from a perl script new2ss Shell Programming and Scripting 3 02-06-2007 07:17 PM
Perl script strange problem vaibhav Shell Programming and Scripting 2 11-23-2006 03:08 AM
Perl: Run perl script in the current process vino Shell Programming and Scripting 10 12-09-2005 06:45 AM
Problem executing setuid script in perl-5.8.6 sarmakdvsr Shell Programming and Scripting 0 08-22-2005 11:11 PM

Reply
 
Submit Tools LinkBack Thread Tools Search this Thread Display Modes
  #1 (permalink)  
Old 07-06-2007
Registered User
 

Join Date: Apr 2005
Posts: 28
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiReddit! Stumble this Post!Spurl this Post!
PERL script problem

Hi all, i wrote this script and the code appears to work except i cannot connect to the WMI interface on Windows XP boxes. The listing is printed for testing purposes so i know that part works. When it tries to connect to WMI, the script dies. Should echo these properties to me. I think the problem is in the array, but not sure how to fix it. Can you all help?

Code:
use Win32::OLE('in');
use constant wbemFlagReturnImmediately => 0x10;
use constant wbemFlagForwardOnly => 0x20;
#use Win32::AdminMisc;

#Read from your selected file, make sure the path is right; you must use \\ or UNC \\\\
$computer="c:\\list\\hosts.txt \n";
open(DATA,$computer) or die "Could not open File!, check the path! \n";
@raw_list=<DATA>;
print @raw_list;
close(DATA)

foreach($computer, @raw_list); 
$objWMIService = Win32::OLE->GetObject
    ("winmgmts:\\\\$computer\\root\\CIMV2") or die "WMI connection failed.\n";
$colItems = $objWMIService->ExecQuery
    ("SELECT * FROM Win32_OperatingSystem","WQL",wbemFlagReturnImmediately | wbemFlagForwardOnly);

foreach my $objItem (in $colItems)
{
      print "Caption: $objItem->{Caption}\n";
      print "CSD Version: $objItem->{CSDVersion}\n";
      print "CS Name: $objItem->{CSName}\n";
      print "Name: $objItem->{Name}\n";
      print "Service Pack Major Version: $objItem->{ServicePackMajorVersion}\n";
      print "System Directory: $objItem->{SystemDirectory}\n";
      print "Windows Directory: $objItem->{WindowsDirectory}\n";
      print "\n";
}
thanks for whatever help you can provide.

dont beat me to profusely with a stick; its not under my control that they are all Windows boxes
Reply With Quote
Forum Sponsor
  #2 (permalink)  
Old 07-06-2007
aigles's Avatar
Registered User
 

Join Date: Apr 2004
Location: Bordeaux, France
Posts: 1,072
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiReddit! Stumble this Post!Spurl this Post!
Code:
foreach($computer, @raw_list)
{
   $objWMIService = Win32::OLE->GetObject
       ("winmgmts:\\\\$computer\\root\\CIMV2") or die "WMI connection failed.\n";
   $colItems = $objWMIService->ExecQuery
       ("SELECT * FROM Win32_OperatingSystem","WQL",wbemFlagReturnImmediately | wbemFlagForwardOnly);

   foreach my $objItem (in $colItems)
   {
         print "Caption: $objItem->{Caption}\n";
         print "CSD Version: $objItem->{CSDVersion}\n";
         print "CS Name: $objItem->{CSName}\n";
         print "Name: $objItem->{Name}\n";
         print "Service Pack Major Version: $objItem->{ServicePackMajorVersion}\n";
         print "System Directory: $objItem->{SystemDirectory}\n";
         print "Windows Directory: $objItem->{WindowsDirectory}\n";
         print "\n";
   }
}
Reply With Quote
  #3 (permalink)  
Old 07-06-2007
Moderator
 
Join Date: Sep 2002
Location: Hong Kong, China
Posts: 1,375
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiReddit! Stumble this Post!Spurl this Post!
Quote:
Originally Posted by aigles View Post
[code]
foreach my $objItem (in $colItems)
Perl doesn't have the foreach() loop syntax like that, I think. It looks more like Javascript or PHP than Perl. I guess you should try to quote any error messages if any, and indicate which line the error exists. The segment you posted does not appear to be a correct Perl program.
Reply With Quote
  #4 (permalink)  
Old 07-06-2007
Registered User
 

Join Date: Apr 2005
Posts: 28
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiReddit! Stumble this Post!Spurl this Post!
Quote:
Originally Posted by aigles View Post
Code:
foreach($computer, @raw_list)
{
   $objWMIService = Win32::OLE->GetObject
       ("winmgmts:\\\\$computer\\root\\CIMV2") or die "WMI connection failed.\n";
   $colItems = $objWMIService->ExecQuery
       ("SELECT * FROM Win32_OperatingSystem","WQL",wbemFlagReturnImmediately | wbemFlagForwardOnly);

   foreach my $objItem (in $colItems)
   {
         print "Caption: $objItem->{Caption}\n";
         print "CSD Version: $objItem->{CSDVersion}\n";
         print "CS Name: $objItem->{CSName}\n";
         print "Name: $objItem->{Name}\n";
         print "Service Pack Major Version: $objItem->{ServicePackMajorVersion}\n";
         print "System Directory: $objItem->{SystemDirectory}\n";
         print "Windows Directory: $objItem->{WindowsDirectory}\n";
         print "\n";
   }
}

I tried that and get a 255 error.

if i change it to foreach(@raw_list) or foreach($computer) i get an error 9

here is the error, substitute 255 for the 9

WMI connection failed.
host1
host2
host3
Exit code: 9 , 0009h

I'm sure it is with the array, but damn if i can figure it out! Where do i find the system error codes such as 9 or 255?

EDIT: ok, i ran the script with perl -w and this is what i received

Odd number of elements in hash assignment at retina.pl line 21, <DATA> line 3.
Win32::OLE(0.1707) error 0x80041021
after character 0 in "winmgmts:\\c:\list\hosts.txt
\root\CIMV2" at retina.pl line 30
eval {...} called at retina.pl line 30
WMI connection failed.


so basically, what i gather from this is that it may not even be connecting to the WMI service to begin with? And for some reason it is reading what is supposed to be a hostname as the literal filename and path. Am i on the right track here?

thank you

Last edited by caddyjoe77 : 07-06-2007 at 04:00 AM. Reason: ran with perl -w to report errors....wanted to update post instead of making a reply to me; answering yourself means insanity
Reply With Quote
  #5 (permalink)  
Old 07-06-2007
drl's Avatar
drl drl is offline
Registered User
 

Join Date: Apr 2007
Location: Saint Paul, MN USA / BSD, CentOS, Debian, OS X, Solaris
Posts: 430
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiReddit! Stumble this Post!Spurl this Post!
Hi, cbkihong.

An aside.
Quote:
Originally Posted by cbkihong View Post
Perl doesn't have the foreach() loop syntax like that, I think. It looks more like Javascript or PHP than Perl. I guess you should try to quote any error messages if any, and indicate which line the error exists. The segment you posted does not appear to be a correct Perl program.
I thought so at first also, so I wrote a short script to see what happened:
Code:
#!/usr/bin/perl

# @(#) perl-basic       Template for common usage.

# use warnings;
# use strict;

my($debug);
$debug = 0;
$debug = 1;

my(@a) = qw/ a b c d e /;
my($a) = @a;

foreach my $i ( in $a ) {
        print " i is :$i:\n";
}

exit(0);
which produced:
Code:
% ./p1
Can't locate object method "in" via package "a" (perhaps you forgot to load "a"?) at ./p1 line 15.
That seems to be something to do with the OO features of perl, with which I am not sufficiently familiar to be able to provide an explanation. I perused Schwartz' Intermediate perl, but found nothing on-point so far.

I think we both looked at this and saw a corruption of the foreach with syntax from some other language. However, almost anything seems to be legal in perl. So, at least from my perspective, I was led to the wrong conclusion by assuming a syntax infraction.

Even if one enables strict and warnings, the same message is produced ... cheers, drl
Reply With Quote
Google UNIX.COM
Reply



Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On



All times are GMT -7. The time now is 03:05 PM.


Powered by: vBulletin, Copyright ©2000 - 2006, Jelsoft Enterprises Limited.
The UNIX and Linux Forums Content Copyright ©1993-2008 The CEP Blog All Rights Reserved -Ad Management by RedTyger

Search Engine Optimization by vBSEO 3.1.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 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 99 100 101 102