Назад | Перейти на главную страницу

Лучший способ найти компьютер, с которого пользователь последний раз входил в систему?

Я надеюсь, что где-то в Active Directory записывается / сохраняется «последний вход в систему с [компьютера]», или есть журнал, который я могу разобрать?

Желание узнать, с какого компьютера последний раз вошел в систему, предлагается удаленная поддержка по сети - наши пользователи передвигаются довольно редко, но я хотел бы знать, что все, что я консультирую, обновлялось этим утром (когда они вошли в систему , предположительно) как минимум.

Я также рассматриваю сценарии входа в систему, которые записывают имена пользователей и компьютеров в известное место, на которое я могу сослаться, но некоторые из наших пользователей не любят выходить из системы на 15 дней за раз.

Если есть элегантное решение, использующее сценарии входа в систему, обязательно упомяните об этом, но если оно сработает просто для разблокировки станции, это будет еще лучше!

В рамках нашего сценария входа в систему эта информация (и многое другое) записывается в скрытый общий ресурс на сервере, с одним файлом журнала для каждого пользователя. Сценарии выхода добавляют время выхода пользователя из системы в тот же файл журнала. Легко настроить, бесплатно и информация в удобном для чтения формате.

Мы делаем это с помощью сценария входа в систему, который обновляет описание объекта компьютера в AD.

Вам необходимо выполнить настраиваемое делегирование управления, чтобы разрешить «прошедшим проверку пользователям» записывать свойство описания компьютерных объектов в домене (ах).

Как только это будет сделано, все, что вам нужно, это сценарий, который генерирует любую информацию, которую вы хотите, и записывает свойства в объект компьютера. Затем этот сценарий назначается как сценарий входа в систему через объект групповой политики, связанный с доменом.

Мы помещаем метку времени, имя пользователя, IP в поле описания. Метка времени идет первой, потому что она позволяет быстро увидеть "старые" компьютерные объекты путем сортировки по полю описания.

Вот сценарий, который я написал для этого, если вы хотите использовать его в качестве отправной точки:

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

Ты можешь включить аудит для событий входа в учетную запись. Эти События (включая разблокировку рабочей станции) будет храниться в журнале безопасности контроллера домена.

Существуют также сторонние инструменты, которые могут упростить эту задачу, например Истинный последний вход в систему.

Мне пришлось добиться того же результата по схожим причинам; как-то определить, с какой машины вошел конкретный пользователь. Я хотел знать «до факта» и не мог изменить сценарии входа в систему, как описано выше.
Я использовал powershell на контроллере домена, на котором выполнялась аутентификация пользователя, для анализа журнала событий безопасности:

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

Взломайте .csv с помощью excel или вашего избранного редактора и найдите самую последнюю запись, которая показывает как имя учетной записи (имя пользователя), так и исходный сетевой адрес в одном событии.
Возможно, это не 100% надежное решение (в зависимости от времени аренды DHCP и т. Д.), Но у меня оно сработало.

Я просто пишу имя пользователя (а также другую информацию, такую ​​как дата и время, некоторые версии программ и т. Д.) В описании компьютера с помощью сценария входа в систему. Таким образом, я могу быстро и легко получить всю информацию из AD Users & Computers, а в качестве бонуса у меня будет хороший способ определить, какие компьютеры, все еще находящиеся в AD, не использовались какое-то время (и поэтому, скорее всего, являются мертвыми машинами).

ThatGraemeGuy, спасибо за отличный скрипт! Пришлось переписать в PowerShell, но он все еще работает.

$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()

Уловка, позволяющая точно узнать, где пользователи в последний раз входили в систему, помимо предложений Адама, - это агрегирование журналов. Если у вас несколько контроллеров домена, вам нужно либо проверить их все, либо централизовать ведение журнала, а затем проверить единый журнал.

Некоторые, а может и большинство сторонних инструментов достаточно умны, чтобы запрашивать все контроллеры домена. Но если вы думаете о написании сценария для его разбора самостоятельно, я не могу достаточно сильно спорить о централизации ваших журналов.

В идеале, вы должны записать следующее, чтобы ваша команда CSIRT могла помочь в запросах.

идентификатор пользователя вход в систему с именем рабочей станции MAC-адрес IP-адрес Дата / время Тип входа (rdp, interfactive и т. д.)

Затем выгрузите это в команду sql в базу данных, которую они могут запросить. Биты и части регистрируются повсюду, но запись это экономит время на извлечение данных с серверов DHCP / WINS и т. Д.

Я собирался добавить это как комментарий к ответу marcusjv выше, но у меня нет репутации, поэтому потребуется отдельный ответ:

В этом выражении -И "Исходный сетевой адрес" всегда будет иметь значение ИСТИНА.

Думаю, что вам нужно: get-eventlog "Security" | где {$.Message-like "* имя пользователя *" -AND $.Message.contains ("Исходный сетевой адрес")}

Единственный способ получить самую свежую информацию - это собирать пищу в бревнах. Используйте такой инструмент, как Microsoft Operations Manager, или бесплатный инструмент, например ловушку, для объединения интересных журналов событий с сервера в центральное место (обычные текстовые файлы или базу данных SQL), а затем используйте такие инструменты, как logparser или SQL-запросы, для создания нужного отчета.

для поиска разных идентификаторов событий для разных событий Энциклопедия журнала событий

Дайте мне знать, если вы хотите следовать по этому пути, я могу помочь вам создать соответствующие запросы для logparser.

Если вы ищете историческую справку, вы можете попробовать сторонний инструмент, например Logon Central от Motivate Systems. Он записывает все входы в систему пользователей Active Directory и предоставляет веб-интерфейс для интеллектуального анализа данных. Он также включает несколько довольно хороших графиков, которые переводят статистику входа в систему в процент использования.

ind Войти в AD

Часто нам требуется знать, является ли конкретный логин частью группы пользователей объявления. Или иногда нам нужно знать группу AD, и мы хотим знать, кто все логины входят в нее.

Есть много разных способов добиться этого.

Я следую этому шагу, чтобы создать ярлык на своем рабочем столе, где я могу легко найти логины. Следуйте инструкциям, как

ПУСК -> ВЫПОЛНЕНИЕ -> dsquery rundll32, OpenQueryWindow

Вы можете найти всю AD, частью которой являетесь, используя это.

Пуск -> Настройки -> Панель управления -> Инструменты администратора -> Пользователи и компьютеры Active Directory. Выберите домен, для которого вы хотите найти логин, щелкните его правой кнопкой мыши и выберите «Найти».