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

23

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

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

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

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

Garrett
источник

Ответы:

26

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

Джон Гарденье
источник
Кроме того, добавляя в журнал, вы получаете историческую запись, которая иногда может быть очень удобной.
Джон Гарденье
1
Реализовано это на данный момент, вероятно, в будущем мы перейдем к vbs с большим количеством функций :) Пока что используется ОЧЕНЬ простой скрипт пакетного входа: echo% date%,% time%,% username%, logon,% computername% >> \\ server \ logon $ \ logons.csv Откройте с помощью Excel, и все готово!
Гаррет
Сценарий входа в систему запускается от имени пользователя, и в этом случае пользователь также может войти и изменить журнал?
Джеймс Йель
@ Джеймс, вот почему я использую скрытый скрытый общий ресурс для хранения журналов. Конечно, это будет зависеть от того, насколько опытны ваши пользователи, поскольку местоположение можно получить, просто прочитав сценарий. У меня нет этой проблемы с моим текущим набором пользователей. :)
Джон Гарденерс
1
Я сделал нечто подобное, за исключением того, что скрипт входа в систему вызвал веб-сервис, который обновил базу данных. База данных имела веб-интерфейс для просмотра текущего состояния. Однако это было проблематично для мобильных пользователей.
Ник
10

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

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

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

Мы помещаем метку времени, имя пользователя, 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
ThatGraemeGuy
источник
Как делегировать прошедшим проверку подлинности пользователям доступ к полям прав доступа к объекту поля описания в AD?
NULL. Чувак
6

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

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

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

marcusjv
источник
6

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

Есть также сторонние инструменты, которые могут сделать это проще, такие как True Last Logon .

Адам Бранд
источник
4

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

Максимус Минимус
источник
3

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()
Матвей Солодовников
источник
2

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

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

Лаура Томас
источник
1

В идеале, вы должны получить следующую информацию для вашей команды CSIRT, чтобы помочь в проведении расследований.

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

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


источник
1
Я думаю, что это немного излишне для "Эй, как зовут компьютер Донни?" но, может быть, когда-нибудь мы будем на этом уровне: P
Гаррет
0

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

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

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

Kapes
источник
0

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


источник
0

ind Войти в AD

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

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

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

START-> RUN -> rundll32 dsquery, OpenQueryWindow

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

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

Lepide
источник
0

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

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

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

SS64
источник