วิธีที่ดีที่สุดในการค้นหาคอมพิวเตอร์ที่ผู้ใช้เข้าสู่ระบบครั้งล่าสุด


23

ฉันหวังว่าบางแห่งใน Active Directory จะมีการเขียน / จัดเก็บ "ล็อกออนครั้งล่าสุดจาก [คอมพิวเตอร์]" หรือมีบันทึกที่ฉันสามารถแยกวิเคราะห์ได้หรือไม่

วัตถุประสงค์ของการต้องการทราบว่าพีซีเครื่องสุดท้ายที่เข้าสู่ระบบนั้นมีไว้สำหรับการสนับสนุนระยะไกลผ่านเครือข่าย - ผู้ใช้ของเราเคลื่อนไปมาไม่บ่อยนัก แต่ฉันต้องการที่จะรู้ว่าสิ่งที่ฉันให้คำปรึกษาคือการปรับปรุงในเช้าวันนั้น อย่างน้อยที่สุด)

ฉันกำลังพิจารณาสคริปต์การเข้าสู่ระบบที่เขียนชื่อผู้ใช้และคอมพิวเตอร์ไปยังตำแหน่งที่รู้จักฉันสามารถอ้างอิงได้ แต่ผู้ใช้บางคนของเราไม่ต้องการออกจากระบบเป็นเวลา 15 วันในแต่ละครั้ง

หากมีวิธีการแก้ปัญหาที่สง่างามที่ใช้สคริปต์การเข้าสู่ระบบพูดถึงมันแน่นอน - แต่ถ้ามันเกิดขึ้นกับการทำงานเพียงปลดล็อคสถานีที่จะดีกว่า!

คำตอบ:


26

ในฐานะส่วนหนึ่งของสคริปต์การเข้าสู่ระบบของเราฉันมีข้อมูลนั้น (และอื่น ๆ ) ที่ถูกบันทึกไว้ในการแชร์ที่ซ่อนอยู่บนเซิร์ฟเวอร์โดยมีไฟล์บันทึกหนึ่งไฟล์ต่อผู้ใช้หนึ่งราย สคริปต์การออกจากระบบเพิ่มเวลาที่ผู้ใช้ออกจากระบบไปยังไฟล์บันทึกเดียวกัน ติดตั้งง่ายไม่มีค่าใช้จ่ายและมีข้อมูลในรูปแบบที่อ่านง่าย


นอกจากนี้เมื่อผนวกท้ายบันทึกคุณจะได้รับบันทึกทางประวัติศาสตร์ซึ่งบางครั้งก็สะดวกมาก
John Gardeniers

1
ดำเนินการในตอนนี้อาจจะย้ายไปยัง vbs ด้วยคุณสมบัติเพิ่มเติมในอนาคต :) จนถึงตอนนี้ใช้สคริปต์การเข้าสู่ระบบแบบแบตช์ที่ง่ายมาก: echo% date%,% time%,% time%,% user% logon,% computername% >> \\ server \ logon $ \ logons.csv เปิดด้วย Excel และคุณตั้งค่าแล้ว!
การ์เร็ตต์

สคริปต์การเข้าสู่ระบบทำงานเป็นผู้ใช้หรือไม่ในกรณีนี้ผู้ใช้สามารถเข้าสู่ระบบและแก้ไขบันทึกได้หรือไม่
James Yale

@ James นี่คือเหตุผลที่ฉันใช้ซ่อนการแบ่งปันที่ซ่อนอยู่เพื่อจัดเก็บบันทึก แน่นอนว่ามันจะขึ้นอยู่กับความเข้าใจของผู้ใช้ของคุณเนื่องจากสามารถอ่านตำแหน่งได้โดยการอ่านสคริปต์ ฉันไม่มีปัญหากับผู้ใช้ชุดปัจจุบันของฉัน :)
John Gardeniers

1
ฉันทำสิ่งที่คล้ายกันยกเว้นสคริปต์การเข้าสู่ระบบทำการโทรไปยังบริการเว็บที่อัปเดตฐานข้อมูล ฐานข้อมูลมีส่วนหน้าของเว็บเพื่อดูสถานะปัจจุบัน อย่างไรก็ตามมันเป็นปัญหาสำหรับผู้ใช้มือถือ
Nic

10

เราทำสิ่งนี้ผ่านการเข้าสู่ระบบสคริปต์ซึ่งปรับปรุงคำอธิบายของวัตถุคอมพิวเตอร์ใน AD

คุณต้องทำการมอบหมายการควบคุมแบบกำหนดเองเพื่ออนุญาตให้ "ผู้ใช้ที่ได้รับการรับรองความถูกต้อง" เพื่อเขียนคุณสมบัติคำอธิบายของวัตถุคอมพิวเตอร์ในโดเมน / s

เมื่อเสร็จแล้วสิ่งที่คุณต้องมีก็คือสคริปต์ที่สร้างข้อมูลอะไรก็ตามที่คุณต้องการและเขียนคุณสมบัติลงในวัตถุคอมพิวเตอร์ สคริปต์นี้ถูกกำหนดให้เป็นสคริปต์การเข้าสู่ระบบผ่านวัตถุนโยบายกลุ่มที่เชื่อมโยงกับโดเมน

เราใส่การประทับเวลาชื่อผู้ใช้ 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

วิธีการมอบหมายผู้ใช้รับรองความถูกต้องเขียนสิทธิ์อธิบายไปยังวัตถุเขตข้อมูลคำอธิบายในโฆษณา
NULL.Dude

6

ฉันต้องบรรลุผลลัพธ์เดียวกันด้วยเหตุผลที่คล้ายกัน อย่างใดพิจารณาว่าเครื่องที่ผู้ใช้เฉพาะเข้าสู่ระบบจาก ฉันต้องการรู้ว่า "มาก่อนความจริง" และไม่สามารถเปลี่ยนสคริปต์การเข้าสู่ระบบของผู้ใช้ตามที่กล่าวไว้ข้างต้น
ฉันใช้ powershell บน DC ที่ผู้ใช้รับรองความถูกต้องเพื่อแยกวิเคราะห์บันทึกเหตุการณ์ความปลอดภัย:

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

ถอดรหัสเปิด. csv ด้วย excel หรือตัวแก้ไข fav ของคุณและค้นหารายการล่าสุดที่แสดงทั้งชื่อบัญชี (ชื่อผู้ใช้) และที่อยู่เครือข่ายแหล่งที่มาภายในเหตุการณ์เดียวกัน
นี่อาจไม่ใช่วิธีการแก้ปัญหาที่เชื่อถือได้ 100% (ขึ้นอยู่กับเวลาการเช่า DHCP และอื่น ๆ ) แต่มันใช้ได้สำหรับฉัน


6

คุณสามารถเปิดใช้งานการตรวจสอบบัญชีสำหรับกิจกรรมการเข้าสู่ระบบบัญชี เหตุการณ์เหล่านี้(รวมถึงการปลดล็อคเวิร์กสเตชัน) จะถูกเก็บไว้ในบันทึกความปลอดภัยของ DC

นอกจากนี้ยังมีเครื่องมือของบุคคลที่สามที่สามารถทำให้ง่ายขึ้นเช่นทรูเข้าสู่ระบบล่าสุด


4

ฉันเพิ่งเขียนชื่อผู้ใช้ (รวมถึงข้อมูลอื่น ๆ เช่นวันที่และเวลาบางรุ่นของโปรแกรมและอื่น ๆ ) ลงในคำอธิบายคอมพิวเตอร์โดยใช้สคริปต์การเข้าสู่ระบบ ด้วยวิธีนี้ฉันสามารถดึงข้อมูลทั้งหมดจากผู้ใช้ 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 ของคุณเพื่อช่วยในการขอร้อง

userid เข้าสู่ระบบด้วยชื่อเวิร์กสเตชันที่อยู่ MAC ที่อยู่ IP วันที่ / ประเภทการเข้าสู่ระบบการประทับเวลา (rdp, interfactive ฯลฯ )

จากนั้นดัมพ์ลงในคำสั่ง sql ลงในฐานข้อมูลที่สามารถเคียวรีได้ บิตและชิ้นส่วนจะถูกบันทึกไว้ทั่วสถานที่ แต่การบันทึกจะช่วยประหยัดเวลาในการดึงข้อมูลจากเซิร์ฟเวอร์ DHCP / WINS ฯลฯ ...


1
ฉันคิดว่ามันเกินความจริงสำหรับ "เฮ้ชื่อคอมพิวเตอร์ของ Donny คืออะไร" แต่บางทีสักวันเราจะอยู่ในระดับนั้น: P
Garrett

0

วิธีเดียวที่จะมีข้อมูลล่าสุดคือการค้นหาผ่านบันทึก ใช้เครื่องมือเช่น Microsoft Operations Manager หรือเครื่องมือฟรีเช่นบ่วงเพื่อรวมบันทึกเหตุการณ์ที่น่าสนใจจากเซิร์ฟเวอร์เข้าที่ส่วนกลาง (ไฟล์ข้อความปกติหรือฐานข้อมูล SQL) จากนั้นใช้เครื่องมือเช่น logparser หรือแบบสอบถาม SQL เพื่อสร้างรายงานที่คุณต้องการ

สำหรับการค้นหารหัสเหตุการณ์ที่แตกต่างกันสำหรับเหตุการณ์ที่แตกต่างกันไปผ่าน สารานุกรมบันทึกเหตุการณ์

แจ้งให้เราทราบหากคุณต้องการติดตามเส้นทางนี้ฉันสามารถช่วยคุณสร้างแบบสอบถามที่เหมาะสมสำหรับ logparser


0

หากคุณกำลังมองหาข้อมูลอ้างอิงในอดีตคุณสามารถลองใช้เครื่องมือบุคคลที่สามเช่นLogon Centralจาก Motivate Systems มันบันทึกการเข้าสู่ระบบของผู้ใช้ Active Directory ทั้งหมดและจัดทำเว็บอินเตอร์เฟสสำหรับการขุดข้อมูล นอกจากนี้ยังมีกราฟที่ดีซึ่งแปลสถิติการเข้าสู่ระบบเป็นเปอร์เซ็นต์การใช้งาน


0

ind เข้าสู่ระบบ AD

หลายครั้งที่เราจำเป็นต้องทราบว่าการเข้าสู่ระบบโดยเฉพาะเป็นส่วนหนึ่งของกลุ่มผู้ใช้โฆษณา หรือบางครั้งเราจำเป็นต้องรู้กลุ่มโฆษณาและต้องการรู้ว่าใครเข้าสู่ระบบทั้งหมดเป็นส่วนหนึ่งของมัน

มีหลายวิธีในการบรรลุเป้าหมายนี้

ฉันทำตามขั้นตอนนี้เพื่อสร้างทางลัดบนเดสก์ท็อปของฉันซึ่งฉันสามารถค้นหาการเข้าสู่ระบบได้ง่ายโปรดทำตามขั้นตอนดังนี้

START-> RUN -> rundll32 dsquery, OpenQueryWindow

คุณสามารถค้นหาโฆษณาทั้งหมดที่คุณเป็นส่วนหนึ่งโดยใช้สิ่งนี้

Start-> Settings-> Control Panel -> เครื่องมือผู้ดูแลระบบ -> ผู้ใช้ Active Directory และคอมพิวเตอร์เลือกโดเมนที่คุณต้องการค้นหาเข้าสู่ระบบคลิกขวาที่โดเมนนั้นและเลือกตัวเลือก "ค้นหา"


0

ฉันกำลังจะเพิ่มสิ่งนี้เป็นความคิดเห็นต่อคำตอบของ marcusjv ด้านบน แต่ฉันไม่มีชื่อเสียงดังนั้นคำตอบที่แยกต่างหากจะต้องทำ:

ในนิพจน์นั้น - และ "ที่อยู่เครือข่ายที่มา" จะประเมินเป็น TRUE เสมอ

ฉันคิดว่าสิ่งที่คุณต้องการคือ: get-eventlog "Security" | โดยที่ {$ .Message -like "* ชื่อผู้ใช้ *" -AND $ .Message.contain ("ที่อยู่เครือข่ายต้นทาง")}

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.