it-swarm-ru.tech

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

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

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

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

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

24
Garrett

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

26
John Gardeniers

Мы делаем это через скрипт входа в систему, который обновляет описание объекта компьютера в 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
10
ThatGraemeGuy

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

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

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

6
marcusjv

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

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

6
Adam Brand

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

4
Maximus Minimus

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 '[email protected]: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()
3
Matvey Solodovnikov

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

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

2
Laura Thomas

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

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

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

1
Scott

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

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

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

1
SS64

ind Войти в AD

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

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

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

START-> RUN -> rundll32 dsquery, OpenQueryWindow

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

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

0
Lepide

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

чтобы найти разные идентификаторы событий для разных событий, перейдите через Event Log Encyclopedia

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

0
KAPes

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

0
Scott