web-dev-qa-db-ja.com

現在ログインしているユーザーをWindowsにアクセスするXP Proシステム

XPマシンがあり、スケジュールされたタスクを早朝に実行します。残念ながら、それを機能させるには、特定のユーザーのデスクトップにログインする必要があります。残念ながら、そのユーザーはログアウトすることがあります。管理者がログインしている(そして正しいユーザーに再度ログインするのを忘れている)、またはセキュリティ更新プログラムを適用するために再起動されているなどから。

Nagiosに現在ログインしているユーザーを監視して、正しいユーザーを確認してもらいたいのですが。 NagiosはLinux上で実行されています。

これまで、現在のユーザーでSNMP変数を探してきました。運がなかった。私は試した snmpbulkwalk -m all -v2c -c community machineそしてgrepでユーザー名を取得し、ログイン前とログイン後にも実行し、差分を確認しましたが、何も役に立ちませんでした。

(Sambaからの)netコマンドを確認しましたが、そこには何も表示されません。何かを見逃した可能性があることは認めますが。さまざまなsessionオプションは、netセッションのみを表示するようです(ドメイン管理者アカウントを使用している場合でも)。

2
derobert

%WINDIR%\System32\dllcache\query.exe sessionは、WinXPに現在ログオンしているすべてのユーザーのリストを表示します。

何らかの理由で、query.exeがWinXPテストマシンのパス環境変数に含まれていなかったため、パス全体を指定しました。

query

RPC/DCOMを介してこの情報をリモートで取得できるものが必要な場合は、私が書いたいくつかのことを確認してください。

http://myotherpcisacloud.com/post/2013/01/16/Usersexe-v1003.aspx

http://www.myotherpcisacloud.com/post/2013/01/13/Getting-RDP-Sessions-with-Client-Computer-Name.aspx

ちなみに、XPできるだけ早く降りる必要があります。とても古いです。

編集:OK、これはまだあなたを助けていないので、私はあなたに別の選択肢を与えるつもりです。 Linuxマシンを使用して、ネットワーク経由でこのWinXPマシンにクエリを実行します。 WMIを使用したい。 Linux用のWMIクライアントが見つかりました。ここまでは順調ですね。

これにより、WMI WQLクエリを介して、現在ローカルマシンまたはリモートマシンのユーザーにログオンできます。これはPowershellで作成しました。申し訳ありませんが、PerlまたはBashに変換しません(読み取り:できません)が、WQLクエリを実行できる限り、概念は同じです。

$Sessions = Get-WMIObject -Query "SELECT * FROM Win32_LogonSession WHERE LogonType=2 OR LogonType=10"
Foreach($Session In $Sessions)
{
    If($Session -AND $Session.PSObject.Properties.Match('LogonId').Count)
    {
        Get-WMIObject -Query "Associators Of {Win32_LogonSession.LogonId=$($Session.LogonId)} WHERE AssocClass=Win32_LoggedOnUser Role=Dependent"
    }
}

LogonTypesが2と10の場合、ローカルとリモートの両方の対話型セッションがカバーされますが、サービスログオン、ネットワークログオン、またはバッチログオンはカバーされません。

はい、WinXPマシンにアクセスするにはアクセス許可が必要です。匿名のネットワークプロセスのために、このすべてのデータをせき立てるだけではありません。 WinXPは非常に古く、セキュリティは最新バージョンのWindowsよりもはるかに劣っているため、WinXPのローカルグループはそれほど細かくありません...私のポイントは、ネットワーク監視ユーザーをWinXPマシンのローカル管理者グループに配置することです。あなたの最良の選択肢かもしれません。ただし、最小特権の原則を引き続き使用する場合は、WMIコントロールコンソールwmimgmt.mscを使用して、アクセス許可を割り当てたいアカウントにアクセス許可を正確に設定することをお勧めします。

6
Ryan Ries

@Ryan Riesに感謝します。これが、私が使用している実際のPerlスクリプトです。うまくいけば、それは他の誰かに役立つことがわかります。動作しているようです。バグがあればお気軽に報告してください。見つかった場合は、これを更新することを忘れないようにします。

また、XPで監視ユーザーを管理者に配置する以外に、これを機能させる方法を見つけることができませんでした。XPでこれを行う唯一の方法だと思います。

#!/usr/bin/Perl -w
use 5.010;
use IPC::Run qw(run);
use Nagios::Plugin;
use strict;

my $np = Nagios::Plugin->new(
    shortname => 'check_windows_user',
    version   => '0.01',
    license   => 'Copyright 2013 Customer Relationship Metrics, LC. Based on a Powerhell program by Ryan Ries. CC-BY-SA http://creativecommons.org/licenses/by-sa/3.0/',
    usage =>
        'Usage: %s -H <Host> -A <authfile> -u <user>|-s <sid> -w <threshold> -c <threshold>',
    extra => <<EXTRA

Thresholds are in session counts.

See http://nagiosplug.sourceforge.net/developer-guidelines.html for a
description of the threshold format.
EXTRA
);

$np->add_arg(
    spec     => 'Host|H=s',
    help     => '-H, --Host=hostname',
    required => 1,
);
$np->add_arg(
    spec     => 'user|u=s',
    help     => '-u, --user=username',
    required => 0,
);
$np->add_arg(
    spec     => 'sid|s=s',
    help     => '-s, --sid=sid',
    required => 0,
);
$np->add_arg(
    spec     => 'authentication_file|authentication-file|A=s',
    help     => '-A, --authentication-file=FILE',
    required => 1,
);
$np->add_arg(
    spec     => 'warning|w=s',
    help     => '-w, --warning=INTEGER:INTEGER',
    required => 1,
);
$np->add_arg(
    spec     => 'critical|c=s',
    help     => '-c, --critical=INTEGER:INTEGER',
    required => 1,
);
$np->getopts;
$np->set_thresholds(
    warning  => $np->opts->warning,
    critical => $np->opts->critical
);

# setup
local $SIG{ALRM} = sub { die "alarm timed out\n" };
alarm 30;

my $target_user = defined $np->opts->user ? lc $np->opts->user : undef;
my $target_sid  = defined $np->opts->sid  ? lc $np->opts->sid  : undef;

my @wmic = (
    'wmic',
    -A => $np->opts->authentication_file,
    ('//' . $np->opts->Host));
my $wmic_out;

# get all logon ids
my @all_logon_ids;
run [
    @wmic,
    q{SELECT LogonId FROM Win32_LogonSession WHERE LogonType = 2 or LogonType = 10}
    ],
    \undef, \$wmic_out;
@all_logon_ids = split("\n", $wmic_out);

$all_logon_ids[0] =~ /^CLASS: Win32_LogonSession$/
    or die "Unexpected wmic result: $wmic_out";
$all_logon_ids[1] =~ /^LogonId$/
    or die "Unexpected wmic result: $wmic_out";
splice @all_logon_ids, 0, 2;

# get user of each logon, check if matches
my $session_count = 0;
foreach my $logon_id (@all_logon_ids) {
    # does not seem to be a way to specify which fields we want, or
    # their order  :-(
    #
    # also, it only seems to do delimited data — pick a character that
    # isn't going to occur in the data. And unit separator is even for
    # that purpose!
    run [
        @wmic,
        '--delimiter' => "\x1F",
        qq{Associators Of {Win32_LogonSession.LogonId=$logon_id} WHERE AssocClass=Win32_LoggedOnUser Role=Dependent}
        ],
        \undef, \$wmic_out;

    # sessions get left in Win32_LogonSession after log out (sometimes).
    next if '' eq $wmic_out;

    my @tmp = split("\n", $wmic_out);
    3 == @tmp && $tmp[0] =~ /^CLASS: Win32_UserAccount$/
        or die "Unexpected associator: $wmic_out";
    my %record;
    @record{map lc, split("\x1F", $tmp[1])} = map lc,
        split("\x1F", $tmp[2]);

    # try to disqualify
    defined $target_user && $target_user ne $record{caption}
        and next;
    defined $target_sid && $target_sid ne $record{sid}
        and next;

    # qualified
    ++$session_count;
}

$np->add_message($np->check_threshold($session_count),
    "$session_count sessions");

$np->nagios_exit($np->check_messages);

変更ログ

  • どうやら、リモートデスクトップ経由でセッションをログアウトし、別のユーザーにログインしない場合、セッションはWin32_LogonSessionに残されますが、何も関連付けられません。ステータスは常にnullであるため、そのようにフィルタリングすることはできません。関連付けの欠如でフィルタリングします。この2行の修正がないと、プラグインは停止します(したがって、不明が返されます)。
3
derobert