Pular para o conteúdo principal

Active Directory - Listar computadores que não se comunicaram com o domínio com o powershell.

 




Como administrador de Active Directory, você pode usar o PowerShell para listar computadores que não se comunicaram com o domínio nos últimos dias. Isso é útil para identificar contas de computador obsoletas que podem precisar ser desativadas ou excluídas para manter a segurança e a higiene do AD.

No exemplo colocamos 60 dias, mas você pode escolher o tempo. 

# **************** inicio *********************

# Define o número de dias de inatividade

$DaysInactive = 60


# Calcula a data de corte (60 dias atrás a partir de hoje)

$CutoffDate = (Get-Date).AddDays(-$DaysInactive)


# Define o caminho para exportar a lista de computadores inativos

$ExportPath = "C:\Temp\InactiveComputers_$((Get-Date).ToString('yyyyMMdd')).csv"


# Importa o módulo ActiveDirectory (se ainda não estiver importado)

Import-Module ActiveDirectory -ErrorAction SilentlyContinue


Write-Host "Procurando computadores que não fizeram logon no domínio nos últimos $DaysInactive dias..."

Write-Host "Data de corte: $($CutoffDate.ToString('dd/MM/yyyy HH:mm:ss'))"

Write-Host ""


try {

    # Obtém todos os objetos de computador e filtra pelo LastLogonDate

    $InactiveComputers = Get-ADComputer -Filter {LastLogonDate -lt $CutoffDate} -Properties Name, LastLogonDate, OperatingSystem, DistinguishedName |

        Sort-Object LastLogonDate


    # Verifica se foram encontrados computadores inativos

    if ($InactiveComputers) {

        Write-Host "Os seguintes computadores não fizeram logon no domínio nos últimos $DaysInactive dias:"

        Write-Host "---------------------------------------------------------------------------------------------------"

        $InactiveComputers | Format-Table Name, LastLogonDate, OperatingSystem -AutoSize

        Write-Host "---------------------------------------------------------------------------------------------------"


        # Exporta a lista para um arquivo CSV

        Write-Host "`nExportando a lista para: $ExportPath"

        $InactiveComputers | Select-Object Name, LastLogonDate, OperatingSystem, DistinguishedName | Export-Csv -Path $ExportPath -NoTypeInformation -Encoding UTF8


        Write-Host "`n********************************************************************************"

        Write-Host "* A T E N Ç Ã O: Comando de exclusão de computadores inativos COMENTADO!   *"

        Write-Host "* *"

        Write-Host "* Revise a lista de computadores no arquivo CSV ($ExportPath) com MUITO        *"

        Write-Host "* cuidado antes de prosseguir com a exclusão.                                 *"

        Write-Host "* *"

        Write-Host "* Para EXCLUIR os computadores listados, DESCOMENTE as linhas abaixo e execute *"

        Write-Host "* o script novamente.                                                          *"

        Write-Host "********************************************************************************"

        Write-Host ""


        # =========================================================================================

        # INÍCIO DO BLOCO DE EXCLUSÃO - DESCOMENTE COM CAUTELA EXTREMA

        # =========================================================================================

        # Read-Host "Pressione Enter para iniciar a exclusão dos computadores listados. (Ctrl+C para cancelar)"


        # foreach ($computer in $InactiveComputers) {

        #    Write-Host "Excluindo computador: $($computer.Name) (DN: $($computer.DistinguishedName))"

        #    try {

        #        Remove-ADComputer -Identity $computer.DistinguishedName -Confirm:$false

        #        Write-Host "Computador $($computer.Name) excluído com sucesso." -ForegroundColor Green

        #    } catch {

        #        Write-Warning "Falha ao excluir o computador $($computer.Name): $($_.Exception.Message)"

        #    }

        # }

        # =========================================================================================

        # FIM DO BLOCO DE EXCLUSÃO

        # =========================================================================================


    } else {

        Write-Host "Nenhum computador encontrado que não tenha feito logon nos últimos $DaysInactive dias."

    }


} catch {

    Write-Error "Ocorreu um erro ao consultar o Active Directory: $($_.Exception.Message)"

    Write-Host "Certifique-se de que o módulo ActiveDirectory esteja instalado e que você tenha permissões adequadas."

}


Write-Host "`nScript concluído."

# ***************** fim **************************

Como usar o script:

  1. Abra o PowerShell como Administrador: Isso é importante para ter as permissões necessárias para consultar o Active Directory.
  2. Copie e cole o script: Cole o código acima na janela do PowerShell.
  3. Execute o script: Pressione Enter.

Explicação do Script:

  • $DaysInactive = 60: Define o número de dias de inatividade que você deseja verificar. Você pode alterar esse valor conforme sua política.
  • $CutoffDate = (Get-Date).AddDays(-$DaysInactive): Calcula a data exata 60 dias atrás a partir da data e hora atuais. Qualquer LastLogonDate anterior a essa data será considerado inativo.
  • Import-Module ActiveDirectory: Garante que o módulo do Active Directory esteja carregado. Ele é essencial para os cmdlets Get-ADComputer. Se você tiver o PowerShell ISE ou VS Code, ele geralmente é carregado automaticamente quando você usa um cmdlet do AD.
  • Get-ADComputer -Filter {LastLogonDate -lt $CutoffDate} -Properties Name, LastLogonDate, OperatingSystem, DistinguishedName:
    • Get-ADComputer: Este cmdlet é usado para obter objetos de computador do Active Directory.
    • -Filter {LastLogonDate -lt $CutoffDate}: Este é o filtro principal. Ele busca por computadores onde a propriedade LastLogonDate (data do último logon) é menor que a $CutoffDate calculada.
    • -Properties Name, LastLogonDate, OperatingSystem, DistinguishedName: Especifica quais propriedades dos objetos de computador você deseja recuperar. Por padrão, Get-ADComputer retorna apenas um subconjunto de propriedades. LastLogonDate é uma propriedade construída que o PowerShell cria a partir do LastLogonTimeStamp (um atributo de carimbo de data/hora no formato FileTime que precisa ser convertido). OperatingSystem e DistinguishedName são úteis para mais contexto.
    • Sort-Object LastLogonDate: Ordena os resultados pela data do último logon.
  • Format-Table Name, LastLogonDate, OperatingSystem -AutoSize: Exibe os resultados em um formato de tabela fácil de ler, ajustando as colunas automaticamente.
  • Export-Csv -Path $ExportPath -NoTypeInformation -Encoding UTF8: Opcionalmente, exporta a lista de computadores inativos para um arquivo CSV.
    • $ExportPath: Define o caminho e o nome do arquivo CSV. Ele incluirá a data atual no nome do arquivo para evitar sobrescrever.
    • -NoTypeInformation: Impede que o PowerShell adicione uma linha de informações de tipo no início do arquivo CSV, tornando-o mais limpo.
    • -Encoding UTF8: Garante que caracteres especiais sejam tratados corretamente no CSV.
  • Tratamento de Erros (try-catch): Incluí um bloco try-catch básico para capturar erros, como se o módulo ActiveDirectory não puder ser carregado ou se houver problemas de permissão.

Considerações importantes:

  • Replication de LastLogonDate / LastLogonTimeStamp: O atributo LastLogonTimeStamp (do qual LastLogonDate é derivado) não é replicado imediatamente para todos os Controladores de Domínio. Ele é atualizado no Controlador de Domínio que autentica o logon e, em seguida, replicado para outros DCs após um certo período (por padrão, 14 dias + um atraso de 5 dias). Isso significa que a data do último logon pode não ser 100% precisa em todos os DCs, mas é geralmente suficiente para identificar contas inativas após 60 dias. Para uma precisão ainda maior, você precisaria consultar todos os Controladores de Domínio e pegar a data mais recente. No entanto, para 60 dias, a abordagem de LastLogonDate é geralmente aceitável.
  • Permissões: O usuário que executa o script precisa ter permissões de leitura no Active Directory. Um administrador de domínio geralmente tem essas permissões.
  • Localização do arquivo CSV: O script tenta exportar o CSV para C:\Temp\. Certifique-se de que essa pasta exista ou altere o caminho para um local onde você tenha permissão de escrita.
  • Bloco de Exclusão (COMENTADO):

    • Adicionado um bloco foreach ($computer in $InactiveComputers) que itera sobre cada computador inativo encontrado.
    • Remove-ADComputer -Identity $computer.DistinguishedName -Confirm:$false: Este é o cmdlet para remover um objeto de computador do Active Directory.
      • -Identity $computer.DistinguishedName: Especifica o objeto a ser removido pelo seu DistinguishedName, que é um identificador único e completo.
      • -Confirm:$false: MUITO IMPORTANTE! Por padrão, Remove-ADComputer solicita confirmação para cada exclusão. Confirm:$false suprime esse prompt. Use isso com extrema cautela, pois significa que os computadores serão excluídos sem um prompt individual. Se você preferir ser perguntado para cada exclusão, remova -Confirm:$false (mas isso pode ser tedioso para muitas contas).
    • Incluído tratamento de erros (try-catch) dentro do loop para cada exclusão, para que o script não pare se uma exclusão falhar.
    • Mensagens informativas sobre o status da exclusão.
  • Mensagens de Aviso Adicionais:

    • Várias mensagens Write-Host foram adicionadas para enfatizar que o comando de exclusão está comentado e para orientar o usuário sobre a necessidade de revisão cuidadosa antes de descomentar.
  • Fluxo de Trabalho Recomendado para Exclusão:

    1. Execute o script como está (com a parte de exclusão comentada).
    2. Analise cuidadosamente o arquivo CSV gerado (C:\Temp\InactiveComputers_YYYYMMDD.csv). Verifique se não há nenhum computador que você precise manter ativo.
    3. Se estiver satisfeito com a lista, edite o script PowerShell:
      • Remova os símbolos # das linhas dentro do bloco "INÍCIO DO BLOCO DE EXCLUSÃO" e "FIM DO BLOCO DE EXCLUSÃO".
      • Você pode optar por descomentar a linha Read-Host "Pressione Enter para iniciar a exclusão..." se quiser uma pausa final antes da exclusão.
    4. Execute o script novamente (com a parte de exclusão descomentada).

    Lembre-se: Gerenciar objetos inativos é uma boa prática de segurança, mas a automação da exclusão exige um planejamento e validação rigorosos.

Este script é uma ótima base para começar a identificar e gerenciar contas de computador inativas no seu ambiente AD.

Desejo sucesso em sua jornada.



Comentários

Postagens mais visitadas deste blog

O que são FSMO - Flexible Single-Master Operation.

O Active Directory ou apenas AD é  o repositório central no qual todos os objetos de uma rede de computadores empresarial e seus respectivos atributos são armazenados. É um banco de dados hierárquico que pode armazenar milhões de objetos e as alterações nestes objetos podem ser processadas por qualquer servidor do AD, chamados de  controladores de domínio* . *No dia a dia de trabalho, muitas vezes nos referimos aos controladores de domínio, pelo termo em inglês, Domain Controller ou a sua sigla, DC. Leia também:  Active Directory e Microsoft Entra ID: A base do gerenciamento de identidade e acesso. As funções FSMO desempenham um papel fundamental na integridade do AD.  O Active Directory  fornece a flexibilidade de permitir que as alterações ocorram em qualquer controlador de domínio e a maneira que o AD lida com atualizações conflitantes é ter um algoritmo de resolução de conflitos, no qual as últimas alterações gravadas prevalecem.   Embora esse méto...

Como transferir as FSMO no Windows Server

Um dos maiores medos de um administrador é perder os controladores de domínio que tem as FSMO - Flexible Single-Master Operation, m as não se preocupe tanto, porque há como transferi-las, mesmo perdendo definitivamente o servidor. Neste tutorial vamos abordar exclusivamente a transferência das FSMO com o utilitário Ntdsutil.exe pelo prompt de comando. Antes de transferir as FSMO, lembre-se que: A possibilidade de transferência não exclui a necessidade de backup dos Windows Servers do Active Directory. Recomenda-se manter as funções Domain Naming Master e Schema Master no mesmo DC, que deve ser um  servidor  de Catálogo Global (GC) simultaneamente; Se você perdeu o servidor com a função Schema Master, poderá   atribuir essa função a qualquer outro controlador de domínio   .  Mas tenha em mente que o Schema Master original não deverá aparecer na rede depois disso; Se você chegou aqui e não sabe o que são FSMO e a importância de cada uma das funções, leia o artig...

Como obter sua chave do produto do Windows com o prompt de comando.

Se quiser obter sua chave do produto do Windows 10 ou do Windows 11, a maneira mais fácil de fazer é com o prompt de comando do Windows. O que é a chave do produto do Windows? Uma chave do produto ou licença do Windows é um código de 25 caracteres,   formatada como "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX", que a Microsoft fornece para ativar uma única cópia do Windows em um computador. A chave do produto de ativação do Windows 10 é essencial se você deseja atualizar ou instalar o sistema de forma limpa. No entanto, muitos usuários não têm ideia de onde a chave está armazenada. Esse artigo vai ajudar a encontra-la. Vamos lá !! Primeiro, pressione a tecla Windows, procure por "cmd" e clique em "Run as administrator" (Executar como administrador, em português): Em seguida, execute o comando abaixo: wmic path softwarelicensingservice get OA3xOriginalProductKey Ou execute o comando em powershell: powershell "(Get-WmiObject -query ‘select * from SoftwareLicensingSer...