Obtendo o usuário atualmente logado em um sistema Windows XP Pro

2

Temos uma máquina XP que executa tarefas agendadas no início da manhã e infelizmente precisa estar conectada à área de trabalho de um determinado usuário para que isso funcione. Infelizmente, esse usuário às vezes fica desconectado - seja de um administrador fazendo login (e esquecendo de efetuar login no usuário correto) ou de ser reiniciado para aplicar atualizações de segurança, etc.

Eu gostaria que o Nagios monitorasse o usuário atualmente conectado, para confirmar que é o caminho certo. O Nagios está rodando no Linux.

Até agora, procurei uma variável SNMP com o usuário atual; Eu não tive sorte. Eu tentei snmpbulkwalk -m all -v2c -c community machine e grep para o nome de usuário, e também fiz um antes de login & após o login, e verifiquei o diff, e não encontrei nada útil.

Eu verifiquei o comando net (do Samba), mas não vejo nada lá - embora admito que é possível que eu tenha perdido alguma coisa. As várias opções session parecem exibir apenas a sessão net (mesmo quando uso minha conta de administrador de domínio).

    
por derobert 16.08.2013 / 00:09

2 respostas

6

%WINDIR%\System32\dllcache\query.exe session fornecerá uma lista de todos os usuários atualmente conectados no WinXP.

Por alguma razão, o query.exe não estava na minha variável de ambiente path na minha máquina de testes WinXP, por isso eu especifiquei o caminho inteiro.

SevocêprecisardealgocapazdeobteressasinformaçõesremotamenteporRPC/DCOM,confiraalgumascoisasqueescrevi:

link

link

A propósito, você precisa sair do XP o mais rápido possível. É muito antigo.

Editar: OK, vou lhe dar outra alternativa, já que nada disso o ajudou ainda. Você quer consultar esta máquina WinXP através da rede usando sua máquina Linux. Você quer usar o WMI. Você encontrou um cliente WMI para Linux. Até aí tudo bem.

Isso fará com que você faça logon atualmente em usuários de uma máquina local ou remota por meio de consultas WMI WQL. Eu escrevi isso em Powershell. Desculpe, eu não vou (ler: não posso) convertê-lo para Perl ou Bash para você, mas o conceito é o que ainda é o mesmo, desde que você possa fazer consultas 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 de 2 e 10 cobrem sessões interativas locais e remotas, mas não logons de serviço, logons de rede ou logons em lotes.

Sim, você precisa de permissões para acessar a máquina WinXP. Não é só liberar todos esses dados para um processo de rede anônimo. Os grupos locais no WinXP não são muito granulares, porque o WinXP é muito antigo e sua segurança é muito inferior à das versões modernas do Windows ... meu ponto é colocar o usuário de monitoramento de rede no grupo Admins local da máquina WinXP pode ser sua melhor opção. Mas eu recomendo que você ainda queira seguir o princípio de privilégio mínimo, e nesse caso, você pode usar o Console de Controle WMI, wmimgmt.msc, e definir as permissões exatamente para a conta à qual você deseja atribuir as permissões. / p>     

por 16.08.2013 / 01:13
3

Obrigado yo @Ryan Ries, aqui está o script Perl que estou usando. Espero que isso seja útil para outra pessoa. Parece estar funcionando, por favor, sinta-se livre para relatar quaisquer erros. Vou tentar lembrar de atualizar isso se eu encontrar algum.

Além disso, não encontrei nenhuma maneira de fazer isso funcionar no XP, a não ser colocar o usuário de monitoramento em Administradores. Eu acho que é a única maneira de fazer isso no 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);

Changelog

  • Aparentemente, se você fizer logout de uma sessão via desktop remoto, e não conectar outro usuário, a sessão será deixada no Win32_LogonSession, mas sem nada associado. O status é sempre nulo, portanto, não é possível filtrar dessa maneira. Filtrar por falta de associações. Sem essa correção de duas linhas, o plugin morreria (e, portanto, retornaria desconhecido).
por 20.08.2013 / 23:46