Problem

Bir Windows Server'a 3 farklı kullanıcı RDP ile bağlanıyordu. Belirli bir tarih aralığında kimin ne kadar bağlı kaldığını ve hangi programları açtığını raporlamak gerekiyordu. Sunucu loglarına erişim vardı ama analiz aracı yoktu.

3
Kullanıcı
4
Excel Sekmesi
70gün
Tarih Aralığı
Python
Motor

Windows Event Log Okuma

Python'un win32evtlog kütüphanesiyle Windows Security loglarını okumak mümkün. Admin yetkisi gerekiyor.

import win32evtlog import win32evtlogutil from datetime import datetime def read_security_events(start_date, end_date, event_ids, target_users): handle = win32evtlog.OpenEventLog(None, "Security") flags = win32evtlog.EVENTLOG_BACKWARDS_READ | win32evtlog.EVENTLOG_SEQUENTIAL_READ events = [] while True: records = win32evtlog.ReadEventLog(handle, flags, 0) if not records: break for event in records: # Tarih filtresi ev_time = datetime(*event.TimeGenerated.timetuple()[:6]) if ev_time < start_date: break # Geriye doğru okuyoruz, daha eskiye gerek yok if event.EventID in event_ids and ev_time <= end_date: events.append(parse_event(event, target_users)) win32evtlog.CloseEventLog(handle) return [e for e in events if e] # None'ları filtrele

Giriş-Çıkış Eşleştirme

Event 4624 = Başarılı giriş, Event 4634/4647 = Çıkış. Her giriş ile bir sonraki çıkışı eşleştirmek için stack yapısı kullandım.

def match_sessions(events): sessions = [] open_logins = {} # user → [login_time, ...] for event in sorted(events, key=lambda e: e['time']): user = event['user'] if event['type'] == 'LOGIN': if user not in open_logins: open_logins[user] = [] open_logins[user].append(event['time']) elif event['type'] == 'LOGOUT': if user in open_logins and open_logins[user]: login_time = open_logins[user].pop(0) # FIFO duration = event['time'] - login_time sessions.append({ 'user': user, 'login': login_time, 'logout': event['time'], 'duration_min': duration.total_seconds() / 60 }) return sessions

Açılan Programları Çekme

Event 4688 = Yeni process başlatıldı, 4689 = Process sonlandı. Bu eventler sadece Audit Process Tracking aktifse kaydediliyor.

# Event 4688: Process oluşturma logunu parse et def parse_process_event(event): msg = win32evtlogutil.SafeFormatMessage(event, "Security") lines = msg.split("\n") data = {} for line in lines: if "New Process Name:" in line: data['process'] = line.split(":")[-1].strip() elif "Account Name:" in line and 'user' not in data: data['user'] = line.split(":")[-1].strip() elif "Process ID:" in line: data['pid'] = line.split(":")[-1].strip() # Sistem processlerini filtrele skip = ["svchost.exe", "csrss.exe", "lsass.exe", "smss.exe"] if any(s in data.get('process','') for s in skip): return None return data

Excel Çıktısı

openpyxl ile 4 sekmeli Excel dosyası: Özet, Oturum Detayları, RDP Logları ve Program Takibi.

from openpyxl import Workbook from openpyxl.styles import PatternFill, Font GREEN = PatternFill(fill_type="solid", fgColor="C6EFCE") RED = PatternFill(fill_type="solid", fgColor="FFC7CE") def write_rdp_sheet(wb, events): ws = wb.create_sheet("RDP LOGLARI") ws.append(["Zaman", "Kullanıcı", "Olay", "IP"]) for row_idx, ev in enumerate(events, start=2): ws.append([ev['time'], ev['user'], ev['type'], ev['ip']]) fill = GREEN if ev['type'] == 'LOGIN' else RED for col in range(1, 5): ws.cell(row=row_idx, column=col).fill = fill # Kolon genişlikleri ws.column_dimensions['A'].width = 20 ws.column_dimensions['B'].width = 18 ws.column_dimensions['C'].width = 12
💡 YETKİ GEREKSİNİMİ

Security loglarını okumak için uygulamayı Yönetici olarak çalıştır. Audit Process Tracking etkin değilse 4688/4689 eventleri kayıt edilmez — bunu Yerel Güvenlik İlkesi → Gelişmiş Denetim İlkesi'nden aktif edin.