1

我一直在尝试编写一个 Perl 脚本来检查远程服务器的服务状态。我正在使用Win32::Service模块来实现我的目标。

我发现返回的某些服务值Win32::Service::GetStatus CurrentStatus与从 services.msc 小程序中观察到的值不完全相同。

这是我正在使用的一段脚本以及来自 script 和servics.msc.

use Data::Dumper;
use Win32;
use Win32::Service;
use strict;
use warnings;

my %statcodeHash = (     '1' => 'stopped.',
                     '2' => 'start pending.',
                     '3' => 'stop pending.',
                     '4' => 'running.',
                     '5' => 'continue pending.',
                     '6' => 'pause pending.',
                     '7' => 'paused.'            );


my @serviceNames = qw(NNMAction RpcEptMapper smstsmgr SNMPTRAP);

foreach my $serv (@serviceNames)
{   my %status;
    my $ret = Win32::Service::GetStatus('nnmi.hclt.corp.hcl.in', $serv, \%status);
    if ($ret)
    {   print "success\t$statcodeHash{$status{CurrentState}}\t$serv\n";
    }
    else
    {       print Win32::FormatMessage(Win32::GetLastError()), "\n";
    }
}

脚本的输出

D:\AVI MEHENWAL\PERL\SCRIPTS\PROJECTS\Serve Management>perl -w perl_RemoteServiceStatus.pl
success stopped.        NNMAction
success running.        RpcEptMapper
success stopped.        smstsmgr
success stopped.        SNMPTRAP

来自 Services.msc 的输出

Name       Descrition   Status   StartupType  LogOnAs
NNMAction  bla bla bla  Started  Manual       LocalSystem

谁能建议我应该遵循什么方法来实现我的目标,我的方法是错误的还是从 Perl 模块的角度来看我缺少什么?

4

1 回答 1

3

更新

我注意到这nnmi.hclt.corp.hcl.in似乎是一个域名,而不是 Windows 风格的机器名称。首先,找出对应的IP地址nnmi.hclt.corp.hcl.in。假设它是x.x.x.x

现在,运行nbtstat -A x.x.x.x。那应该告诉您机器的名称。假设它是NNMI。然后,您应该在my $remote下面的行中指定,替换MYREMOTENNMI,然后重试。

我假设您拥有正确的权限等。如果您遇到与授权相关的错误,恐怕我无法帮助您,但您可以在ServerFault上询问以了解您需要做什么,以便能够查询服务域中的远程计算机。

use strict;
use warnings;
use Data::Dumper;
use Win32;
use Win32::Service;

my %status_codes = reverse (
    SERVICE_STOPPED          => 0x00000001,
    SERVICE_START_PENDING    => 0x00000002,
    SERVICE_STOP_PENDING     => 0x00000003,
    SERVICE_RUNNING          => 0x00000004,
    SERVICE_CONTINUE_PENDING => 0x00000005,
    SERVICE_PAUSE_PENDING    => 0x00000006,
    SERVICE_PAUSED           => 0x00000007,
);

my $remote = '\\\\MYREMOTE';

my @services = qw(Fax ClipSrv AcrSch2Svc);

foreach my $svc (@services) {
    my %status;
    my $ret = Win32::Service::GetStatus($remote, $svc, \%status);

    if ($ret) {
        printf(
            "success\t%s\t%s\n",
            $status_codes{ $status{CurrentState} },
            $svc
        );
    }
    else
    {
        warn sprintf(
            "failed to get '%s' status: %s\n",
            $svc,
            Win32::FormatMessage(Win32::GetLastError())
        );
    }
}

作为参考,SERVICE_STATUS结构记录在这里

于 2012-12-19T14:25:41.877 回答