Por que não estou obtendo minha sessão de logon de uma consulta WMI?

3

Estou escrevendo um programa em que uma das funções é obter as sessões de logon atuais em um computador com Windows. Ele consulta o WMI para as sessões atuais com o tipo de logon 2 (interativo), o tipo de logon 10 (interativo remoto) e o tipo de logon 11 (interativo em cache). O código que tenho funciona OK, exceto por uma coisa que acabei de notar. Quando eu estava testando em meu ambiente de trabalho, tudo estava bem, mas agora que estou em casa e conectado fora da nossa rede de trabalho, eu não estou recebendo nenhuma sessão - e eu pensei em pegar minha sessão de logon como uma sessão interativa em cache.

Então eu testei com este código PS retirado de este site :

$computername = "mycomputername"
Get-WmiObject -Class Win32_LogonSession -ComputerName $computername |            
foreach {            
 $data = $_            

 $id = $data.__RELPATH -replace """", "'"            
 $q = "ASSOCIATORS OF {$id} WHERE ResultClass = Win32_Account"            
 Get-WmiObject -ComputerName $computername -Query $q |            
 select @{N="User";E={$($_.Caption)}},             
 @{N="LogonTime";E={$data.ConvertToDateTime($data.StartTime)}}            
}         

que simplesmente leva a todas sessões de logon. E, novamente, é como se eu não tivesse feito logon:

Usuário LogonTime
---- ---------
mycomputername \ IUSR 1/22/2016 12:07:50 AM
mycomputername \ SYSTEM 22/01/2016 12:07:09 AM
mycomputername \ LOCAL SERVICE 22/01/2016 12:07:11 AM
mycomputername \ NETWORK SERVICE 22/01/2016 12:07:10 AM
mycomputername \ ANONYMOUS LOGON 22/01/2016 12:08:03 AM

Meu nome de usuário atual não é mostrado ... Por que isso poderia ser? O que posso fazer para ver minha sessão de logon?

    
por Michał Masny 22.01.2016 / 02:00

2 respostas

2

Por que não está funcionando?

De acordo com esta postagem de blog da Microsoft , sua consulta não pode recuperar informações sobre a conta de um usuário de domínio quando o domínio não está acessível. Isso porque Win32_Account tem propriedades que exigem informações do controlador de domínio para serem preenchidas. Portanto, a construção da instância Win32_Account falhará e as entradas relevantes não aparecerão nos resultados.

O que pode ser feito?

É realmente um estado triste, mas você precisará analisar a Antecedent string da classe Win32_LoggedOnUser para obter com fiabilidade o nome de uma conta quando não puder falar com o domínio dela. O nome da conta está entre Name=" e " , como você pode ver na saída de gwmi -class Win32_LoggedOnUser . Tenho certeza que você poderia fazer melhor com expressões regulares, mas esta é a minha maneira rápida e suja de imprimir apenas os nomes de usuários de todas as sessões de logon:

gwmi -Query "select * from win32_loggedonuser" | ForEach-Object { (($_.Antecedent -Split "Name='"")[1] -Split "'"")[0] }

(Como não estou correlacionando com as sessões de console reais aqui, haverá alguns usuários falsos frouxos, como DWM-1 .)

    
por 24.01.2016 / 03:35
0

Também é possível usar o comando do Terminal Server QUERY :

The query utilities are used to display current information about the system such as the current allocation of resources and system status. The query command can invoke any one of the query utilities. The command line format is:

query [appservers | object | process | session | user] [/?]

Este comando obterá a lista de todos os usuários conectados:

query user

O resultado pode ser assim para um logon local, mas eu também o verifiquei para um logon remoto:

    
por 24.01.2016 / 09:52