摘 要: 針對(duì)計(jì)算機(jī)實(shí)驗(yàn)室提供的考試服務(wù),筆者設(shè)計(jì)了一個(gè)具有服務(wù)器管理模塊和考試控制模塊的考試平臺(tái)。采用VBScript結(jié)合數(shù)據(jù)庫(kù)技術(shù)實(shí)現(xiàn)服務(wù)器管理模塊,采用.NET平臺(tái)以C#語(yǔ)言實(shí)現(xiàn)了考試控制模塊,考試控制模塊借助廣播發(fā)出考試控制指令,考試機(jī)上的駐守程序接收并執(zhí)行相應(yīng)的考試控制指令。經(jīng)過(guò)多年的實(shí)際運(yùn)行表明該考試平臺(tái)能夠?yàn)槎喾N考試提供服務(wù)。
關(guān)鍵詞: 局域網(wǎng) 考試平臺(tái) 計(jì)算機(jī)考試
高校計(jì)算機(jī)類實(shí)驗(yàn)室通常不僅要承擔(dān)計(jì)算機(jī)相關(guān)課程的實(shí)驗(yàn)教學(xué)工作,而且要承擔(dān)計(jì)算機(jī)相關(guān)課程考試、計(jì)算機(jī)等級(jí)考試、職稱計(jì)算機(jī)考試,以及社會(huì)性選拔考試等工作。在這些種類繁多考試中,部分考試有專門(mén)的考試系統(tǒng),例如全國(guó)計(jì)算機(jī)等級(jí)考試。但眾多其他的考試卻沒(méi)有一個(gè)能夠統(tǒng)一的考試平臺(tái),每次考試時(shí),實(shí)驗(yàn)室工作人員的準(zhǔn)備工作量都很大,考試的過(guò)程管理、考試結(jié)果的收集都很困難。所以設(shè)計(jì)一個(gè)能夠適應(yīng)大多數(shù)計(jì)算機(jī)考試的考試平臺(tái)就顯得很有必要。
1.系統(tǒng)分析
計(jì)算機(jī)考試平臺(tái)涉及的主要內(nèi)容有以下幾個(gè)方面:1)考試賬號(hào)管理:考試賬號(hào)管理需要對(duì)每一個(gè)考生分配一個(gè)登錄賬號(hào)和密碼,并分配獨(dú)立且安全地存儲(chǔ)空間;2)試卷發(fā)放:試卷可以按要求隨機(jī)或預(yù)先定義的方式發(fā)放;3)考試結(jié)果收集:考試結(jié)果收集需要快捷方便;4)考試時(shí)間控制:考試時(shí)間控制需要準(zhǔn)確,特別是考試結(jié)束時(shí)一定要通過(guò)技術(shù)手段防止學(xué)生耗時(shí)間;5)考場(chǎng)信號(hào)發(fā)送:考場(chǎng)中的各種指令必須及時(shí)有效地傳送給每一個(gè)考生。
2.系統(tǒng)架構(gòu)
為了實(shí)現(xiàn)考試平臺(tái)中的這五個(gè)主要內(nèi)容,考試平臺(tái)分為兩個(gè)主要控制模塊:考試服務(wù)器管理模塊和考試過(guò)程控制模塊??荚嚪?wù)器管理模塊主要負(fù)責(zé)完成考試賬號(hào)管理、試卷分發(fā)和試卷收集的考試管理功能;考試過(guò)程控制模塊主要完成考試時(shí)間控制、考試信號(hào)發(fā)送及考試現(xiàn)場(chǎng)清理等。
整個(gè)系統(tǒng)采用Windows Server 2003作為考試服務(wù)器,借助Windows的賬號(hào)服務(wù)實(shí)現(xiàn)考試用戶身份驗(yàn)證、Windows文件系統(tǒng)。
3.系統(tǒng)設(shè)計(jì)
3.1服務(wù)器管理模塊
服務(wù)器管理模塊主要采用Windows腳本實(shí)施管理,具體地采用VBScript語(yǔ)言編程實(shí)現(xiàn),主要完成考生用戶創(chuàng)建、考生目錄創(chuàng)建、考生目錄權(quán)限設(shè)置、考生目錄共享等,考生報(bào)名庫(kù)采用Access數(shù)據(jù)庫(kù)存放,通過(guò)在腳本中利用ADO讀取考生信息完成這些功能。其中讀取數(shù)據(jù)庫(kù)后將考生信息填充在一個(gè)ADODB.RecordSet對(duì)象Rs中。下面是幾個(gè)關(guān)鍵功能的示例代碼,其他模塊的實(shí)現(xiàn)代碼風(fēng)格類似。
1)創(chuàng)建考生賬號(hào):
subCreatUser()
setobj=GetObject(\"WinNT://\"DNS)
rs.MoveFirst
While(not rs.eof)
setusr=obj.Create(\"user\",rs(\"KSXH\"))
usr.SetPassword(\"ak*%#1#%_$!@\")
usr.Description=rs(\"KSXB\")rs(\"KSZY\")rs(\"KSXM\")
usr.SetInfo
setusr=nothing
rs.MoveNext
Wend
end sub
2)創(chuàng)建考生目錄并設(shè)置權(quán)限
Sub CreatFoldr()
setfs=createObject(\"Scripting.FileSystemObject\")
setws=WScript.CreateObject(\"WScript.Shell\")
Set fs=CreateObject(\"Scripting.FileSystemObject\")
Set f=fs.OpenTextFile(SCRIPTFILE,F(xiàn)ORWRITING,true)
rs.MoveFirst
While(not rs.eof)
myFoldr=ROOTFOLDR rs(\"KSXH\")
setFoldr=fs.CreateFolder(myFoldr)
setFoldr=nothing
’設(shè)置權(quán)限
f.Write \"cacls \"myFoldr \" /g \"DNS\"\\" rs(\"KSXH\") \":F \"DNS\"\administrator:F f.Writechr(13)chr(10) Wend f.Close ws.run SCRIPTFILE end sub 3)目錄共享 Sub FoldrShar() set cont=GetObject(\"WinNT://\"FILESERVER\"/LanmanServer,F(xiàn)ileService\") rs.MoveFirst While(not rs.eof) set fs1=cont.Create(\"FileShare\",\"j\"rs(\"KSXH\")) fs1.path=ROOTFOLDR rs(\"KSXH\") fs1.MaxUserCount=-1 fs1.SetInfo set fs1=nothing rs.movenext Wend end sub 3.2考試過(guò)程模塊 考試過(guò)程模塊由考試機(jī)駐守程序和考試控制管理端組成,考試控制端完成。采用.NET平臺(tái),C#語(yǔ)言開(kāi)發(fā)而成。 1)考試機(jī)駐守程序完成考生登錄(見(jiàn)圖一)和接受并執(zhí)行考試控制管理端的遠(yuǎn)程命令功能。 考生在登錄界面填寫(xiě)正確的考號(hào)和密碼后點(diǎn)擊網(wǎng)絡(luò)登錄,即可完成考生盤(pán)的映射,并打開(kāi)預(yù)先配置好的考試軟件。其中映射考生盤(pán)的關(guān)鍵代碼如下: stringServerIP = @\"\\192.168.8.200\"; stringUserName = txbID.Text.Trim(); stringUserPwd = txbPwd.Text.Trim(); Utility.DriveMap.Map2NetDrive(ServerIP + @\"\\" + UserName, \"H:\", UserName, UserPwd); lbmsg.Text = \"登陸成功!\";this.Refresh(); Utility.Command.Execute(\"Explorer\", \"h:\\\", 1); 在映射好考生盤(pán)后,界面隱藏,程序在后臺(tái)駐守,監(jiān)聽(tīng)、接受并執(zhí)行相應(yīng)的考試指令。其中監(jiān)聽(tīng)的實(shí)現(xiàn)方法是在8899端口監(jiān)聽(tīng)。具體代碼如下: Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); IPEndPointiep = new IPEndPoint(IPAddress.Any, 8899); socket.Bind(iep); ep = (EndPoint)iep; byte[] bytes = new byte[1024]; while (true){ socket.ReceiveFrom(bytes, ref ep); receiveData=System.Text.Encoding.Unicode.GetString(bytes); receiveData = receiveData.TrimEnd('\u0000'); hide = true; cmd = receiveData; if (cmd != \"\"){ break; } } socket.Close(); socket = 1; 駐守程序在接收到指令后,分解指令并執(zhí)行,就可以直接完成將控制端發(fā)送的考試控制指令。 2)考試控制端,主要采用廣播的方式利用UDP協(xié)議基于套接字向子網(wǎng)中廣播發(fā)送考試控制指令,發(fā)送的考試控制指令主要有屏幕鎖屏、允許登錄、清理考試機(jī)程序、考試時(shí)間核定、提交試卷、重啟或關(guān)閉計(jì)算機(jī)等,并可以通過(guò)考試控制端預(yù)先設(shè)置好的流程管理考試機(jī),實(shí)現(xiàn)考試指令的自動(dòng)發(fā)送、實(shí)現(xiàn)考試時(shí)間的自動(dòng)控制。其中發(fā)送廣播信息的關(guān)鍵代碼如下: public static void SendMessage(string msg) { Socketsocket=new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp); IPEndPointiep=new IPEndPoint(IPAddress.Broadcast,8899); socket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.Broadcast,1); byte[]bytes = System.Text.Encoding.Unicode.GetBytes(msg); socket.SendTo(bytes,iep); socket.Close(); } 4.結(jié)論 考試系統(tǒng)設(shè)計(jì)完成后,在重慶三峽學(xué)院數(shù)學(xué)與計(jì)算機(jī)科學(xué)學(xué)院及計(jì)算機(jī)中心成功運(yùn)行5年,支撐了多門(mén)計(jì)算機(jī)課程教學(xué)科目的考試工作,特別多次支撐重慶市非計(jì)算機(jī)專業(yè)的計(jì)算機(jī)等級(jí)考試及人事局主持的職稱計(jì)算機(jī)考試等。具有運(yùn)行效果良好、操作簡(jiǎn)單、系統(tǒng)穩(wěn)定、效率高、安全性好的特點(diǎn)。 參考文獻(xiàn): [1][美]金斯利-休斯(Kingsley-Hughes,A),[美]金斯利-休斯(Kingsley-Hughes,K).VBScript程序員參考手冊(cè)[M].清華大學(xué)出版社,2009. [2]郝秀蘭.Windows Server 2003網(wǎng)絡(luò)管理實(shí)用教程[M].人民郵電出版社,2011. [3][美]瑞奇特著.周靖譯.CLR via C#(第3版)[M].清華大學(xué)出版社,2010.