Procura no Active Directory por computadores logados, nos últimos 30 dias

7

Estou tentando fazer uma pesquisa do PowerShell do AD para encontrar apenas computadores (não servidores ou outros) que tenham efetuado login nos últimos 30 dias. Eu tenho a maior parte do roteiro escrito, exceto para a limitação de 30 dias. Qualquer ajuda seria muito apreciada.

Get-ADComputer -Filter * -Properties * | Nome FT, OperatingSystem, LastLogonDate -Autosize | Out-File C: \ Temp \ ComputerLastLogonDate.csv

    
por Norrec 04.10.2017 / 16:26

4 respostas

15

Get-ADComputer -Filter * -Properties *

Obtenha apenas as propriedades que você pretende usar ... é mais eficiente. Recuperar todas as propriedades de todos os computadores no domínio quando você realmente não precisa de todas as propriedades é desnecessariamente exigente em seu controlador de domínio. É um desperdício.

Get-ADComputer -Filter * -Properties OperatingSystem, LastLogonDate é melhor, pois você não precisa de todas as propriedades. (A propriedade 'Nome' está sempre incluída.)

| FT Name, OperatingSystem, LastLogonDate -Autosize

Não formate a saída até o final. Em outras palavras, Format-Table e Format-List devem ser os cmdlets muito finais em toda a cadeia de cmdlets para os quais os dados são canalizados.

Get-ADComputer -Filter * -Properties OperatingSystem, LastLogonDate | Where { $_.LastLogonDate -GT (Get-Date).AddDays(-30) }

Isso é um pouco melhor, mas ainda há alguma ineficiência, já que você ainda está recuperando um conjunto de dados de todos computadores ... você pode deixar o controlador de domínio fazer a filtragem para você.

$LastMonth = $(((Get-Date).AddDays(-30)).ToFileTime())

Get-ADComputer -LDAPFilter "(lastLogonTimeStamp>=$LastMonth)" -Properties OperatingSystem,LastLogonDate

A razão pela qual eu usei o lastLogonTimeStamp lá (que é um "tempo de arquivo", não um .NET DateTime,) é porque "LastLogonDate" não é um atributo LDAP real. LastLogonDate é simplesmente uma maneira útil do PowerShell de converter automaticamente o atributo lastLogonTimestamp para você. lastLogonTimestamp é o atributo LDAP "real".

Permitir que o controlador de domínio retorne um conjunto filtrado a você, em vez do conjunto completo de TODOS os computadores, significa que há menos dados sendo transmitidos e menos dados para o PowerShell processar.

Observe também que você terá que lidar com computadores que:

  • Tenha um (null) LastLogonDate
  • Tenha um LastLogonDate de 1/1/1601 ou o início da época.
por 04.10.2017 / 17:03
2

Seu comando não é filtrado apenas para estações de trabalho.

Você precisa usar o campo LastLogonTimeStamp para poder filtrá-lo facilmente e convertê-lo em um DateTime para exportação.

Esta informação também está prontamente disponível online. Como este exemplo aqui, eu modifiquei um pouco para retornar apenas as estações de trabalho. Observe que eles consultam apenas as propriedades necessárias. É mais eficiente. Além disso, não tenho ideia de por que eles têm uma variável de domínio $ neste script. Parece completamente inútil.

# Gets time stamps for all computers in the domain that have NOT logged in since after specified date 
# Mod by Tilo 2013-08-27 
import-module activedirectory  
$domain = "domain.mydom.com"  
$DaysInactive = 90  
$time = (Get-Date).Adddays(-($DaysInactive)) 

# Get all AD computers with lastLogonTimestamp less than our time 
Get-ADComputer -Filter {LastLogonTimeStamp -lt $time -and OperatingSystem -notlike "*server*"} -Properties LastLogonTimeStamp,OperatingSystem | 

# Output hostname and lastLogonTimestamp into CSV 
select-object Name,@{Name="Stamp"; Expression={[DateTime]::FromFileTime($_.lastLogonTimestamp)}} | export-csv OLD_Computer.csv -notypeinformation

Referenciado a partir daqui: link

Veja também as seguintes referências em relação a isso:

O atributo LastLogonTimeStamp / o que foi projetado para

Como converter o carimbo de data / hora em dateTime

    
por 04.10.2017 / 17:05
0

Isso deve começar na direção que você quer ir ...

Get-ADComputer -Properties * -Filter {
     Enabled -eq $True -and
     OperatingSystem -like 'Windows*' -and
     OperatingSystem -notlike "Windows Server*" -and
     OperatingSystem -notlike "Windows 7*"
} -SearchBase "DC=hhmtx,DC=org" | FT Name, OperatingSystem, LastLogonDate -Autosize | Out-File C:\Temp\ComputerLastLogonDate.csv
    
por 04.10.2017 / 16:57
0

Tenha em mente que LastLogonDate é uma versão convertida de LastLogonTimeStamp. LastLogonTimeStamp não é a representação mais precisa do tempo real do último logon do computador. Por padrão, ele pode estar desativado em 14 dias. Mais informações - link

Se quiser obter um tempo de logon mais preciso, você precisará usar o atributo lastLogon, mas ele não será replicado para todos os controladores de domínio, portanto, será necessário iterar todos os seus controladores de domínio para obter o valor mais recente. Você precisa calcular a hora do último logon e só então pode limitá-la a "últimos 30/60/90 dias".

Aqui você pode encontrar um exemplo de como esse algoritmo é realizado para obter o último horário de logon do usuário:

Import-Module ActiveDirectory

function Get-ADUserLastLogon([string]$userName)
{
$dcs = Get-ADDomainController -Filter {Name -like "*"}
$time = 0
foreach($dc in $dcs)
{
$hostname = $dc.HostName
$user = Get-ADUser $userName | Get-ADObject -Properties lastLogon
if($user.LastLogon -gt $time)
{
$time = $user.LastLogon
}
}
$dt = [DateTime]::FromFileTime($time)
Write-Host $username "last logged on at:" $dt }
Get-ADUserLastLogon -UserName username

Existem maneiras alternativas de obter o mesmo resultado de maneira mais fácil e rápida. Você pode tentar a ferramenta ativa do relatório do diretório - AD FastReporter Free . Ele fará o cálculo preciso do último logon para você. Basta instalá-lo, vá para a guia Computadores e selecione - "Computadores que se conectaram nos últimos 30 dias", pressione Gerar. O resultado também incluirá servidores DC, mas você poderá removê-los facilmente após a exportação para arquivos .csv, .xlsx. P.S. Eu sou o proprietário e desenvolvedor desta ferramenta.

    
por 05.10.2017 / 10:13