摘要:針對如今企事業單位局域網內部打印機管理難的問題,提出了利用活動目錄來實現打印機的管理。設計了基于活動目錄的打印機監控系統。通過該系統,注冊用戶可以直接打印,無論是否成功均會以日志的形式被記錄進數據庫中。未注冊用戶無權打印文件。當系統檢測到非法用戶,將會自動刪除打印任務,并記錄打印日志。經過測試證明,該方案能實現對用戶和打印任務進行有效的監控,為企業內部的打印機管理提供了方便、快捷的途徑。
關鍵詞:打印機監控; 活動目錄; 系統設計
中圖分類號:TP311.11文獻標志碼:A
文章編號:1001-3695(2007)12-0217-03
如今,打印機的管理還處于人工處理階段,缺乏有效的管理手段和工具,多數公司和企事業單位在打印機管理上出現了一些困難和問題。這些問題是多方面的:a)對打印的人員沒有進行認證和檢驗,對打印的內容沒有什么限制,往往是任何人可以打印任何東西,不管是這些東西是不是機密文檔,即使非內部人員打印了機密文檔也無法追查,造成機密文檔的泄密;b)不知道究竟是誰在打印,打印了些什么無法統計、核算打印成本處于混亂、無序之中,缺乏一個有效的管理;c)打印費用居高不下,打印機關鍵部件損耗快,更換費用高,員工存在普遍的隨意打印現象,紙張浪費嚴重,經常是打印機邊上一大堆無人認領的廢紙。
針對這些問題,筆者設計了基于活動目錄的打印機監控系統。本系統的主要任務是對企事業單位局域網內部的共享打印機進行管理。要實現的功能基本上分為幾部分:首先,用戶打印時需要注冊,沒有注冊的用戶無權進行打印,如果系統檢測到是非法用戶,將會自動刪除打印任務,并記錄打印日志;對合法用戶,系統不作任何的提示,但不論是打印成功還是不成功均會以日志的形式被記錄進數據庫中。
系統提供對打印記錄的遠程查詢,通過網絡用戶可以方便地對打印日志記錄進行查詢。管理員還可以遠程地對打印用戶進行管理。對打印機的管理提供了極大的方便。
1活動目錄概述
活動目錄服務接口(active directory services interfaces,ADSI)所屬類別為服務器,是一種目錄服務抽象接口。與組件對象模型(COM)兼容的編程語言,如Visual Basic、VBScript、JavaScript、C和C++類似。可以使用該接口對基礎目錄服務進行一般的目錄調用。ADSI是一類開放接口。這類接口從不同的網絡提取目錄服務的功能為網絡資源的訪問及管理提供一個單一的視圖。不管是哪個網絡環境包含這些資源,系統管理員和開發人員均可以利用ADSI的功能來列舉與管理一個目錄服務中的資源。該目錄既可以是基于LDAP的目錄,也可以是基于NDS或基于NTDS的目錄。至于是哪種并無關系,只要服務提供者所提供的目錄服務是有效的。它主要是解決四個方面的問題:a)使單個客戶登錄到多個目錄成為可能;b)使只將應用程序寫入一個API就可在多個目錄工作成為可能;c)使最終用戶更容易查找到豐富的目錄查詢信息;d)使多目錄管理更容易。
活動目錄允許組織機構按照層次式的、面向對象的方式存儲信息,并且提供支持分布式網絡環境的多主復制機制。 它使用對象來代表諸如用戶、組、主機、設備及應用程序這樣的網絡資源,并使用容器來代表組織(如市場部)或相關對象的集合(如打印機)。它將信息組織成由這些對象和容器組成的樹結構,如圖1所示。
此外,活動目錄通過提供單一、集中、全面的視圖來管理對象集合與容器集合間的聯系。這使得資源在一個高度分布式的網絡中更容易被定位、管理和使用。其層次式結構具有靈活性并且可以進行配置。因此,組織機構能夠按照一種優化自身可用性和管理能力的方法對資源進行組織。使用活動目錄服務可以為操作系統的服務器中的網絡管理員、開發者和用戶提供訪問目錄的能力。這樣可有三個優點,即簡化管理任務、加強網絡安全性、通過互操作使用現存網絡[5]。
在本系統中用得最多的是IADsContainer、IADsPrintQueue、IADsPrintQueueOperations、IADsPrintJob、IADsPrintJobOperations類容器。下面簡要介紹這些類容器的功能。
IADsContainer可以使ADSI容器物件產生、刪除和管理其他的active directory物件。容器物件被用來組織active directory的階層式架構。
IADsPrintJob接口可以使COM構建在active directory管理一般關于打印機工作信息。用IADsPrintQueueOperations來管理這個打印機工作本身。
IADsPrintQueue接口可以使在Active Directory 的COM構件去管理網絡上打印機工作列表的信息。為了列出或修改打印機隊列中的打印任務,必須使用IADsPrintQueueOperations::PrintJobs獲取在ADSI PrintJob Objects聚集的接口。
IADsPrintQueueOperations接口可使active directory中的COM構件支持控制網絡上打印機的打印任務列表屬性和方法。
2Windows系統打印流程
在Windows中,一個進程的打印操作以作業形式提交給打印調度池;打印調度池在后臺管理打印作業。打印作業是以EMF spool files形式出現的,每個EMF spool files各自對應一個打印作業。根據Windows中Word文檔的打印流程來說明Windows系統下的打印體系結構,如圖2所示。
a)為打印一篇Word文檔,winword.exe在它的進程空間加載gdi32.dll動態庫,調用GDI提供的打印函數進行打印操作;
b)gdi32.dll調用winspool.drv驅動,將winword.exe打印Word文檔的操作形成EMF文件,以供打印調度池管理;
c)打印池調度程序spoolsv.exe接收打印作業并對其提交的打印作業進行管理;
d)打印處理器winprint.dll具體處理EMF spool files打印作業文件,因為EMF spool files是GDI函數調用的記錄,所以打印處理器調用gdi32.dll動態庫,gdi32.dll進而統一打印驅動程序unidrv.dll,并與unidrv.dll共同完成打印操作的處理;
e)通過本地打印提供者程序localprint.dll發送至打印機進行打印。在打印調度池進程空間還有其他的一些動態庫程序,它們完成與打印相關的其他功能,如打印作業路由、端口監視等。
3打印機監控系統設計
3.1總體結構圖(圖3)
系統首先對用戶的合法性進行驗證。把用戶信息放在一個后臺數據庫中,并利用網絡進行管理,管理員可以遠程地對用戶進行添加和刪除。當一個用戶裝入打印隊列時,如果用戶是非法的,則馬上對用戶的打印任務進行刪除,并記錄日志信息。如果用戶的信息合法則可以直接打印并記錄打印日志。
對打印日志的查詢方式靈活,可以遠程查詢,并可以很輕松地進行統計查詢。對打印日志數據進行分析和管理。
3.2打印機監控系統詳細設計流程(圖4)
為了實現監控打印機的功能,首先要得到本系統中的打印機信息,確定打印機的具體位置和驅動程序,繼而得到打印機的控制句柄。通過打印機的打印句柄可以得到掃描打印隊列中的打印隊列情況,繼而可以對打印隊列進行監控。每個打印隊列均有一個用戶。通過后臺數據庫的用戶信息可以知道該用戶是否合法。如果合法允許打印;如果不合法,則刪除打印隊列。不管是打印成功還是失敗,均要記錄打印日志信息,便于管理員進行統計查詢和分析。
4系統實現
具體實現的核心代碼如下:
For Each pj In pQOps.PrintJobs
Set pjOps=pj
If pQOps.Name <> \"\" And SearchArray(tempUsers, pj.User)=0 Then
If InStr(LCase(Trim(GetJobStatus(pjOps.status))), \"delet\")=0 Then
pQOps.PrintJobs.Remove pj.Name
DoEvents
msg1S=\"抱歉,你沒有打印權限,打印任務已被取消.請與管理員聯系!\"
msg2S=\"Error Alert!\"
r=MsgBox(msg1S, vbDefaultButton1, msg2S)
You should mark the invalid user field in the database
SqlTxt=\"select * from printingLog\"
Set pRst=ExecuteSQL(SqlTxt)
DoEvents
pRst.AddNew
pRst.Fields(1)=Trim(pj.User)′user name
……
pRst.Fields(6)=Trim(pj.TimeSubmitted) ′submit time
DoEvents
……
End If
′——show print job information in the ListItem——
Set newLine=ListView1.ListItems.Add(, , pj.Priority)
newLine.SubItems(1)=pj.Description
newLine.SubItems(2)=pj.User
Else′The use is valid
If SearchArray(pjobArray, pj.Name)=0 Then ′if not found in array
′——save this project to the temp array——
CurSeat=GetCurrentN(pjobArray) ′get the current seat in array
pjobArray(CurSeat)=pj.Name
DoEvents
SqlTxt=\"select * from printingLog\"
Set pRst=ExecuteSQL(SqlTxt)
DoEvents
pRst.AddNew
……
pRst.Fields(6)=Trim(pj.TimeSubmitted)′submit time
DoEvents
……
End If
Set newLine=ListView1.ListItems.Add(, , pj.Priority)
……
newLine.SubItems(9)=pj.UserPath
End If
針對每一個打印隊列中的打印任務,首先判定發起該任務的打印人名字是否合法。如果不合法,系統就調用remove方法刪除打印任務。為了避免漏檢,系統會不斷地掃描是否有打印任務,并對該任務進行合法性驗證,從而決定下一步的操作。由于系統在刪除正在打印的任務時有時間滯后,這段時間系統還在不斷掃描。為了避免重復進行日志記錄,必須判斷打印任務的狀態。如果已經是刪除狀態,說明該任務已經得到了處理,就不用再處理,繼續進行下一個任務的驗證和處理并記錄打印日志,直到處理完最后一個沒有被驗證的打印任務。
5結束語
系統通過對用戶的注冊授權,使未授權用戶無法使用打印機輸出文件。同時通過日志文件的管理,記錄了授權用戶的活動時間和打印文件名及打印數量。這樣,就使得前面提出的問題得到了解決。在實際應用時需要與其他技術手段配合使用。在以后的工作中,筆者將對本系統進行改進,實現對打印文件的內容進行簡單的檢測和控制,解決應用部門的保密性問題,使系統得到優化。
參考文獻:
[1]張恒鋒,蔡軻.ADSI在Windows 2000權限管理中的應用 [J].計算機與現代化,2003(10):88-90.
[2]王培森.把打印機監控起來[J].辦公自動化,2004(11):39.
[3]李文亞.Windows(2000/XP)下基于應用程序的打印控制[J].計算機工程與設計,2004,25(10):1835-1836,1839.
[4]包懷忠.ADSI在局域網管理中的應用[J].微機發展,2003,13(7):54-56.
[5]鐘亮.基于網絡數據庫身份驗證統計系統設計[J].計算機與現代化,2005(12):66-68.
[6]吳大剛.用VB連接數據庫的幾種方法比較[J].現代情報,2002(8):91-92 .
[7]臧少杰.網站中access數據庫的運用[J].福建電腦,2005(11):148-149.
[8]簡嘉漢,許勝銘.印表工作佇列管理系統[R].臺中:逢甲大學,1991:5-37.
[9]姚衛新.打印機狀態碼的檢測[J].計算機時代,1998(9):26-27.
“本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文”