У нас есть машина XP, которая запускает запланированные задачи рано утром и, к сожалению, должна быть авторизована на рабочем столе определенного пользователя, чтобы это работало. К сожалению, этот пользователь иногда выходит из системы - либо из-за того, что администратор вошел в систему (и забывает снова войти под правильным пользователем), либо из-за его перезапуска для применения обновлений безопасности и т. Д.
Я хотел бы, чтобы Nagios контролировал текущего пользователя, вошедшего в систему, чтобы убедиться, что он правильный. Nagios работает в Linux.
До сих пор я искал переменную SNMP с текущим пользователем; Мне не повезло. Я попытался snmpbulkwalk -m all -v2c -c сообщество machine
и grep'd это для имени пользователя, а также сделал перед входом в систему и после входа в систему, и проверил разницу, и не нашел ничего полезного.
Я проверил net
команда (из Samba), но я ничего там не вижу - хотя допускаю, что возможно я что-то упустил. Различные session
параметры, похоже, отображают только net
сеанс (даже когда я использую свою учетную запись администратора домена).
%WINDIR%\System32\dllcache\query.exe session
предоставит вам список всех пользователей, которые в данный момент вошли в систему WinXP.
По какой-то причине query.exe не был в переменной среды моего пути на моей тестовой машине WinXP, поэтому я указал весь путь.
Если вам нужно что-то, способное получать эту информацию удаленно через 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. Он очень старый.
Редактировать: Хорошо, я собираюсь предложить вам другую альтернативу, поскольку ничто из этого вам еще не помогло. Вы хотите запросить эту машину WinXP по сети с помощью машины Linux. Вы хотите использовать WMI. Вы нашли клиент WMI для Linux. Все идет нормально.
Это позволит вам в настоящее время войти в систему пользователей локального или удаленного компьютера с помощью запросов 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 не очень детализированы, потому что WinXP очень старый, а его безопасность намного хуже, чем в современных версиях Windows ... я хочу сказать, что вы поместите вашего пользователя сетевого мониторинга в локальную группу администраторов на машине WinXP может быть вашим лучшим вариантом. Но я рекомендую вам, если вы по-прежнему хотите придерживаться принципа наименьших привилегий. В этом случае вы можете использовать консоль управления WMI, wmimgmt.msc, и установить разрешения именно для той учетной записи, которой вы хотите назначить разрешения.
Спасибо, @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);