2010-12-22 1 views
2

Я пытаюсь написать сценарий, который будет получать информацию журнала событий с удаленной оконной машины с помощью модуля win32 :: ole и запроса WMI. Я могу пинговать машину, но независимо от того, что мое соединение WMI всегда терпит неудачу, используя метод ConnectServer(). Я уверен, что это не проблема, связанная с брандмауэром. Вот мой код:Не могу подключиться к удаленной машине с использованием WMI и Perl

use Win32::OLE qw(in); 
use Net::Ping; 

use constant wbemFlagReturnImmediately => 0x10; 
use constant wbemFlagForwardOnly => 0x20; 

my $computer = "10.10.10.15"; 

my $user = "Administrator"; 
my $pwd = "pass"; 


$p = Net::Ping->new(); 
print "$computer is alive.\n" if $p->ping($host); 
$p->close(); 

    my $locatorObj =Win32::OLE->new("WbemScripting.SWbemLocator") or die "ERROR CREATING OBJ"; 

    $locatorObj->{Security_}->{impersonationlevel} = 3; 

    my $objWMIService = $locatorObj->ConnectServer($computer, "root\civm2", $user, $pwd) or die "WMI connection failed.\n"; 

    my $colItems = $objWMIService->ExecQuery("SELECT * FROM Win32_NTLogEvent", "WQL", 
       wbemFlagReturnImmediately | wbemFlagForwardOnly); 

    foreach my $objItem (in $colItems) { 
     print "Category: $objItem->{Category}\n"; 
     print "CategoryString: $objItem->{CategoryString}\n"; 
     print "ComputerName: $objItem->{ComputerName}\n"; 
     print "Data: " . join(",", (in $objItem->{Data})) . "\n"; 
     print "EventCode: $objItem->{EventCode}\n"; 
     print "EventIdentifier: $objItem->{EventIdentifier}\n"; 
     print "EventType: $objItem->{EventType}\n"; 
     print "InsertionStrings: " . join(",", (in $objItem->{InsertionStrings})) . "\n"; 
     print "Logfile: $objItem->{Logfile}\n"; 
     print "Message: $objItem->{Message}\n"; 
     print "RecordNumber: $objItem->{RecordNumber}\n"; 
     print "SourceName: $objItem->{SourceName}\n"; 
     print "TimeGenerated: $objItem->{TimeGenerated}\n"; 
     print "TimeWritten: $objItem->{TimeWritten}\n"; 
     print "Type: $objItem->{Type}\n"; 
     print "User: $objItem->{User}\n"; 
     print "\n"; 
    } 

Любые идеи, почему моя попытка подключения всегда терпит неудачу? Спасибо :)

ответ

1

ConnectServer вызов имеет несколько потенциальных проблем:

  • Я считаю, что нужно два обратной косой черты.
  • И Он имеет опечатка: civm2 -> cimv2

И это могло бы получить больше информации, добавив вызов для получения информации об ошибке:

my $objWMIService = $locatorObj->ConnectServer($computer, "root\\cimv2", $user, $pwd) 
     or die "WMI connection failed.\n", Win32::OLE->LastError; 
+0

ааа хороший улов на civm2-> cimv2. Я попытался внести эти изменения, но все равно не пошел. Интересно, как долго я пробовал это с ошибкой cimv2? Это моя первая попытка запустить сценарий WMI на удаленной машине. Кажется ли, что я даже на правильном пути? – MilqueToasted

+0

Я сделал эти два изменения и смог заставить его работать при работе на моем собственном компьютере. Я просто попробовал его против другой машины в сети, и это не удалось. Но в этом случае я подозреваю проблемы брандмауэра, поэтому я еще не исследовал. Возможно, вам потребуется включить имя домена с именем пользователя: 'my $ user =" somedomain \\ username ";' –

+0

Я уверен, что моя проблема не связана с брандмауэром, потому что я попытался запустить ее с машиной с нет брандмауэра ... Мне было интересно, важно ли это, были ли машины в рабочей группе или в домене. Думаю, я просто буду продолжать играть с ним. – MilqueToasted

Смежные вопросы