Quản lý máy ảo Hyper-V với tính năng chống phát hiện, tích hợp MikroTik DHCP.
- Tính năng
- Yêu cầu hệ thống
- Cài đặt
- Cấu hình
- Hướng dẫn sử dụng
- Kiến trúc
- API Reference
- Troubleshooting
- Hiển thị danh sách tất cả VMs đang chạy trên Hyper-V
- Khởi động, tắt, xóa máy ảo hàng loạt
- Nhân bản máy ảo từ template (VHDX)
- Hỗ trợ cả Gen 1 (BIOS) và Gen 2 (UEFI)
- Đường dẫn tuyệt đối với định dạng forward slashes
- Cấu hình VLAN cho từng VM riêng biệt
- Kết nối MikroTik RouterOS để lấy IP DHCP
- Normalization MAC address tự động (XX:XX:XX:XX:XX:XX)
- Hiển thị trạng thái Online/Offline
- Spoofing thông tin phần cứng (MAC, Serial, UUID)
- Random hóa computer name
- Hỗ trợ Template Spark cho Chrome/Firefox
- Hệ điều hành: Windows 10/11 Pro/Enterprise
- Hyper-V: Phải bật Hyper-V Role
- Python: 3.9 trở lên (để chạy development mode)
- MikroTik: RouterOS với DHCP server và API enabled (tùy chọn)
# Clone repository
git clone <repository-url>
cd VmManager
# Tạo virtual environment
python -m venv venv
venv\Scripts\activate
# Cài đặt dependencies
pip install -r requirements.txt
# Chạy ứng dụng
python Run_VM_Manager.ps1# Build EXE
.\build_exe.bat
# Hoặc sử dụng script PowerShell
.\create_launcher_exe.ps1{
"hypervisor": "hyperv",
"base_vhdx": "D:\\VMs\\BaseVM\\Virtual Hard Disks\\2.vhdx",
"vm_storage_path": "E:\\Farm",
"mikrotik": {
"enabled": true,
"host": "192.168.88.1",
"port": 8511,
"username": "admin",
"password_env": "MIKROTIK_PASSWORD",
"use_api": true
},
"vlan": {
"enabled": true,
"base_id": 236,
"auto_assign": true
}
}Ứng dụng hỗ trợ 3 phương thức lấy mật khẩu (theo ưu tiên):
-
Environment Variable (An toàn nhất)
$env:MIKROTIK_PASSWORD = "your_password"
-
File
mk_password.txt- Đặt trong thư mục gốc project hoặc
APPDATA\VMManager\ - Chứa mật khẩu trên dòng đầu tiên
- Đặt trong thư mục gốc project hoặc
-
Direct Config (Không an toàn, chỉ dùng khi develop)
Chạy Run_VM_Manager.ps1 hoặc file EXE đã build.
Ứng dụng sẽ:
- Load danh sách VMs từ Hyper-V
- Kết nối MikroTik (nếu có cấu hình)
- Hiển thị bảng "Danh sách VMs" với thông tin:
- Check: Checkbox để chọn VMs
- ID: Số thứ tự
- Tên VM: Tên máy ảo
- Đường dẫn: Đường dẫn tuyệt đối đến thư mục VM
- Trạng thái: Online (xanh) / Offline (đỏ)
- IP: Địa chỉ IP từ MikroTik
- Chọn file Master VM VHDX
- Nhập tên/number range (ví dụ:
36-40hoặc36,37,38) - (Tùy chọn) Nhập VLAN ID base
- (Tùy chọn) Nhập đường dẫn storage
- Nhấn "Tạo máy ảo..."
Quy trình:
- Kiểm tra VM đã tồn tại chưa
- Import VM từ template với ID mới
- Cấu hình Network Switch và VLAN
- Lưu vào database
- Thêm vào bảng mà không reload toàn bộ
- Boot: Chọn VM(s) → Nhấn "Boot"
- Shutdown: Chọn VM(s) → Nhấn "Shutdown"
- Delete: Chọn VM(s) → Nhấn "Delete" (xóa cả folder)
Nhấn nút "Refresh IPs" để tải lại địa chỉ IP từ MikroTik.
VmManager/
├── app/
│ ├── main.py # Entry point, UI main window
│ ├── clone_worker.py # Background worker cho VM cloning
│ ├── vm_action_worker.py # Background worker cho boot/shutdown/delete
│ ├── vm_list_worker.py # Background worker cho VM list loading
│ ├── core/
│ │ ├── hyperv.py # Hyper-V PowerShell controller
│ │ ├── hyperv_spoofer.py # Anti-detect spoofing cho Hyper-V
│ │ ├── mikrotik.py # MikroTik RouterOS API controller
│ │ ├── database.py # SQLite database wrapper
│ │ └── spoofer.py # Generic spoofing utilities
│ └── utils/
│ └── admin_helper.py # Admin privilege checker
├── data/
│ └── vm_data.db # SQLite database
├── config.json # Configuration file
├── mk_password.txt # MikroTik password (tùy chọn)
├── requirements.txt # Python dependencies
└── DOCUMENTATION.md # Tài liệu này
[Hyper-V] → VMListWorker → Table Display
↓
[MikroTik] → IP Lookup → MAC Match → Update IP Column
[User Input] → CloneWorker → Hyper-V Import → Database → Add to Table
from core.hyperv import HyperVController
controller = HyperVController()
# List all VMs
vms = controller.list_vms() # List[dict]
# Get MAC addresses
mac = controller.get_vm_mac_address("VM1") # Optional[str]
all_macs = controller.get_all_vm_mac_addresses() # dict
# VM operations
controller.start_vm("VM1")
controller.stop_vm("VM1", force=True)
controller.remove_vm("VM1", delete_vhdx=False)from core.mikrotik import MikrotikController
mikrotik = MikrotikController(
host="192.168.88.1",
username="admin",
password="password",
port=8511,
use_api=True
)
# Connection
mikrotik.ping() # bool
leases = mikrotik.get_leases() # List[dict]
# IP lookup
ip = mikrotik.get_ip_by_mac("AA:BB:CC:DD:EE:FF") # Optional[str]
# Lease management
mikrotik.add_static_lease("AA:BB:CC:DD:EE:FF", "192.168.1.100")
mikrotik.remove_static_lease("AA:BB:CC:DD:EE:FF")from core.database import Database
db = Database("data/vm_data.db")
# CRUD
db.add_vm("VM1", "E:/Farm/VM1", profile={}, vlan_id=236)
vms = db.get_all_vms() # List[dict]
db.delete_vm_by_name("VM1")Vấn đề: App crash khi mở Giải pháp:
- Chạy PowerShell với Admin
- Kiểm tra Hyper-V đã bật chưa:
Get-VM - Xem log trong console
Vấn đề: Lỗi "MikroTik connection failed" Giải pháp:
- Kiểm tra file
mk_password.txt - Verify environment variable
MIKROTIK_PASSWORD - Đảm bảo MikroTik API enabled:
/api ip service enable port=8511 - User cần permission
/rest read
Vấn đề: Cột IP hiển thị "-" Giải pháp:
- Kiểm tra MikroTik connection
- Đảm bảo DHCP server đang chạy
- MAC address phải khớp (uppercase, format XX:XX:XX:XX:XX:XX)
Vấn đề: Lỗi "Base VM folder not found" Giải pháp:
- Kiểm tra đường dẫn VHDX trong config
- VHDX path sẽ tự động chuyển thành VM folder path
- Đảm bảo file
.vmcxtồn tại trong thư mục
Vấn đề: Path hiển thị E:/Farm/37/37 thay vì E:/Farm/37
Giải pháp:
- Đã được sửa trong code
- Nếu vẫn gặp, kiểm tra
vm_path_inputkhông trùng với VM name
Internal use - VMManager Project