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

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

Você tem senhas comprometidas em 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 que você aprenderá incluirão comandos nativos, classes .NET e cmdlets específicos do Windows Management Instrumentation (WMI).

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

Pré-requisitos

Neste tutorial, você aprenderá melhor seguindo os exemplos. E para fazer 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 com Windows Server 2019 chamado DC1.

Por que usar o PowerShell para obter os usuários atuais conectados a um computador?

1. Admito que existem maneiras de obter usuários atuais conectados a um computador sem usar o PowerShell. Afinal, os administradores do sistema precisavam ter uma maneira de fazer isso mesmo antes do PowerShell, certo?

Fazer a mesma tarefa no PowerShell oferece benefícios 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 razões para usar o PowerShell para obter usuários atuais, mas o resultado final se resume às suas necessidades. E este tutorial irá ensinar as diferentes maneiras de alcançar esse objetivo.

Consultando a 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 logado, usando as classes de Windows Management Instrumentation (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 recente e seguro, disponível até as últimas versões 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 qualquer 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

Nota: Consultar a classe Win32_ComputerSystem irá retornar apenas o nome de usuário da pessoa que está logada no computador diretamente (sessão no console). Se o usuário estiver logado remotamente (por exemplo, Remote Desktop), o nome de usuário estará em branco.

Ambos os comandos retornam o mesmo resultado, como 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ê precisar 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 dividirá a propriedade de nome de usuário em dois usando o caractere de barra invertida '\' como delimitador.
# A parte [1] no final informa ao comando para retornar apenas o resultado no índice 1.
# Os índices começam com 0, o que significa que especificar o índice 1 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 na captura de tela 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 é recuperar valores das variáveis de ambiente. As variáveis de ambiente representam os dados do sistema operacional, incluindo o nome de usuário atual, entre outros.

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

O Env PowerShell Drive

PowerShell armazena em cache as variáveis de ambiente e as disponibiliza por meio de um PowerShell Drive (PSDrive) chamado Env: drive. PSDrives são locais de dados que você pode acessar como uma unidade 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, de forma semelhante à listagem do 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 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 uma unidade PSDrive tratando-as como arquivos em uma unidade, outra maneira é acessar a unidade Env como uma variável. Isso significa que você pode fazer referência às variáveis de ambiente usando a sintaxe abaixo.

# O símbolo $ indica uma variável
# env é o drive Env
# <variável> é o nome da variável que você 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 de Ambiente .NET

O PowerShell é uma linguagem e shell orientado a objetos. Basicamente, tudo com que você trabalha dentro do 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 dados que representam, semelhante a projetos. E esses projetos são chamados 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 de nome de usuário, 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 do 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. Essa 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 de 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 aplique 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 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 de usuário (UPN) do usuário atual. A saída deste comando pode ser útil se você pretende executar um script que obtenha a identidade completa do usuário atual, 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 só estão disponíveis 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 do 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 desktop remoto 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 do comando query user é quser.

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

# consultar sessões 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, inclusive aquelas que não são de 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

Após executar o comando, você perceberá 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: IDLE TIME, que mostra o tempo ocioso dos usuários, e LOGON TIME, mostrando o timestamp de logon dos usuários.

Querying users

No final, comparando os resultados do qwinsta e 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

Enquanto existem muitas maneiras no PowerShell de obter os usuários atualmente conectados, qual método é o melhor depende do resultado que você pretende obter e de como pretende 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 formas 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 atenderá aos seus requisitos para usar o PowerShell e obter o usuário atual. E agora? Talvez aprender como analisar os resultados do comando de consulta e convertê-los em objetos PowerShell escrevendo funções com RegEx?

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