Thông tin ghi nhớ

RustDesk

C:\Windows\ServiceProfiles\LocalService\AppData\Roaming\RustDesk\config\db.sqlite3
Kiểm tra số kết nối:  netstat -n | find ":21116" /c

Public key: 
INvJRTAfmuba7KnDXVbdcmlezAFjprazni76HV0+tEM=

Build phien bản===========
cd /d D:\rustdesk-master
cargo build --release
=================
Dear RustDesk Customer
Thank you for purchasing a rustdesk license!
License: pnmYAev3o3GREkFiKoYQCQ==
Type: Individual
Please keep this email or license information safe, you will run your RustDesk server with this license.

Sincerely,

The RustDesk Team.

======================= Code copy/Paste danh sach vào 
javascript:(async () => {
    const rawIDs = prompt("Dán danh sách ID học viên (cách nhau bằng dấu phẩy hoặc xuống dòng):");
    if (!rawIDs) return;
    const activeIDs = rawIDs.split(/[\s,]+/).map(id => id.trim()).filter(id => id);

    const rows = document.querySelectorAll('tr');
    let count = 0;

    for (const row of rows) {
        /* Tìm ID trong tất cả các ô của hàng đó */
        const rowText = row.innerText;
        const matchID = activeIDs.find(id => rowText.includes(id));

        const buttons = Array.from(row.querySelectorAll('a, button, span'));
        const enableBtn = buttons.find(el => el.textContent.trim().toLowerCase() === 'enable');
        const disableBtn = buttons.find(el => el.textContent.trim().toLowerCase() === 'disable');

        if (matchID) {
            if (enableBtn) {
                enableBtn.click();
                count++;
                await new Promise(r => setTimeout(r, 600));
            }
        } else {
            if (disableBtn) {
                disableBtn.click();
                await new Promise(r => setTimeout(r, 600));
            }
        }
    }
    alert("Hoàn tất! Đã ưu tiên " + count + " học viên.");
})();
================Chon file
javascript:(async () => {
    /* 1. Tạo ô chọn file danh-sach.txt */
    const input = document.createElement('input');
    input.type = 'file';
    input.accept = '.txt';
    input.onchange = e => {
        const file = e.target.files[0];
        const reader = new FileReader();
        reader.onload = async (event) => {
            const content = event.target.result;
            
            /* 2. Tách danh sách ID từ file (lấy phần sau dấu :) */
            const activeIDs = content.split('\n')
                .filter(line => line.includes(':'))
                .map(line => line.split(':')[1].trim().replace(/\D/g, ''));

            if (activeIDs.length === 0) {
                alert("Không tìm thấy ID nào hợp lệ trong file!");
                return;
            }

            console.log("Đang ưu tiên các ID:", activeIDs);
            
            /* 3. Duyệt qua các hàng trên Web Console */
            const rows = document.querySelectorAll('tr');
            let enabledCount = 0;
            let disabledCount = 0;

            for (const row of rows) {
                const rowText = row.innerText;
                
                /* Tìm xem dòng này có chứa ID nào trong danh sách file không */
                const isHocVienHomNay = activeIDs.find(id => rowText.includes(id));
                
                const buttons = Array.from(row.querySelectorAll('a, button, span'));
                const enableBtn = buttons.find(el => el.textContent.trim().toLowerCase() === 'enable');
                const disableBtn = buttons.find(el => el.textContent.trim().toLowerCase() === 'disable');

                if (isHocVienHomNay) {
                    /* Nếu có trong file -> Bấm Enable */
                    if (enableBtn) {
                        enableBtn.click();
                        enabledCount++;
                        await new Promise(r => setTimeout(r, 600)); /* Nghỉ 0.6s tránh nghẽn server */
                    }
                } else {
                    /* Nếu không có trong file -> Bấm Disable để nhường chỗ */
                    if (disableBtn) {
                        disableBtn.click();
                        disabledCount++;
                        await new Promise(r => setTimeout(r, 600));
                    }
                }
            }
            alert("HOÀN TẤT!\n- Đã Enable: " + enabledCount + " máy học viên.\n- Đã Disable: " + disabledCount + " máy khác để trống slot.");
        };
        reader.readAsText(file);
    };
    input.click();
})();