PERL script problem


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting PERL script problem
# 1  
Old 07-06-2007
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 Smilie
# 2  
Old 07-06-2007
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  
Old 07-06-2007
Quote:
Originally Posted by aigles
[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  
Old 07-06-2007
Quote:
Originally Posted by aigles
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! Smilie 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 08: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
# 5  
Old 07-06-2007
Hi, cbkihong.

An aside.
Quote:
Originally Posted by cbkihong
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
# 6  
Old 07-06-2007
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
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Programming

Problem with my perl script

hiii alll i wrote a prgm which would take position and strand from file 1 and tries to locate a string 250 characters ahead/before that position in anothe file (based on strand 0 or 1) open my $fhConditions, "<", "1.txt" or die "Epic Fail: $!"; open my $fhCharacters, "<", "2.txt" or die "OMG... (1 Reply)
Discussion started by: anurupa777
1 Replies

2. Web Development

problem with exporting vairable from one perl cgi to another perl cgi script while redirecting.

Can anyone tell me how to export a variable from one perl CGI script to another perl cgi script when using a redirect. Upon running the login.pl the user is prompted to enter user name and password. Upon entering the correct credentials (admin/admin) the user is redirected to welcome page. My... (3 Replies)
Discussion started by: Arun_Linux
3 Replies

3. Programming

Perl script problem

I made a perl script that will number the lines of program scripts with an extension asked by the user and will save them into a .txt file My problem with the code is that for some reason it skips about every second line Im currently using ms win7 with strawberry perl heres the code so far... (0 Replies)
Discussion started by: ejok
0 Replies

4. AIX

Perl Script Problem

Hi! I'm having a problem on AIX 5.3 I cant' seem to sort out. A Perl script that was working has stopped for some reason. Possibly and update or something seems to have broken it. The error is below and any help would be appreciated! Can't load... (2 Replies)
Discussion started by: eth0
2 Replies

5. Shell Programming and Scripting

Perl Script Problem

Hi Perl Gurus, I have a very simple problem. This command perfectly runs in Unix Shell: dlv_mng@hpp309:/delivery/dlv/dlv/dlv_mng> echo 7.5.1.2.25 | sed -n 's^\(.\).\(.\).\(.*\).\(.*\).\(.*\)^\1.\2^p' 7.5 However, when I run this inside a perl script, it fails. ... (1 Reply)
Discussion started by: som.nitk
1 Replies

6. HP-UX

perl script problem.

I test this perl script on hpux 11.x and everything is OK, on hpux 10.20 it doesn't work perl -e 'local($PSTAT,$PSTAT_STATIC,$mem_info,$PSTAT_STRUCT)=(239,2,"\0"x120,"LI4L"); syscall($PSTAT,$PSTAT_STATIC,$mem_info,length($mem_info),1,0); print... (1 Reply)
Discussion started by: netfinity
1 Replies

7. Shell Programming and Scripting

Problem in a perl script

Hi All I have to modify a existing perl script The context of the input txt file has changed Basically I have to remove 4 lines from the top of the file and print a number Of fields into another file and feed the out put back into the script. Now I’m doing this part manually ... (1 Reply)
Discussion started by: Ex-Capsa
1 Replies

8. Shell Programming and Scripting

problem in perl script

Hi, Here is my piece of code. #!/usr/bin/perl my $logFile = $ARGV; die "usage: $0 <logFile>" unless $logFile; die "Logfile $logFile doesn't exist" unless -f "$logFile"; my %no_of_questions; my %timestamp; open (FP,"<$logFile") or die "unable to open file $!" ; @records=<FP>;... (4 Replies)
Discussion started by: namishtiwari
4 Replies

9. Shell Programming and Scripting

call shell script from perl cgi script problem

hi,, i have perl scipt with line : system('./try.sh $t $d $m'); in shell scipt try.sh i have the line: echo $1 its not printing value of $t that i hav passed..y is it so..i am running it from apache web server (2 Replies)
Discussion started by: raksha.s
2 Replies

10. Shell Programming and Scripting

Perl script strange problem

Hi All, I have one strange problem in perl script. Bellow is the contents of the script i am trying to write: #!/usr/local/bin/perl my $module_list = ''; my @running_module; my $count=0; my $flag=0; my $ccprojecthome=$ENV{CCPROJECTHOME}; @module_list = `cat... (2 Replies)
Discussion started by: vaibhav
2 Replies
Login or Register to Ask a Question