Hello Perl Monks, I am trying to write a perl script that captures Serverice status on the servers with a specific username. the script reads the server list from a text file and ping to verify if the server is online and then connects to wmi using SWbemLocator using the admin username. i want to capture when the script fails to connect to wmi and update the excel sheet against the server name. but the script just errors out and stops. can some one please help me how to capture this error and store in the output report.

Error: OLE exception from "SWbemLocator": Access is denied. Win32::OLE(0.1709) error 0x80070005: "Access is denied" in METHOD/PROPERTYGET "ConnectServer" at ServiceCheck.pl line 102.

Line 102 :  my $objWMIService = $locatorObj->ConnectServer($host, "root\\cimv2", $user, $pwd);

Script:
#use strict; use Net::Ping; use Switch; use warnings; use Net::DNS; use Win32::OLE; use Win32::OLE qw(in with); use Net::Ping; $Win32::OLE::Warn = 3; use Carp; use constant wbemFlagReturnImmediately => 0x10; use constant wbemFlagForwardOnly => 0x20; #my $computer; my $user = "username"; my $pwd = "password"; my $x; my $timeout = 10; my $host = ""; my $Srvstatus = ""; my $Status =""; my $Startmode = ""; my $Comments = ""; # Create a new ping object $pingit = Net::Ping->new("icmp"); # use existing instance if Excel is already running eval {$xlApp = Win32::OLE->GetActiveObject('Excel.Application')}; die "Excel not installed" if $@; my $locatorObj =Win32::OLE->new("WbemScripting.SWbemLocator") or die " +ERROR CREATING OBJ"; $locatorObj->{Security_}->{impersonationlevel} = 3; # Start Excel and make it visible $xlApp = Win32::OLE->new('Excel.Application'); $xlApp->{Visible} = 1; # Create a new workbook $xlBook = $xlApp->Workbooks->Add; $sheet = $xlBook -> Worksheets("Sheet1"); $sheet-> Activate; $sheet->Cells(1,1)->{'Value'} = "servername"; $sheet->Cells(1,2)->{'Value'} = "Service found"; $sheet->Cells(1,3)->{'Value'} = "Status"; $sheet->Cells(1,4)->{'Value'} = "Start Mode"; $sheet->Cells(1,5)->{'Value'} = "comments"; $row = 2; open FILE, "c:\\serverping.txt" or die "could not open the file"; @lines = <FILE>; foreach $line (@lines) { $host = ""; $Srvstatus = ""; $Status =""; $Startmode = ""; $Comments = ""; print $line,"\n"; #Trimming Leading and trailing spaces $line =~ s/^\s+//m; $line =~ s/\s+$//m; $sheet->Cells($row,1)->{'Value'} = $line; $host = $line; # perform the ping if( $pingit->ping($host, $timeout) ) { print "Host ".$host." is alive\n"; #$sheet->Cells($row,4)->{'Value'} = "Host ".$host." is alive"; + #my $result = eval { # $DB->Execute( $SQLquery, 128 ) #}; #unless (defined $result) { # print $ERROR win32_error_message(Win32::OLE->LastError); # Win32::OLE->LastError(0); #} #my $objWMIService = $locatorObj->ConnectServer($host, "root +\\cimv2", $user, $pwd) or die "WMI connection failed.\n", Win32::OLE- +>LastError; my $objWMIService = $locatorObj->ConnectServer($host, "root\ +\cimv2", $user, $pwd); if (Win32::OLE->LastError()) { $sheet->Cells($row,5)->{'Value'} = "$_\n"; $sheet->Cells($row,2)->{'Value'} = "No"; print "$_\n"; Win32::OLE->LastError(0); # this clears your error } else { $colItems = $objWMIService->ExecQuery ("SELECT * FROM Win32_Service Where Name = 'Patrol +Agent'","WQL",wbemFlagReturnImmediately | wbemFlagForwardOnly); foreach my $objItem (in $colItems) { $Srvstatus = $objItem->{Name}; $Status =$objItem->{State}; $Startmode = $objItem->{StartMode}; } print "$Srvstatus \t $Status \t $Startmode \n"; if (lc($Srvstatus) eq 'patrolagent') { $sheet->Cells($row,3)->{'Value'} = $Status; $sheet->Cells($row,4)->{'Value'} = $Startmode; $sheet->Cells($row,2)->{'Value'} = "Yes"; $sheet->Cells($row,5)->{'Value'} = "Yes"; } else { $sheet->Cells($row,5)->{'Value'} = "Could not find + Patrol Service"; $sheet->Cells($row,2)->{'Value'} = "No"; } } } else { #print "Warning: ".$host." appears to be down or icmp packets ar +e blocked by their server\n"; $sheet->Cells($row,5)->{'Value'} = "Warning: ".$host." Down"; $sheet->Cells($row,2)->{'Value'} = "No"; } $row++; } close FILE; $pingit->close(); $xlBook->{Saved} = 1; $xlApp-> {DisplayAlerts} = 0; # This turns off the "This file already +exists" message. $xlBook-> SaveAs ("C:\\temp\\ServiceStatusCheck.xls"); $xlApp-> Quit; $xlBook = 0; $xlApp = 0;

In reply to Capture OLE Execption by vamsinm

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.