Bagaimana saya menghubungkan komputer dan pengguna ke port perangkat jaringan dalam program pemantauan Network MACMonitor

Saya adalah seorang pengembang perangkat lunak pemantauan jaringan Network MACMonitor .


Dalam proses pengembangan program, tugas muncul: untuk menentukan pengguna komputer mana yang menggunakan dan mengaitkan informasi ini dengan port perangkat jaringan. Dalam artikel ini saya ingin menulis bagaimana saya berhasil melakukan ini.


gambar


Saya mulai dengan pertimbangan sederhana: untuk mengaitkan pengguna dengan port pada perangkat jaringan, Anda harus terlebih dahulu menghubungkan komputer yang digunakan pengguna ke port ini. Karena program Network MACMonitor memungkinkan Anda untuk menemukan alamat mac pada port perangkat jaringan, diputuskan untuk menghubungkan komputer ke port menggunakan alamat mac. Selanjutnya, Anda harus menghubungkan pengguna ke komputer. Informasi ini dapat diperoleh dengan menginterogasi komputer dengan cara apa pun.


Saya melihat dua opsi untuk menyelesaikan masalah ini:


  1. Menulis agen Windows dan menginterogasinya menggunakan Network MACMonitor;
  2. Gunakan Instrumentasi Manajemen Windows (WMI).

Versi dengan agen Windows memiliki sejumlah kelemahan yang signifikan bagi saya:


  • pengembangan protokol aman untuk interaksi jaringan agen Windows dengan Network MACMonitor;
  • kebutuhan untuk menginstal agen pada komputer;
  • menggunakan bahasa pemrograman yang berbeda (saya menulis di Jawa), karena saya menganggap Java tidak cocok untuk menulis agen: karena konsumsi memori virtual yang agak besar dan kebutuhan untuk menginstal JRE di semua komputer.

Karena semua kelemahan di atas, saya memutuskan untuk memikirkan opsi menggunakan WMI.


Pengembangan klien WMI


Karena Network MACMonitor ditulis dalam Java, saya mencoba mencari pustaka Java cross-platform yang sudah jadi yang mengimplementasikan fungsionalitas klien WMI. Dan kemudian saya kecewa - tidak ada perpustakaan seperti itu. Semua perpustakaan yang ada adalah pembungkus atas utilitas Windows, atau (perpustakaan j-Interop) memerlukan manipulasi registri tambahan (perubahan kepemilikan dan izin pada cabang registri) untuk mengaktifkan WMI melalui registri jarak jauh. Karena tidak ada perpustakaan yang berfungsi penuh untuk Java, saya memutuskan untuk menemukan perpustakaan atau klien WMI yang ditulis dalam bahasa pemrograman lain. Dan menemukan satu klien WMI untuk Linux. Setelah mengunduh dan memeriksa pekerjaannya, saya menyadari bahwa polling komputer Windows dari bawah Linux adalah mungkin.


Jika ini memungkinkan, saya memutuskan untuk menulis perpustakaan saya di Jawa murni, yang akan memungkinkan saya untuk polling komputer menggunakan WMI.


Untuk menulis perpustakaan, diperlukan dokumentasi yang jelas tentang pengoperasian protokol WMI. Ternyata ada dokumentasi seperti itu dan itu dalam domain publik.


Saya mulai mempersiapkan untuk menulis perpustakaan dengan melihat tumpukan jaringan protokol WMI.


ProtokolSpesifikasi
Instrumentasi Manajemen Windows (WMI)MS-WMI, MS-WMIO
Model Objek Komponen Terdistribusi (DCOM)MS-DCOM
Panggilan Prosedur Jarak Jauh (RPC)MS-RPCE
Protokol Kontrol Transmisi (TCP)-
Protokol Internet (IP)-

Agar WMI berfungsi dengan benar, semua level tumpukan harus diimplementasikan.


Karena WMI tidak diimplementasikan di Jawa, saya pindah ke protokol berikutnya di stack - DCOM. Dan di sini saya beruntung. Meskipun pustaka j-Interop yang disebutkan di atas tidak mengimplementasikan fungsionalitas WMI, fungsionalitas DCOM diimplementasikan di dalamnya. Jadi tetap menulis implementasi protokol WMI, yaitu, menulis implementasi spesifikasi MS-WMI dan MS-WMIO.


Saya mulai dengan mengimplementasikan spesifikasi MS-WMIO, yang bertanggung jawab atas format pengkodean data dalam paket jaringan protokol WMI. Dari spesifikasi, saya belajar bahwa ketika meng-encode data, spesifikasi sintaksis Backus-Naur yang diperluas (ABNF, RFC 5234) digunakan. Spesifikasi MS-WMIO sepenuhnya menggambarkan format pengkodean menggunakan ABNF. Diketahui bahwa jika ada tata bahasa yang dijelaskan dalam ABNF, maka dimungkinkan untuk membuat parser untuk tata bahasa ini. Di Internet, saya menemukan generator parser ABNF untuk Java dan mengisinya dengan tata bahasa yang diambil dari spesifikasi. Karena parser yang dihasilkan bekerja dengan string, dan MS-WMIO menjelaskan format pengkodean biner, idenya adalah hanya mengganti parser yang dihasilkan dengan string oleh array dan karakter dengan byte. Tetapi setelah melihat jumlah file di mana penggantian diperlukan, dan juga telah belajar dari spesifikasi MS-WMIO bahwa kadang-kadang perlu untuk bekerja dengan bit, saya menyadari bahwa akan sangat sulit untuk memperbaiki parser yang dihasilkan, dan memutuskan untuk meninggalkan ide ini. Saya pikir menulis parser dari awal akan lebih cepat. Dan sekarang parser sudah siap.


Tetapi bagaimana memverifikasi bahwa parser ditulis dengan benar jika spesifikasi MS-WMI, yang bertanggung jawab atas operasi protokol WMI, belum diimplementasikan? Lalu Wireshark, penganalisa lalu lintas jaringan, membantu saya. Setelah membuat permintaan WMI menggunakan alat Windows standar (wbemtest), setelah sebelumnya menonaktifkan enkripsi, saya menerima paket jaringan dan menyimpannya ke file biner. Sudah dimungkinkan untuk menggunakan file-file ini sebagai data uji untuk parser.


Ketika parser diuji dan kesalahan yang ditemukan diperbaiki, saya melanjutkan untuk mengimplementasikan spesifikasi MS-WMI, yang menggambarkan operasi protokol WMI.


Spesifikasi MS-WMI dibagi menjadi server dan klien. Saya sebagian mengimplementasikan bagian klien, sejauh yang diperlukan untuk polling komputer melalui WMI. Pada bagian ini, saya juga membutuhkan Wireshark, tetapi sudah menganalisis urutan paket jaringan selama polling WMI.


Mencoba mendapatkan data yang diperlukan menggunakan WMI


Setelah menulis perpustakaan WMI, tugas menggunakannya dalam program Network MACMonitor menjadi. Muncul pertanyaan: data apa yang harus diperoleh dari komputer? Saya pikir saya perlu mendapatkan nama komputer, domain, sistem operasi, waktu pengaktifan, alamat mac, alamat ip, pengguna aktif yang bekerja di komputer.


Tetapi muncul masalah yang sangat penting: bagaimana cara mengidentifikasi komputer secara unik selama pemungutan suara WMI? Saya mempertimbangkan opsi-opsi berikut:


  • alamat mac, kemungkinan perubahan, kemungkinan tidak unik;
  • nama dan domain komputer (workgroup), kemungkinan perubahan, tidak unik (untuk workgroup);
  • nomor seri hard drive tempat sistem operasi diinstal, hak administrator diperlukan selama pemungutan suara WMI, saya tidak memeriksa keunikan, tetapi saya menduga bahwa nonunique itu mungkin;
  • nomor seri motherboard, non-unik adalah mungkin, dan cukup sering;
  • pengidentifikasi sistem komputer (properti UUID WMI dari kelas Win32_ComputerSystemProduct ), nonunquise mungkin terjadi, dan cukup sering;
  • waktu instalasi sistem operasi adalah yang terbaik dari semua opsi, tetapi ketidakmampuan mungkin dilakukan saat mengkloning sistem, atau ketika menggunakan dari suatu gambar.

Tidak ada opsi yang memungkinkan Anda mengidentifikasi komputer secara unik, jadi saya memutuskan mengidentifikasi komputer dengan tiga cara:


  • nomor seri motherboard,
  • pengidentifikasi sistem komputer
  • waktu pemasangan sistem operasi.

Tentu saja, ketiga parameter ini mungkin bertepatan pada komputer yang berbeda, tetapi lebih jarang daripada salah satunya.


Upaya juga dilakukan untuk mendapatkan pengguna aktif menggunakan kelas WMI standar: Win32_LogonSession . Kemudian masalah pertama muncul: ternyata Win32_LogonSession menunjukkan semua sesi pengguna, bahkan yang sudah selesai. Saya mulai berpikir bagaimana menyaring sesi aktif dari sesi yang berakhir. Menemukan bahwa ini dapat dilakukan dengan menggunakan kelas Win32_SessionProcess , yang mengaitkan contoh dari kelas Win32_LogonSession dengan Win32_Process . Jika tautan ke sesi hadir dalam daftar instance dari kelas Win32_SessionProcess (setidaknya ada satu proses dengan pengidentifikasi sesi ini), maka aktif. Selanjutnya, muncul pertanyaan tentang cara mengaitkan sesi dengan pengguna. Ini dapat dilakukan dengan menggunakan kelas Win32_LoggedOnUser , yang mengikat turunan dari kelas Win32_LogonSession dan Win32_UserAccount . Tetap hanya untuk mendapatkan contoh kelas Win32_UserAccount yang memberikan informasi terperinci tentang pengguna.


gambar


Tapi di sini saya kecewa. Saat menggunakan WMI dari jarak jauh, ternyata ketika mencoba untuk mendapatkan instance dari kelas Win32_UserAccount , dimungkinkan untuk hanya mendapatkan pengguna komputer lokal. Artinya, ternyata menggunakan alat WMI standar, tidak mungkin untuk mengetahui pengguna mana yang aktif di komputer.


Pengembangan penyedia WMI.


Karena ketidakmungkinan identifikasi komputer yang jelas dan ketidakmungkinan mendapatkan informasi tentang pengguna aktif yang menggunakan kelas WMI standar, diputuskan untuk memperluas fungsionalitas WMI. Anda dapat melakukan ini dengan menjelaskan kelas WMI Anda dalam file MOF dan menulis penyedia WMI untuk mendapatkan instance dari kelas-kelas ini.


Dua kelas WMI baru telah dijelaskan: NMBY_InstallInfo - untuk mengidentifikasi komputer dan NMBY_LogonSession - untuk mengidentifikasi pengguna aktif komputer.


gambar


Kemudian penyedia WMI ditulis dengan mana Anda bisa mendapatkan contoh dari kelas-kelas ini.


Persyaratan tambahan ditetapkan untuk penyedia:


  • bekerja pada sistem tanpa .NET;
  • bekerja pada sistem operasi Windows XP dan lebih tinggi;
  • kemampuan untuk memperoleh informasi menggunakan akun non-administratif.

Oleh karena itu, penyedia ditulis dalam C ++ menggunakan WinApi.


Dalam proses penulisan penyedia, kesulitan muncul karena jumlah kecil dan kualitas dokumentasi tentang topik ini, tetapi meskipun demikian, penyedia berhasil ditulis.


Penyedia tertulis tersedia di halaman unduhan . Itu dapat diinstal dan digunakan secara gratis.


Ringkasan


Akibatnya, menggunakan program Network MACMonitor menjadi mungkin:


  • Kaitkan pengguna dengan komputer

gambar


  • Kaitkan komputer dengan port pada perangkat jaringan

gambar


  • Kaitkan port perangkat jaringan dengan komputer dan pengguna

gambar


  • Lihat riwayat pendaftaran pengguna di komputer.

gambar


Situs web program

Source: https://habr.com/ru/post/id416217/


All Articles