The UNIX and Linux Forums  
Hello and Welcome from United States to the UNIX and Linux Forums! Thank You for Visiting and Joining Our Global Community.

Go Back   The UNIX and Linux Forums > Top Forums > Shell Programming and Scripting
.
google unix.com



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

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

Closed Thread
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish Bulgarian Greek Powered by Powered by Google
 
LinkBack Thread Tools Search this Thread Rate Thread Display Modes
  #1 (permalink)  
Old 07-06-2007
caddyjoe77 caddyjoe77 is offline
Registered User
  
 

Join Date: Apr 2005
Posts: 40
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
  #2 (permalink)  
Old 07-06-2007
aigles's Avatar
aigles aigles is offline Forum Advisor  
Registered User
  
 

Join Date: Apr 2004
Location: Bordeaux, France
Posts: 1,416
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";
   }
}
  #3 (permalink)  
Old 07-06-2007
cbkihong cbkihong is offline Forum Advisor  
Advisor
  
 

Join Date: Sep 2002
Location: Hong Kong, China
Posts: 1,624
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.
  #4 (permalink)  
Old 07-06-2007
drl's Avatar
drl drl is offline Forum Advisor  
Registered User
  
 

Join Date: Apr 2007
Location: Saint Paul, MN USA / BSD, CentOS, Debian, OS X, Solaris
Posts: 704
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
  #5 (permalink)  
Old 07-06-2007
caddyjoe77 caddyjoe77 is offline
Registered User
  
 

Join Date: Apr 2005
Posts: 40
thanks for the help on this; i actually used that particular foreach example from a PERL book i had gotten. Bear in mind i am NOT much of a PERL programmer but definitely trying to learn.

here is the final script that at least goes all the way through the script without erroring except RPC server not available. Strange, i think i need to add some DNS checking or something to resolve the hostname or NBT.

use Win32::OLE;
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="gws-379txt1337";
open(DATA,"<hosts.txt \n") || die "Could not open File!, check the path! \n";

while( my $computer = <DATA>)
{
print $computer;
foreach $computer(in(<DATA>))
{
$objWMIService = Win32::OLE->GetObject
("winmgmts:\\\\$computer\\root\\CIMV2") || 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";
}
}
}
close(DATA)

as i mentioned above, i get an RPC error and also another strange thing;

the hostnames are listed like :

the-999the-9999
the-thisis5678
th-999www9087

those are of course exampled of the format...but should i build some checking for dashes too? the computer name DOES get read into the script, i just get the RPC error on most except the example the-999the-9999.

thanks
  #6 (permalink)  
Old 07-06-2007
caddyjoe77 caddyjoe77 is offline
Registered User
  
 

Join Date: Apr 2005
Posts: 40
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 07: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
Closed Thread

Bookmarks

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes Rate This Thread
Rate This Thread:

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

BB 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 -4. The time now is 07:11 AM.


Powered by: vBulletin, Copyright ©2000 - 2006, Jelsoft Enterprises Limited. Language Translations Powered by .
vBCredits v1.4 Copyright ©2007 - 2008, PixelFX Studios
The UNIX and Linux Forums Content Copyright ©1993-2009. All Rights Reserved.Ad Management by RedTyger

Content Relevant URLs by vBSEO 3.2.0