La meilleure façon de trouver l'ordinateur à partir duquel un utilisateur s'est connecté pour la dernière fois?

23

J'espère que quelque part dans Active Directory, la "dernière connexion depuis [ordinateur]" est écrite / stockée, ou qu'il existe un journal que je peux analyser?

Le but de vouloir connaître le dernier PC connecté est d'offrir une assistance à distance sur le réseau - nos utilisateurs se déplacent assez rarement, mais j'aimerais savoir que tout ce que je consulte mettait à jour ce matin (lorsqu'ils se sont connectés , vraisemblablement) au minimum.

J'envisage également des scripts de connexion qui écrivent les noms d'utilisateur et d'ordinateur à un emplacement connu que je peux référencer, mais certains de nos utilisateurs n'aiment pas se déconnecter pendant 15 jours à la fois.

S'il existe une solution élégante qui utilise des scripts de connexion, mentionnez-la certainement - mais si cela fonctionne pour simplement déverrouiller la station, ce serait encore mieux!

Garrett
la source

Réponses:

26

Dans le cadre de notre script de connexion, j'ai cette information (et plus) connectée à un partage caché sur un serveur, avec un fichier journal par utilisateur. Un script de déconnexion ajoute l'heure à laquelle l'utilisateur s'est déconnecté du même fichier journal. Facile à installer, sans frais et les informations sont là dans un format facile à lire.

John Gardeniers
la source
De plus, en ajoutant au journal, vous obtenez un enregistrement historique, qui peut parfois être très pratique.
John Gardeniers
1
Mis en œuvre pour l'instant, il passera probablement à un vbs avec plus de fonctionnalités à l'avenir :) Jusqu'à présent, en utilisant un script de connexion par lots TRÈS simple: echo% date%,% time%,% username%, logon,% computername% >> \\ serveur \ ouverture de session $ \ logons.csv Ouvrez avec Excel et vous êtes prêt!
Garrett
Le script de connexion s'exécute-t-il en tant qu'utilisateur, auquel cas l'utilisateur peut également entrer et modifier le journal?
James Yale
@James, c'est pourquoi j'utilise caché un partage caché pour stocker les journaux. Bien sûr, cela dépendra de la compétence de vos utilisateurs, car l'emplacement peut être obtenu en lisant simplement le script. Je n'ai pas ce problème avec mon ensemble actuel d'utilisateurs. :)
John Gardeniers
1
J'ai fait quelque chose de similaire, sauf que le script de connexion a appelé un service Web qui a mis à jour une base de données. La base de données avait une interface Web pour afficher l'état actuel. Cependant, c'était problématique pour les utilisateurs mobiles.
Nic
10

Nous le faisons via un script de connexion qui met à jour la description de l'objet ordinateur dans AD.

Vous devez effectuer une délégation de contrôle personnalisée pour permettre aux "utilisateurs authentifiés" d'écrire la propriété de description des objets ordinateur dans le ou les domaines.

Une fois cela fait, tout ce dont vous avez besoin est un script qui génère les informations souhaitées et écrit les propriétés dans l'objet ordinateur. Ce script est ensuite attribué en tant que script de connexion via un objet de stratégie de groupe lié au domaine.

Nous mettons un horodatage, nom d'utilisateur, IP (s) dans le champ de description. L'horodatage vient en premier car il permet de voir facilement les "anciens" objets informatiques en les triant dans le champ de description.

Voici le script que j'ai écrit pour cela si vous voulez l'utiliser comme point de départ:

On Error Resume Next

Set objSysInfo = CreateObject("ADSystemInfo") 'Bind to AD
Set objNet = CreateObject("WScript.Network")

strCompDN = objSysInfo.ComputerName 'DN for computer, e.g. "CN=VISTAWORKSTATION,OU=Child OU Name,OU=Parent OU Name,DC=domain,DC=com"
Set objComp = GetObject("LDAP://" & strCompDN) 'IADsComputer object

strUserDN = objSysInfo.UserName 'DN for user, e.g. "CN=John Smith,OU=Child OU Name,OU=Parent OU Name,DC=domain,DC=com"
Set objUser = GetObject("LDAP://" & strUserDN) 'IADsUser object

strUsrLogin = LCase(objNet.UserName)

strNow = Now
strDateStamp = DatePart("yyyy",strNow) & _
    Right("0" & DatePart("m",strNow), 2) & _
    Right("0" & DatePart("d",strNow), 2) & _
    "@" & _
    Right("0" & DatePart("h",strNow), 2) & _
    Right("0" & DatePart("n",strNow), 2)

'RegExp object used to perform a simple match on IP address
Set objRE = New RegExp
objRE.IgnoreCase = True
'Note this regexp pattern isn't "correct" for matching an IPv4 address properly, but since WMI will return an
'array of IP addresses, this is sufficient to distinguish IPv4 vs IPv6
objRE.Pattern = "^\d+\.\d+\.\d+\.\d+$"

strIP = ""

'Connect to WMI and retreive all network adapters
Set objWMI = GetObject("winmgmts:")
Set colNICs = objWMI.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration")

'Get the IP(s) assigned to whichever network adapter has our default gateway
If colNICs.Count > 0 Then
    For Each objNIC in colNICs
        If IsArray(objNIC.DefaultIPGateway) Then
            arrIP = objNIC.IPAddress
            For i = 0 To UBound(arrip)
                If objRE.Test(arrIP(i)) Then strIP = strIP & " " & arrIP(i)
            Next
            strMAC = objNIC.MACAddress
        End If  
    Next
End If

strIP = Trim(strIP)

objComp.Description = strDateStamp & " " & strUsrLogin & " " & strIP
objComp.Put "extensionAttribute1", strUsrLogin
objComp.Put "extensionAttribute2", strIP
objComp.Put "extensionAttribute3", strMAC

objComp.SetInfo
ThatGraemeGuy
la source
Comment déléguer explicitement les autorisations d'écriture des utilisateurs authentifiés à l'objet champ de description dans AD?
NULL.Dude
6

J'ai dû atteindre le même résultat pour des raisons similaires; déterminer en quelque sorte à partir de quelle machine un utilisateur spécifique s'est connecté. Je voulais savoir "avant le fait", et je ne pouvais pas changer les scripts de connexion utilisateur comme discuté ci-dessus.
J'ai utilisé PowerShell sur le contrôleur de domaine contre lequel l'utilisateur s'authentifiait pour analyser le journal des événements de sécurité:

get-eventlog "Security" | where {$_.Message -like "*Username*" -AND "Source Network Address"} | export-csv C:\Temp\test.csv

Ouvrez le fichier .csv avec Excel ou votre éditeur fav et recherchez l'entrée la plus récente qui affiche à la fois le nom du compte (nom d'utilisateur) et l'adresse réseau source dans le même événement.
Ce n'est peut-être pas une solution fiable à 100% (en fonction des durées de location DHCP, etc.), mais cela a fonctionné pour moi.

marcusjv
la source
6

Vous pouvez activer l'audit des événements de connexion au compte. Ces événements (y compris le déverrouillage du poste de travail) seront stockés dans le journal de sécurité du contrôleur de domaine.

Il existe également des outils tiers qui peuvent vous faciliter la tâche, comme True Last Logon .

Adam Brand
la source
4

J'écris simplement le nom d'utilisateur (ainsi que d'autres informations, comme la date et l'heure, certaines versions de programme, etc.) dans la description de l'ordinateur à l'aide d'un script de connexion. De cette façon, je peux extraire toutes les informations des utilisateurs et des ordinateurs AD rapidement et facilement, et en bonus, j'ai un bon moyen d'identifier quels PC encore dans AD n'ont pas été utilisés depuis longtemps (et sont donc probablement des machines mortes).

Maximus Minimus
la source
3

ThatGraemeGuy , merci pour l'excellent script! J'ai dû le réécrire dans PowerShell, mais cela fonctionne toujours.

$CompDN = "(&(objectCategory=computer)(objectClass=computer)(cn=$env:COMPUTERNAME))"
$strCompDN = [string]([adsisearcher]$CompDN).FindOne().Properties.distinguishedname
$objComp = [ADSI]("LDAP://"+$strCompDN)

# quit if computer is a server or DC
if (($strCompDN -like '*Controller*') -or ($strCompDN -like '*SERVER*')) { exit }

$strUsrLogin = $env:username
$strDateStamp = Get-Date -f 'yyyy-MM-dd@HH:mm'
$IPPattern = "^\d+\.\d+\.\d+\.\d+$"

$colNICs = gwmi Win32_NetworkAdapterConfiguration
if ($colNICs.Count -gt 0) {
foreach ($objNIC in $colNICs){
        if ($objNIC.DefaultIPGateway) {
            $arrIP = $objNIC.IPAddress
            for ($i=0; $i -lt $colNICs.Count; $i++) { 
            if ($arrIP[$i] -match $IPPattern) { $strIP = $arrIP[$i]; $strMAC = $objNIC.MACAddress }
            }
        }
    }
}

$objComp.Description = $strDateStamp + " - " + $strUsrLogin + " - " + $strIP
$objComp.extensionAttribute1 = $strUsrLogin
$objComp.extensionAttribute2 = $strIP
$objComp.extensionAttribute3 = $strMAC
$objComp.SetInfo()
Matvey Solodovnikov
la source
2

L'astuce pour savoir avec certitude où les utilisateurs se sont connectés pour la dernière fois en dehors des suggestions d'Adam est l'agrégation des journaux. Si vous avez plusieurs contrôleurs de domaine, vous devez tous les vérifier, ou centraliser votre journalisation, puis vérifier le journal unique.

Certains, voire la plupart, des outils tiers sont suffisamment intelligents pour interroger tous les contrôleurs de domaine. Mais si vous songez à écrire un script pour l'analyser vous-même, je ne peux pas argumenter suffisamment pour la centralisation de vos journaux.

Laura Thomas
la source
1

Idéalement, vous captureriez les éléments suivants pour que votre équipe CSIRT aide aux invstigations.

ID utilisateur se connectant avec le nom du poste de travail Adresse MAC Adresse IP Type de connexion date / horodatage (rdp, interfactive, etc.)

Puis transférez cela dans une commande sql dans une base de données qu'ils peuvent interroger. Les bits et les morceaux sont enregistrés partout, mais l'enregistrement cela permet d'économiser du temps en tirant les données des serveurs DHCP / WINS, etc.


la source
1
Je pense que c'est un peu exagéré pour "Hey, quel est le nom d'ordinateur de Donny?" mais peut-être qu'un jour nous serons à ce niveau: P
Garrett
0

La seule façon d'avoir des informations très récentes est par le biais de la recherche de journaux. Utilisez un outil comme Microsoft Operations Manager ou un outil gratuit comme snare pour agréger des journaux d'événements intéressants du serveur à un emplacement central (fichiers texte normaux ou base de données SQL), puis utilisez des outils comme logparser ou des requêtes SQL pour générer le rapport que vous souhaitez.

pour trouver différents ID d'événement pour différents événements, consultez l' Encyclopédie du journal des événements

Faites-moi savoir, si vous souhaitez suivre cette route, je peux vous aider à créer les requêtes appropriées pour logparser.

KAPes
la source
0

Si vous recherchez une référence historique, vous pouvez essayer un outil tiers comme Logon Central de Motivate Systems. Il enregistre toutes les ouvertures de session utilisateur Active Directory et fournit une interface Web pour l'exploration de données. Il comprend également de très bons graphiques qui traduisent les statistiques de connexion en pourcentage d'utilisation.


la source
0

ind Connexion dans AD

Plusieurs fois, nous devons savoir si une connexion particulière fait partie d'un groupe d'utilisateurs d'annonces. Ou parfois, nous devons connaître un groupe AD et nous voulons savoir qui toutes les connexions en font partie.

Il existe de nombreuses façons d'y parvenir.

Je suis cette étape pour créer un raccourci sur mon bureau où je peux facilement trouver les connexions Veuillez suivre le processus comme

START-> RUN -> rundll32 dsquery, OpenQueryWindow

Vous pouvez trouver tous les AD dont vous faites partie en utilisant ceci.

Démarrer-> Paramètres-> Panneau de configuration -> Outils d'administration -> Utilisateurs et ordinateurs Active Directory Sélectionnez le domaine que vous souhaitez rechercher, cliquez avec le bouton droit sur ce domaine et choisissez l'option «Rechercher».

Lepide
la source
0

J'allais ajouter ceci en tant que commentaire à la réponse de marcusjv ci-dessus, mais je n'ai pas la réputation, donc une réponse distincte devra faire:

Dans cette expression -AND "Source Network Address" sera toujours évalué à TRUE

Je pense que ce dont vous avez besoin est: get-eventlog "Security" | où {$ .Message -like "* nom d'utilisateur *" -AND $ .Message.contains ("Source Network Address")}

SS64
la source