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.inWindows スタイルのマシン名ではなく、ドメイン名のように見えることに気付きました。まず、 に対応する 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 に答える