問:
您好,腳本專家!如何禁用列印機上的“保留列印的文檔”屬性?
-- JJ
答:
您好,JJ。您未提到在哪種作業系統上嘗試此操作,但我們希望是裝有 Windows XP 或 Windows Servers 2003 的計算機。為什麼?嗯,在裝有 Windows XP 或 Windows Servers 2003 的計算機上,這非常容易做到;在其他版本的 Windows 上有點兒難。有多難?嗯,坦白地講,完全不可能。
這确實使得這一任務難以實作。
是的,我們知道:這不公平。但生活就是如此。對于 Windows XP,WMI 類 Win32_Printer 已更新為包含一個新的讀/寫屬性:KeepPrintedJobs。您可能已經猜到了,我們僅需切換該屬性值即可保留(或不保留)指定列印機的列印機作業。遺憾的是,該屬性不存在于任何 Windows XP 之前版本的 Windows 中。至于說 Windows 2000,我們可以使用腳本來告訴我們是否啟用了列印機上的該屬性,但實際上我們并不能改變該值。
注意:令人沮喪的是,ADSI(通常在 Windows 2000 中為列印機管理提供便捷的解決方法)在這裡對我們并沒有多大用處。确實存在一個新的 ADSI 屬性,可供配置“保留列印的文檔”屬性使用,但它對您的 Windows 2000 計算機不會有任何幫助。
但是,假設您正在使用 Windows XP 或 Windows Server 2003,那麼,可以使用如下腳本來禁用“保留列印的文檔”屬性:
strComputer = "."Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")Set colPrinters = objWMIService.ExecQuery _ ("Select * From Win32_Printer Where DeviceID = 'ArtDepartmentPrinter'")For Each objPrinter in colPrinters objPrinter.KeepPrintedJobs = False objPrinter.Put_Next
我們知道:這似乎确實很不公平,您在 Windows 2000 上做不到這一點,而對于 Windows XP 和 Windows Server 2003 而言,這個腳本又非常簡單。(我們不是曾提到生活是不公平的嗎?嗯,事實并非如此。)用于修改 KeepPrintedJobs 屬性的腳本隻是一個普通的 WMI 腳本,其首先連接配接到本地計算機的 WMI 服務上。(盡管通常情況下這對遠端計算機同樣适用。)然後,我們發出以下查詢,以傳回計算機上所有 DeviceID 為 ArtDepartmentPrinter 的列印機的集合:
Set colPrinters = objWMIService.ExecQuery _ ("Select * From Win32_Printer Where DeviceID = 'ArtDepartmentPrinter'")
請記住,我們這麼做是因為您專門詢問了更改單個列印機上屬性值的方式。不過,在某些情況下,您可能要修改列印伺服器上所有列印機的該屬性值。如果是這種情況,隻需從查詢中删除 Where 子句即可。此查詢将傳回計算機上所有列印機的集合,使您可以每次更改列印伺服器上大約 150 個列印機的 KeepPrintedJobs 屬性:
Set colPrinters = objWMIService.ExecQuery("Select * From Win32_Printer")
是的,這就是我們如此喜歡 WMI 的原因所在。
得到集合後,我們建立一個 For Each 循環以周遊該集合内的所有列印機(另外,對于這個特定的腳本我們僅使用一個列印機,其 DeviceID 為 ArtDepartmentPrinter)。在 For Each 循環内部我們找到了以下兩行代碼:
objPrinter.KeepPrintedJobs = FalseobjPrinter.Put_
這裡,我們隻是将 KeepPrintedJobs 屬性的值設定為 False,然後對 Put_ 方法的調用實際上是将所作更改儲存到列印機上。此後,ArtDepartmentPrinter 将不再儲存列印文檔的副本。就這麼簡單。
正如我們前面說過的,您無法在 Windows 2000 計算機上修改此屬性;不過,您可以決定是否在 Windows 2000 計算機上啟用此屬性。這不過是一種安慰獎,以下是實作此操作的腳本:
strComputer = "."Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")Set colPrinters = objWMIService.ExecQuery _ ("Select * From Win32_Printer Where DeviceID = 'ArtDepartmentPrinter'") For Each objPrinter in colPrinters If objPrinter.Attributes And 256 Then Wscript.Echo "Printed documents are kept." Else Wscript.Echo "Printed documents are not kept." End IfNext
在 Windows 2000 計算機上,KeepPrintedJobs 屬性是隻讀屬性“bitmask”的一部分,稱為 Attributes。今天我們将不詳細讨論 bitmasks 或 Attributes 屬性;我們隻是指明 KeepPrintedJobs 屬性包含一個等于 256 的屬性值。正因如此,我們可以使用布爾邏輯來決定是否啟用 KeepPrintedJobs。如果此行代碼為真,則表示已啟用 KeepPrintedJobs:
If objPrinter.Attributes And 256 Then
的确,這看起來有些不可思議,但請思考一下以下内容:假設計算機上有一個開關,該開關的值為 256。如果開關打開,則啟用 KeepPrintedJobs;如果開關關閉,則禁用 KeepPrintedJobs。我們所要做的隻是檢視開關是否已打開。
順便說一下,在您提問之前,我們曾擔心答案是否定的:Windows 2000 上的 WMI 版本根本不可能更新到允許修改 KeepPrintedJobs 屬性的版本。很抱歉。
本文轉自wangheyu1 51CTO部落格,原文連結:http://blog.51cto.com/wangheyu1/1894749,如需轉載請自行聯系原作者