Được xây dựng nhằm quản lý việc truy cập Internet của sinh viên, học sinh… đảm bảo thực hiện đúng nội dung bài học. Để thực hiện được chức năng này ta thực hiện như sau: Vào “Menu” chọn “Quản Lý Internet” chọn “Ngắt Internet” nếu muốn cấm truy cập Internet và chọn “Cho Phép Internet” nếu cho phép sử dụng Internet.
Hình 3.14. Giao diện quản lý Internet.
Xây dựng chương trình phía máy chủ:
Khi người sử dụng kích hoạt chức năng tại phía máy chủ tạo ra một gói tin gửi đến phía máy trạm. Gói tin có thể là cho phép kết nối Internet hoặc không cho phép kết nối Internet.
Xây dựng chương trình phía máy trạm:
Có rất nhiều phương pháp có thể quản lý được Internet của người sử dụng như không thiết lấp địa chỉ default gateway, không cài driver mạng, hay có thể loại bỏ driver mạng tạm thời. Tuy nhiên, việc sử dụng các phương pháp trên vào chương trình không đáp ứng được yêu cầu vì chương trình được thiết kế theo mô hình Server – Client nên nếu áp dụng một trong nhưng cách trên ảnh hưởng trực tiếp đến chương trình. Vì vậy, chúng ta cần có một giải pháp đảm bảo vừa quản lý được mạng Internet nhưng vẫn có thể áp dụng được mô hình Server – Client.
Giải pháp ở đây được đưa ra đó là quản lý tất cả các trình duyệt web của các máy trạm như Chrome, Firefox, Opera, IE, Corom….
Để thực hiện được chức năng, phía máy trạm đầu tiên sẽ lấy toàn bộ danh sách các tiến trình, chương trình đang được hoạt động tại máy mình kiểm tra nếu các trình duyệt web đang được mở sẽ đóng lại. Chương trình tự động quét lại toàn bộ các tiến trình sau 1 giây để đảm bảo các trình duyệt luôn bị cấm.
KẾT LUẬN
Trong thời gian thực hiện đề tài, Em đã hoàn thành hệ thống “Phần mềm quản lý phòng máy thực hành tin học Trường Đại học Hùng Vương” trên ngôn ngữ C#. Phần mềm đã đáp ứng được một số các chức năng quản lý cơ bản như:
- Xem, điều khiển được máy trạm từ máy chủ.
- Quản lý tốt các cổng USB của máy trạm thông qua duy nhất một thao tác bật, tắt.
- Quản lý việc sử dụng mạng Internet của các máy trạm từ phía máy chủ. - Quản lý thời gian làm bài kiểm tra tại phòng máy.
- Hỗ trợ giao tiếp giữa giáo viên và sinh viên thông qua chức năng chat văn bản.
- Hỗ trợ gửi dữ liệu thông qua mạng LAN.
- Hỗ trợ việc tắt máy, khởi động lại các máy trạm đồng bộ.
Do chương trình mới được đưa vào chạy thử nghiệm trên chương trình máy ảo nên có thể phần mềm có thể chưa đáp ứng được hết các yêu cầu của người quản trị. Nếu có điều kiện phát triển đề tài có thể được mở rộng theo hướng sau:
- Cải tiến giao diện để thuận tiện hơn nữa cho người dùng.
- Xây dựng cơ chế khởi động các máy trạm từ máy chủ bằng phương pháp Wake On LAN.
Trong quá trình thực hiện đề tài, khả năng làm việc của bản thân còn nhiều hạn chế, cho nên đề tài không tránh khỏi những sai sót, Em rất mong nhận được sự góp ý của các thầy cô và bạn bè.
TÀI LIỆU THAM KHẢO
[1] Dương Bảo Ninh (2009), Mạng máy tính, Trường Đại học Đà Lạt.
[2] Nguyễn Ngọc Bình Phương – Thái Thanh Phong (2006), Các giải pháp lập trình C#, Nhà xuất bản Đại học Giao thông vận tải.
[3] Phạm Thế Quế (2006), Sách hướng dẫn học tập mạng máy tính, Học viện Công nghệ Bưu chính Viễn thông.
[4] Nguyễn Tri Tuấn (2010), lập trình windows, Trường Đại học Khoa học Tự nhiên – Đại học Quốc gia TPHCM
PHỤ LỤC
Phụ lục 1: Các phương thức kết nối. 1.1. Phương thức khởi động máy chủ
public void StartServer(){ try{
while (true){
if (!this.server.Pending()){Thread.Sleep(1000); } this.client = this.server.AcceptTcpClient();
this.clientProgram = new ClientProgram(this.client); this.listClients.Add(this.clientProgram); this.clientProgram.OnSendFilename += new SendFilenameEventHandler(clientProgram_OnSendFilename); this.clientProgram.OnReceiveMessage += new ReceiveMessageEventHandler(clientProgram_OnReceiveMessage); this.clientProgram.OnReceiveFilename += new ReceiveFilenameEventHandler(clientProgram_OnReceiveFilename); this.clientProgram.OnUSBDetected += new USBDetectedEventHandler(clientProgram_OnUSBDetected); this.clientProgram.OnGetListProcesses += new this.clientProgram.OnAttendenceCheck += new AttendenceCheckEventHandler(clientProgram_OnAttendenceCheck); this.clientProgram.OnClientExit += new ClientExitEventHandler(clientProgram_OnClientExit); if (this.OnNewClient != null){ this.OnNewClient(this, new NewClientEventArgs(this.clientProgram.GetIPAddress())); } Catch{
MessageBox.Show("lỗi khởi động", "lỗi", MessageBoxButtons.OK,
MessageBoxIcon.Error);
} }
1.2. Phương thức kết nối phía máy chủ
private void MainForm_Load(object sender, EventArgs e) {
try {
string[] listClients =
AccessConfigFile.ReadFile("ListClients.dat").Split('|'); foreach (string client in listClients){
if (client.Trim().Length > 0){
this.listView1.Items.Add(client, 7); }
}
this.attendenceCheckForm = new AttendenceCheckForm(); this.attendenceCheckForm.OnActiveAttendenceCheck += new ActiveAttendenceCheckEventHandler(attendenceCheckForm_OnAc tiveAttendenceCheck); this.attendenceCheckForm.OnSaveListStudentsToFile += new SaveListStudentsToFileEventHandler(attendenceCheckForm_OnS aveListStudentsToFile);
this.saveFileToDirectory = new SaveFileToDirectory(); this.saveFileToDirectory.OnSaveFileToDirectory += new SaveFileToDirectoryEventHandler( saveFileToDirectory_OnSaveFileToDirectory); } Catch {
MessageBox.Show("Lỗi kết nối đến máy chủ", "Lỗi kết nối",
MessageBoxButtons.OK, MessageBoxIcon.Error); }
1.3. Phương thức khởi động phía máy trạm
public void StartClient(){ try {
this.tTimeOut = new Thread(new ThreadStart(ConnectTimeOut)); this.tTimeOut.Start();
this.startConnect = Environment.TickCount; this.client.Connect(this.ep); if (this.tTimeOut != null){ this.tTimeOut.Abort(); } Thread.Sleep(10); this.client.ReceiveTimeout = 300000 this.client.SendTimeout = 300000 this.ns = this.client.GetStream(); sw = new StreamWriter(ns);
this.tSendThread = new Thread(new ThreadStart(Send)); this.tSendThread.Priority = ThreadPriority.Lowest; this.tSendThread.Start();
this.tReceiveThread = new Thread(new ThreadStart(Receive)); this.tReceiveThread.Priority = ThreadPriority.Lowest;
this.tReceiveThread.Start(); this.SetMessageBox(); this.SetProgressBar(); if (this.tMainThread != null){ this.tMainThread.Abort(); } } catch{
MessageBox.Show("lỗi khởi động máy trạm ","lỗi khởi
động", MessageBoxButtons.OK, MessageBoxIcon.Error);
} }
1. Xây dựng chức năng nhận diện cổng USB • Phía máy chủ
private void nhậnDiệnUsbToolStrIPMenuItem_Click(object sender, EventArgs e)
{
foreach (ClientProgram c in this.server.listClients){ if (this.enableUSBDetectToolStrIPMenuItem.Checked) {
this.package = new DataPackage(Command.USBDectect, null, 1); c.sendQueue.Enqueue(this.package);
} else {
this.package = new DataPackage(Command.USBDectect, null, 0); c.sendQueue.Enqueue(this.package); } } } • Phía máy trạm using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Threading; namespace Client { class USBDetect {
public event USBDetectedEventHandler OnUSBDetected = null; private Thread startUSBDetect = null;
public void Start() {
ThreadStart(StartUSBDetect)); this.startUSBDetect.Start(); }
private void StartUSBDetect() {
while (true){
Thread.Sleep(1000);
foreach (DriveInfo d in DriveInfo.GetDrives()){ if (d.DriveType == DriveType.Removable)
{
if (this.OnUSBDetected != null){
this.OnUSBDetected(this, new USBDetectedEventArgs()); } this.Stop(); break; } } } }
public void Stop() {
if (this.startUSBDetect != null){ this.startUSBDetect.Abort(); } } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; namespace Client { class LockAndUnLockUsb {
public static void StartLock(){ try
{
Microsoft.Win32.Registry.SetValue(@"HKEY_LOCAL_MACHINE\ SYSTEM\CurrentControlSet\Services\USBSTOR", "Start", 4 Microsoft.Win32.RegistryValueKind.DWord); }
Catch {} }
public static void StartUnLockUSB(){ try
{
Microsoft.Win32.Registry.SetValue(@"HKEY_LOCAL_MACHINE\ SYSTEM\CurrentControlSet\Services\USBSTOR", "Start", 3, Microsoft.Win32.RegistryValueKind.Dword
}
Catch{} }
} }
• Phía máy chủ
private void LockUsbToolStrIPMenuItem_Click(object sender,
EventArgs e){
foreach (ClientProgram c in this.server.listClients){
c.sendQueue.Enqueue(new DataPackage(Command.Cmd, null, 1)); c.sendQueue.Enqueue(CommandType.lockUsb);
} }
• Phía máy trạm
case CommandType.lockUsb:
LockAndUnLockUsb.StartLock(); Break;
3. Xây dựng chức năng mở cổng USB • Phía máy chủ
private void UnlockUsbToolStrIPMenuItem_Click(object sender,
EventArgs e) {
foreach (ClientProgram c in this.server.listClients) {
c.sendQueue.Enqueue(new DataPackage(Command.Cmd, null, 1)); c.sendQueue.Enqueue(CommandType.UnLockUsb);
} }
• Phía máy trạm
case CommandType.UnLockUsb:
LockAndUnLockUsb.StartUnLockUSB(); break;
Phụ lục 3: xây dựng chức năng tắt máy 3.1. Xây dựng chương trình phía máy chủ
private void shutdownAllClientsToolStrIPMenuItem_Click(object sender, EventArgs e){
foreach (ClientProgram c in this.server.listClients){ c.sendQueue.Enqueue(new DataPackage(Command.Cmd, null, 1));
c.sendQueue.Enqueue(CommandType.Shutdown); }
foreach (ListViewItem i in this.listView1.Items){ this.ChangeIcon(i, 6);
}
this.listView1.Refresh(); }
private void standByAllClientsToolStrIPMenuItem_Click(object sender, EventArgs e){
foreach (ClientProgram c in this.server.listClients){
c.sendQueue.Enqueue(new DataPackage(Command.Cmd, null, 1)); c.sendQueue.Enqueue(CommandType.Standby);
}
foreach (ListViewItem i in this.listView1.Items){ this.ChangeIcon(i, 1);
}
this.listView1.Refresh(); }
private void logOffAllClientsToolStrIPMenuItem_Click(object sender, EventArgs e){
foreach (ClientProgram c in this.server.listClients){ c.sendQueue.Enqueue(new DataPackage(Command.Cmd, null, 1));
c.sendQueue.Enqueue(CommandType.LogOff); }
foreach (ListViewItem i in this.listView1.Items) {
this.ChangeIcon(i, 4); }
this.listView1.Refresh(); }
private void restartAllClientsToolStrIPMenuItem_Click(object sender, EventArgs e){
foreach (ClientProgram c in this.server.listClients){ c.sendQueue.Enqueue(new DataPackage(Command.Cmd, null, 1));
c.sendQueue.Enqueue(CommandType.Restart); }
foreach (ListViewItem i in this.listView1.Items){ this.ChangeIcon(i, 5);
}
this.listView1.Refresh(); }
private void hibernateAllCliToolStrIPMenuItem_Click(object sender, EventArgs e){
foreach (ClientProgram c in this.server.listClients){ c.sendQueue.Enqueue(new DataPackage(Command.Cmd, null, 1));
c.sendQueue.Enqueue(CommandType.Hibernate); }
foreach (ListViewItem i in this.listView1.Items){ this.ChangeIcon(i, 2);
}
this.listView1.Refresh(); }
private void lockAllClientsToolStrIPMenuItem_Click(object sender, EventArgs e){
foreach (ClientProgram c in this.server.listClients){
c.sendQueue.Enqueue(new DataPackage(Command.Cmd, null, 1)); c.sendQueue.Enqueue(CommandType.LockComputer);
}
this.ChangeIcon(i, 3); }
this.listView1.Refresh(); }
3.2. Xây dựng Class TurnOffComputer phía máy trạm
using System; using System.Collections.Generic; using System.Text; using System.Diagnostics; using System.Runtime.InteropServices; using System.Windows.Forms; using Org.Mentalis.Utilities; namespace Client { class TurnOffComputer{
public static void LogOff(){ try{
WindowsController.ExitWindows(RestartOptions.LogOff, true);
}
catch {
MessageBox.Show("lỗi LogOff ","Lỗi ”, MessageBoxButtons.OK,
MessageBoxIcon.Error);}
}
public static void Reboot(){ try{
WindowsController.ExitWindows(RestartOptions.Reboot, true);
}
catch{
MessageBox.Show("lỗi khởi động ","Lỗi ”,
MessageBoxButtons.OK, MessageBoxIcon.Error);} }
}
try{
WindowsController.ExitWindows(RestartOptions.ShutDown, true);
}
catch{
MessageBox.Show("lỗi tắt máy","Lỗi ”, MessageBoxButtons.OK,
MessageBoxIcon.Error);}
} }
public static void StandBy(){ try{
WindowsController.ExitWindows(RestartOptions.Suspend, true);
}
catch{
MessageBox.Show("lỗi Suspend ","Lỗi ”, MessageBoxButtons.OK,
MessageBoxIcon.Error);}
} }
public static void Hibernate() {
try{
WindowsController.ExitWindows(RestartOptions.Hibernate,
true); }
catch{
MessageBox.Show("lỗi Hibernate ","Lỗi ”,
MessageBoxButtons.OK, MessageBoxIcon.Error);} }
}
public static void LockComputer(){ try
{
WindowsController.ExitWindows(RestartOptions.PowerOff, true);
}
catch{
MessageBoxIcon.Error); }
} } }
3.3. Xây dựng chương trình phía máy trạm
case CommandType.LogOff:
TurnOffComputer.LogOff(); break;
case CommandType.Restart:
TurnOffComputer.Reboot(); break;
case CommandType.Standby:
TurnOffComputer.StandBy(); break;
case CommandType.Shutdown:
TurnOffComputer.Shutdown(); break;
case CommandType.Hibernate:
TurnOffComputer.Hibernate(); break;
Phụ lục 4: xây dựng chức năng chat
4.1. Xây dựng chương trình phía máy chủ
private void
sendMessageToAllClientsToolStrIPMenuItem_Click(object sender,
EventArgs e){
this.message = new MyMessage(); this.message.OnSendMessage += new
SendMessageEventHandler(message_OnSendMessage);
this.message.Show(); }
4.2. Xây dựng phía máy trạm
private void btnSend_Click(object sender, EventArgs e){ if (this.OnSendMessage != null){ this.OnSendMessage(this, new MessageEventArgs(this.tbxMessage.Text)); } this.lbxListMessages.Items.Add("Tôi: " + this.tbxMessage.Text); this.tbxMessage.Text = null; this.tbxMessage.Focus(); }
Phụ lục 5: xây dựng chức năng gửi dữ liệu 5.1. Xây dựng chương trình phía máy chủ
private void btnOK_Click(object sender, EventArgs e){ if (this.OnSaveFileToDirectory != null){ this.OnSaveFileToDirectory(this, new SaveFileToDirectoryEventArgs(this.folderBrowserDialog1.Select edPath)); } }
5.2. Xây dựng chương trình phía máy trạm
case Command.Data: try { totalBytes = package.DataLength; currentBytes = 0; if (this.OnReceiveFilename != null){ this.OnReceiveFilename(this, new FilenameEventArgs(package.Filename)); } if (this.filePath == null)
this.filePath = Application.StartupPath;
this.fs = new FileStream(this.filePath + @"\" +
package.Filename,FileMode.Create, FileAccess.Write); while (currentBytes < totalBytes){
tam = currentBytes;
buffer = new byte[1024];
receiveBytes = this.ns.Read(buffer, 0, 1024); currentBytes += receiveBytes;
this.ns.Flush();
this.fs.Write(buffer, 0, receiveBytes); this.fs.Flush();
percent = (int)(Math.Round(((double)currentBytes / (double)totalBytes) * 100, 1)); if (this.OnReceiveFilePercent != null){ this.OnReceiveFilePercent(this, new PercentEventArgs(percent)); } }
switch (MessageBox.Show("Bạn vừa nhận file '" +
package.Filename + "' từ server.\n Bạn có muốn mở thư mục chứa file vừa nhận không?", "Thông Báo",
MessageBoxButtons.YesNo,MessageBoxIcon.Information)) {
case DialogResult.Yes:
ProcessStartInfo(this.filePath); Process.Start(startInfo);
break;
case DialogResult.No: break; } } catch { if (this.progressBar != null){ this.progressBar.Close(); }
MessageBox.Show("Lỗi nhận file " + package.Filename + " từ
server.", "Thông Báo",MessageBoxButtons.OK,
MessageBoxIcon.Error); if (this.fs != null){ this.fs.Flush(); this.fs.Close(); this.fs.Dispose(); }
fileInfo = new FileInfo(this.filePath + @"\" + package.Filename);
if (fileInfo.Exists){ fileInfo.Delete(); }
if (this.OnRestartClient != null){
this.OnRestartClient(this, new EventArgs()); }
} break;
Phụ lục 6: Xây dựng chức năng điều khiển máy trạm 6.1. Xây dựng chức năng phía máy chủ
void start(){ try{
url = "Tcp://" + IPAdress + ":6600/MyCaptureScreenServer"; chan = new TcpChannel();
ChannelServices.RegisterChannel(chan,false);
obj = (ScreenCapture)Activator.GetObject( typeof(ScreenCapture), url);
connected = true;
timer1.Enabled = true; }
catch (Exception) { stop(); }; }
6.2. Xây dựng Class CaptureScreenShot phía máy trạm
using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Drawing; using System.Windows.Forms; using System.Drawing.Imaging; namespace Client { class CaptureScreenShot{
public static Bitmap Capture(){ try{
Bitmap bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
Screen.PrimaryScreen.Bounds.Height,
PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(bmp);
g.CopyFromScreen(Screen.PrimaryScreen.Bounds.X,
Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy); return bmp; } catch{ return null; } }
public static byte[] ConvertBitmapToByteArray(Bitmap bmp){ MemoryStream stream = new MemoryStream();
bmp.Save(stream, ImageFormat.Png); return stream.ToArray(); } catch{ return null; } finally { stream.Flush(); stream.Close(); stream.Dispose(); } } } }
6.3. Xây dựng chức năng phía máy trạm
case CommandType.ViewClientDesktop:
buffer = CaptureScreenShot.ConvertBitmapToByteArray( CaptureScreenShot.Capture());
package = new DataPackage(Command.Cmd, null, buffer.Length);
this.sendQueue.Enqueue(package); this.sendQueue.Enqueue(CommandType.ViewClientDesktop); this.sendQueue.Enqueue(buffer);
Phụ lục 7: xây dựng chức năng quản lý thi 7.1. Xây dựng chương trình phía máy chủ
private void btnstart_Click(object sender, EventArgs e) { try{ time = int.Parse(txttime.Text); timer1.Enabled = true; timer1.Start(); timer1.Interval = 1000; btnstart.Enabled = false; } catch {
MessageBox.Show("Thời gian nhập vào phải là số nguyên
dương", "Lỗi Nhập Thời Gian", MessageBoxButtons.OK,
MessageBoxIcon.Error); }
}
7.2. Xây dựng chức năng phía máy trạm
case CommandType.LockKeyBoardAndMouse: kb = new KeyboardHook();
frmLockMouse frm = new frmLockMouse();
MessageBox.Show("Đã khóa bàn phím và chuột","Thông Báo",;
Phụ lục 8: xây dựng chức năng quản lý Internet 8.1. Xây dựng chương trình phía máy chủ
private void ngắtInternetToolStrIPMenuItem_Click(object sender, EventArgs e){
foreach (ClientProgram c in this.server.listClients){
c.sendQueue.Enqueue(new DataPackage(Command.Cmd, null, 1)); c.sendQueue.Enqueue(CommandType.stopinternet);
} }
private void choPhépInternetToolStrIPMenuItem_Click(object sender, EventArgs e){
foreach (ClientProgram c in this.server.listClients){
c.sendQueue.Enqueue(new DataPackage(Command.Cmd, null, 1)); c.sendQueue.Enqueue(CommandType.startinternet);
} }
8.2. xây dựng class LockInternet
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Runtime; using System.Diagnostics; namespace Client { class Lockinternet {
private static Thread getprocess = null; public static void Start() {
getprocess = new Thread(new ThreadStart(killprocess)); getprocess.Start();
}
public static void killprocess() { while (true){
Thread.Sleep(1000);
foreach (Process p in Process.GetProcesses()){ if (p.ProcessName == "chrome" || p.ProcessName ==
"firefox" || p.ProcessName == "iexplore" || p.ProcessName == "opera" || p.ProcessName == "safari" ||p.ProcessName == "corom") {
p.Kill(); }
} } }
public static void enableprocess() { if (getprocess != null) { getprocess.Abort(); } } } }
8.3. xây dựng chương trình phía máy trạm
case CommandType.stopinternet: buffer =
BitConverter.GetBytes((int)CommandType.stopinternet); break;
case CommandType.startinternet: buffer =
BitConverter.GetBytes((int)CommandType.startinternet);