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 de proposer 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 simplement pour déverrouiller la station, ce serait encore mieux!
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.
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 toutes les informations que vous souhaitez 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
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 DC 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.
Vous pouvez activer l'audit pour les é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 faciliter cela, tels que True Last Logon .
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 les PC encore dans AD qui n'ont pas été utilisés depuis longtemps (et sont donc probablement des machines mortes).
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()
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.
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.)
Ensuite, videz 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.
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")}
ind Connexion dans AD
Plusieurs fois, nous avons besoin de 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".
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 tels que l'analyseur de journal ou les requêtes SQL pour générer le rapport souhaité.
pour trouver différents ID d'événement pour différents événements, passez par 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 l'analyseur de journaux.
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.