Usando o PowerShell Dinâmico para Obter Usuários Atuais

Quando trabalha com o Windows, em algum momento, provavelmente precisará descobrir quais contas de usuário estão atualmente logadas em um computador. Felizmente, você pode usar o PowerShell para obter os usuários atuais em computadores locais ou remotos.

Você possui senhas comprometidas no seu Active Directory? Descubra com o Specops Password Auditor Free.

Neste tutorial, você aprenderá várias maneiras de usar o PowerShell para obter os usuários atuais em um computador. Os métodos incluirão comandos nativos, classes .NET e cmdlets específicos do Windows Management Instrumentation (WMI).

Está pronto para descobrir quem está rondando o seu computador? Vamos começar!

Pré-requisitos

Neste tutorial, será melhor aprender seguindo os exemplos. Para isso, você precisará de um computador que execute qualquer versão moderna do Windows, como o Windows 10, Windows Server 2012 ou posterior.

Este tutorial usará um computador executando o Windows Server 2019 chamado DC1.

Por que usar o PowerShell para obter os usuários atuais logados em um computador?

Admito que existem maneiras de fazer com que os usuários atuais façam login em um computador sem PowerShell. Afinal, os administradores do sistema precisavam ter um método para fazer isso mesmo antes do PowerShell, certo? Se sim, por que usar o PowerShell?

Fazer a mesma tarefa no PowerShell beneficia ao tratar os resultados como objetos que você pode manipular. Por exemplo, se você executar um script que solicita as credenciais do usuário, o PowerShell pode popular programaticamente o nome de usuário, e você só precisa digitar a senha manualmente.

Outro exemplo do mundo real é exportar a lista de usuários atualmente conectados a um servidor para um arquivo. Isso é feito usando o PowerShell para obter os usuários atuais e depois exportar o resultado para arquivos CSV, HTML ou XML. Em seguida, vários fluxos de trabalho de automação podem usar essa saída.

Pode haver milhares de motivos para usar o PowerShell para obter os usuários atuais, mas no final tudo se resume aos seus requisitos. E este tutorial irá ensinar as diferentes maneiras de alcançar esse objetivo.

Consulta à Classe Win32_ComputerSystem

Vamos começar com os cmdlets nativos do PowerShell chamados Get-WMIObject e Get-CimInstance. Esses cmdlets permitem que você consulte informações, incluindo o usuário atualmente conectado, usando as classes de Gestão do Windows (WMI) em um computador local ou remoto.

Get-WMIObject é o cmdlet mais antigo (obsoleto) e está disponível apenas até o Windows PowerShell 5.1. Por outro lado, Get-CIMInstance é o cmdlet mais novo e seguro, disponível até as versões mais recentes do PowerShell.

Para saber mais, visite Get-CIMInstance Vs. Get-WMIObject: Qual a Diferença?

Para usar o PowerShell para obter o usuário atual, invoque o cmdlet direcionando a classe Win32_ComputerSystem. A classe Win32_ComputerSystem inclui várias propriedades, incluindo a propriedade Username. Para fazer isso, abra uma janela do PowerShell e execute os comandos abaixo.

# Usando o cmdlet Get-WMIObject e retornando apenas a propriedade Username
(Get-WMIObject -ClassName Win32_ComputerSystem).Username

# Usando o cmdlet Get-CimInstance e retornando apenas a propriedade Username
(Get-CimInstance -ClassName Win32_ComputerSystem).Username

Observação: Consultar a classe Win32_ComputerSystem somente retornará o nome de usuário da pessoa que está conectada diretamente ao computador (sessão no console). Se o usuário estiver conectado remotamente (por exemplo, Área de Trabalho Remota), o nome de usuário será vazio.

Ambos os comandos retornam o mesmo resultado, conforme mostrado abaixo. Se o usuário atual for uma conta de usuário de domínio, o comando retornará o domínio e o nome de usuário (domínio\nome de usuário). Mas para uma conta de usuário local, a saída seria computador\nome de usuário.

Querying WMI in PowerShell to Get Current Users

Get-WMIObject e Get-CimInstance possuem um parâmetro chamado -computerName, que aceita o nome do computador para consulta. Usar este parâmetro significa que você pode consultar as mesmas informações de uma máquina remota na rede.

Mas se você precisa obter apenas o nome de usuário sem o domínio, uma solução é dividir a saída usando o método split(). Para fazer isso, execute o comando abaixo no PowerShell.

# O comando abaixo vai dividir a propriedade do nome de usuário em dois, usando o caractere de barra invertida '\' como delimitador.
# A parte [1] no final indica ao comando para retornar apenas o resultado no índice 1.
# Índices começam com 0, o que significa que especificar o índice 1 vai mostrar o resultado na segunda posição.
((Get-WMIObject -ClassName Win32_ComputerSystem).Username).Split('\')[1]

Como resultado, o PowerShell retorna apenas a parte do usuário, como no screenshot abaixo.

Splitting the username property

Lendo as Variáveis de Ambiente do Windows

Outra maneira de usar o PowerShell para obter o usuário atual em um computador é recuperando valores das variáveis de ambiente. As variáveis de ambiente representam os dados do sistema operacional, incluindo o nome de usuário do usuário atual, entre outros.

Existem três maneiras de interagir com as variáveis de ambiente. Qualquer maneira que você escolha retornará o mesmo resultado.

O Env PowerShell Drive

O PowerShell armazena em cache as variáveis de ambiente e as torna disponíveis por meio de um Drive PowerShell (PSDrive) chamado drive Env:. Os PSDrives são locais de dados que você pode acessar como um drive no computador (por exemplo, C:), mas só são acessíveis dentro do PowerShell.

O PowerShell cria automaticamente a unidade Env: assim que você abre uma sessão do PowerShell. E como Env: é uma unidade, você pode obter seu conteúdo invocando o cmdlet Get-ChildItem, semelhante a como você listaria o conteúdo de uma unidade ou pasta do sistema de arquivos.

Usando a unidade Env: No PowerShell, obtenha o usuário atual executando o comando abaixo.

Get-ChildItem Env:\USERNAME

A captura de tela abaixo mostra o resultado esperado. Como você pode ver, o comando retorna o item USERNAME e seu valor correspondente, que é o usuário atualmente conectado.

Getting the Env:\USERNAME item

Para retornar apenas o valor do nome de usuário, modifique o comando conforme mostrado abaixo e execute-o novamente no PowerShell.

(Get-ChildItem Env:\USERNAME).Value

E como você pode ver abaixo, o comando retorna apenas o valor do nome de usuário como uma string.

Getting the Env:\USERNAME value

A Variável $env

Além de acessar as variáveis de ambiente como um PSDrive, tratando-as como arquivos em uma unidade, outra maneira é acessar a unidade Env como uma variável. Ou seja, você pode fazer referência às variáveis de ambiente usando a sintaxe abaixo.

# O sinal $ indica uma variável
# env é a unidade Env
# <variável> é o nome da variável que deseja obter
$env:<variable>

Com base na sintaxe mencionada, execute o comando abaixo no PowerShell para obter o usuário atual.

$env:username

Conforme mostra a captura de tela abaixo, o comando retorna o valor do nome de usuário.

Getting the username variable value

A Classe Environment do .NET

O PowerShell é uma linguagem e shell orientados a objetos. Essencialmente, tudo com que você trabalha no PowerShell é um objeto. Quando você executa um comando, a saída é um objeto. Se você declarou uma variável, essa variável é um objeto em si. Você entendeu a ideia.

Esses objetos têm uma estrutura que define o tipo de dado que representam, semelhante a plantas baixas. E essas plantas baixas são chamadas de classes .NET ou simplesmente classes.

Quanto às variáveis de ambiente, a classe associada a elas é a classe Environment. Então, como você utiliza a classe Environment no PowerShell para obter o usuário atual?

Assim como a variável $env, a classe Environment possui uma propriedade Username, cujo valor é o nome de usuário atual. Para obter o valor da propriedade username, execute o comando abaixo no PowerShell.

[System.Environment]::UserName
Getting the environment username property value

Além da propriedade Username, a classe Environment também possui um método para obter o valor de uma variável de ambiente. O nome desse método é GetEnvironmentVariable.

Para obter o usuário atual usando esse método, execute o comando abaixo.

[System.Environment]::GetEnvironmentVariable('username')
Getting the environment variable value

Usando a classe .NET WindowsIdentity.

A classe WindowsIdentity é outra classe .NET que você pode invocar no PowerShell para obter o usuário atual. Esta classe possui um método chamado GetCurrentName, que retorna um objeto que representa o usuário atual do Windows.

Para obter os detalhes do usuário atual, execute o comando abaixo.

[System.Security.Principal.WindowsIdentity]::GetCurrent()

Como você pode ver abaixo, o comando retorna as propriedades do objeto do usuário atual, incluindo a propriedade Name. O formato do valor da propriedade Name segue a convenção domínio\usuário.

Getting the current Windows user

Para retornar apenas a parte do nome de usuário, modifique o comando anterior para selecionar apenas a propriedade Name e aplicar a técnica de divisão de strings. Para fazer isso, copie o comando abaixo e execute-o no PowerShell.

([System.Security.Principal.WindowsIdentity]::GetCurrent().Name).Split('\')[1]
Returning only the username part

Usando o Comando whoami

Outro comando útil que permite obter rapidamente o usuário atual é o comando whoami. Este comando é um arquivo executável que você pode encontrar na pasta %WINDIR%\System32 com o nome de arquivo whoami.exe.

Para obter o nome de usuário do usuário atual, execute o comando abaixo.

whoami

O comando então retorna o resultado no formato domínio nome de usuário, como na captura de tela abaixo.

Getting the username using whoami

Para obter o nome de usuário sem o domínio, aplique a técnica de divisão de strings que você aprendeu anteriormente neste tutorial, executando o comando abaixo.

(whoami).Split('\')[1]
Getting the username without the domain

O comando whoami também pode retornar o nome distinto totalmente qualificado (FQDN) e o nome principal do usuário (UPN) atual. Essa saída de comando pode ser útil se você pretende executar um script que obtenha a identidade atual do usuário além do nome de usuário.

Execute o comando abaixo no PowerShell para obter o FQDN e UPN do usuário atual.

# Obter o FQDN do usuário atual
whoami /fqdn

# Obter o UPN do usuário atual
whoami /upn
Getting the current user’s FQDN and UPN

Nota: Os valores de FQDN e UPN estão disponíveis apenas se o usuário atualmente conectado for um usuário de domínio. Se você tentar obter esses valores para um usuário local, o comando retornará um erro, como mostrado abaixo.

Error getting the UPN and FQDN of a non-domain user account

Usando o comando query

Se você é um administrador de sistema ou um usuário de domínio, é provável que tenha se conectado a uma máquina remota via Protocolo de Área de Trabalho Remota (RDP) pelo menos uma vez, talvez para gerenciar recursos ou usar aplicativos. Qualquer que seja o motivo, você gostaria de saber quem está atualmente conectado e usando os recursos do sistema.

Felizmente, o Windows possui uma ferramenta de linha de comando integrada chamada query que pode listar todos os usuários atualmente conectados a um computador. O comando também mostra se o usuário fez login por meio de uma sessão de área de trabalho remota ou localmente no computador.

O comando query possui dois parâmetros pertinentes para obter os usuários conectados; session e user. O parâmetro session lista as sessões do computador, enquanto o parâmetro user lista os usuários e suas sessões.

O comando query session possui um alias chamado qwinsta, enquanto o alias de comando para query user é quser.

Por exemplo, execute o comando abaixo para listar as sessões em DC1.

# sessões de consulta em DC1
qwinsta /server:dc1

A captura de tela abaixo mostra a saída do comando. Neste exemplo, dois usuários fizeram login no computador DC1 – um na sessão do console e outro via RDP. Como você pode ver, o qwinsta retorna todas as sessões, mesmo aquelas não relacionadas a usuários.

Querying sessions

Se você executar o qwinsta ou o quser sozinho, sem o argumento /server:<computador>, ambos os comandos consultarão o computador local por padrão.

Em seguida, para listar todos os usuários com sessões de login existentes, execute o comando user abaixo.

# consultar usuários no DC1
quser /server:dc1

Depois de executar o comando, você notará imediatamente que o quser retorna as sessões e os usuários como o comando qwinsta. Mas desta vez, não há sessões em branco.

Também existem duas colunas adicionais: TEMPO DE INATIVIDADE, que mostra o tempo de inatividade dos usuários, e HORA DE LOGIN mostrando o horário de login dos usuários.

Querying users

No final, comparando os resultados do qwinsta e do quser, quser é o comando mais apropriado no PowerShell para obter usuários atuais.

Você tem senhas comprometidas no seu Active Directory? Descubra com Specops Password Auditor Free.

Conclusão

Embora existam muitas maneiras no PowerShell de obter os usuários atualmente conectados, qual método é melhor depende do resultado que você pretende obter e como você vai usá-lo.

Os cmdlets nativos relacionados ao WMI e o comando query permitem que você obtenha os usuários conectados em um computador local ou remoto. Usar classes .NET e variáveis de ambiente oferece maneiras rápidas de obter os mesmos resultados, mas apenas no computador local.

Se você planeja executar um script ou exibir manualmente os resultados na tela, existe um método que atenderia aos seus requisitos para usar o PowerShell para obter o usuário atual. E depois? Talvez aprender como analisar os resultados do comando de consulta e convertê-los em objetos do PowerShell escrevendo funções com RegEx?

Source:
https://adamtheautomator.com/powershell-get-current-user/