web-dev-qa-db-fra.com

Recherchez dans Active Directory les ordinateurs connectés au cours des 30 derniers jours

J'essaie de faire une recherche PowerShell dans AD pour trouver uniquement les ordinateurs (pas les serveurs ou autres) qui ont été connectés au cours des 30 derniers jours. J'ai écrit la plupart du script à l'exception de la limite de 30 jours. Toute aide serait grandement appréciée.

Get-ADComputer -Filter * -Properties * | Nom FT, OperatingSystem, LastLogonDate -Autosize | Fichier sortant C:\Temp\ComputerLastLogonDate.csv

7
Norrec

Get-ADComputer -Filter * -Properties *

Obtenez seulement les propriétés que vous avez l'intention d'utiliser ... c'est plus efficace. La récupération de toutes les propriétés de tous les ordinateurs du domaine lorsque vous n'avez pas vraiment besoin de toutes les propriétés demande inutilement à votre contrôleur de domaine. C'est du gaspillage.

Get-ADComputer -Filter * -Properties OperatingSystem, LastLogonDate Est meilleur, car vous n'avez pas besoin de tous les propriétés. (La propriété 'Name' est toujours incluse.)

| Nom FT, OperatingSystem, LastLogonDate -Autosize

Ne formatez la sortie qu'à la fin. En d'autres termes, Format-Table et Format-List doivent être les applets de commande très finales dans la chaîne entière d'applets de commande vers lesquelles les données sont acheminées.

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

C'est un peu mieux, mais il y a encore une certaine inefficacité, car vous récupérez toujours un ensemble de données de tous ordinateurs ... vous pouvez laisser le contrôleur de domaine faire le filtrage pour vous.

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

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

La raison pour laquelle j'ai utilisé le lastLogonTimeStamp là-bas (qui est une "heure de fichier", pas un .NET DateTime), est parce que "LastLogonDate" n'est pas un véritable attribut LDAP. LastLogonDate est simplement le moyen utile de PowerShell de convertir automatiquement l'attribut lastLogonTimestamp pour vous. lastLogonTimestamp est l'attribut LDAP "réel".

Autoriser le contrôleur de domaine à vous renvoyer un ensemble filtré, au lieu de l'ensemble complet de TOUS les ordinateurs, signifie qu'il y a moins de données sur le câble et moins de données à traiter par PowerShell.

Notez également que vous allez devoir gérer des ordinateurs qui:

  • Avoir un (null) LastLogonDate
  • Avoir une LastLogonDate du 1/1/1601, ou le début de l'époque.
15
Ryan Ries

Votre commande ne filtre pas uniquement les postes de travail.

Vous devez utiliser le champ LastLogonTimeStamp pour pouvoir le filtrer facilement, puis le convertir en DateTime pour l'exportation.

Ces informations sont également facilement accessibles en ligne. Comme cet exemple ici, que j'ai légèrement modifié pour ne renvoyer que les postes de travail. Notez qu'ils interrogent uniquement les propriétés nécessaires. C'est plus efficace. De plus, je n'ai aucune idée pourquoi ils ont une variable $ domain dans ce script. Cela paraît complètement inutile.

# 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

Référencé à partir d'ici: https://gallery.technet.Microsoft.com/scriptcenter/Get-Inactive-Computer-in-54feafde

Voir également les références suivantes à ce sujet:

L'attribut LastLogonTimeStamp/pourquoi il a été conç

Conversion de TimeStamp en DateTime

2
Appleoddity

Cela devrait vous aider à démarrer dans la direction que vous souhaitez prendre.

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
0
Confusias

N'oubliez pas que LastLogonDate est une version convertie de LastLogonTimeStamp. LastLogonTimeStamp n'est pas la représentation la plus précise de l'heure de la dernière connexion réelle de l'ordinateur. Par défaut, il peut être désactivé de 14 jours. Plus d'informations - https://social.technet.Microsoft.com/wiki/contents/articles/22461.understanding-the-ad-account-attributes-lastlogon-lastlogontimestamp-and-lastlogondate.aspx

Si vous souhaitez obtenir une heure de connexion plus précise, vous devez utiliser l'attribut lastLogon, mais il n'est pas répliqué sur tous les contrôleurs de domaine, vous devez donc itérer tous vos contrôleurs de domaine pour obtenir la dernière valeur. Vous devez calculer la dernière heure de connexion et seulement alors vous pouvez la limiter aux "30/60/90 derniers jours".

Ici vous pouvez trouver un exemple de la façon dont cet algorithme est réalisé pour obtenir la dernière heure de connexion de l'utilisateur:

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

Il existe d'autres façons d'obtenir le même résultat plus facilement et plus rapidement. Vous pouvez essayer l'outil de création de rapports Active Directory - AD FastReporter Free . Il fera le calcul précis de la dernière connexion pour vous. Installez-le, allez dans l'onglet Ordinateurs et sélectionnez - "Ordinateurs qui se sont connectés au cours des 30 derniers jours", appuyez sur Générer. Le résultat comprendra également les serveurs DC DC, mais vous pouvez facilement les supprimer après exportation vers des fichiers .csv, .xlsx. P.S. Je suis le propriétaire et le développeur de cet outil.

0
Klavs