2012-02-01 96 views
1

對於我的一位客戶,我正在用C#編寫Windows服務。它檢查了很多東西,但它必須做的一件事是檢查一個打印機端口(ip地址)是否已經存在。如果是,請將某臺打印機連接到IP端口。如果不是,請創建端口並連接。Windows服務與WMI

我使用WMI檢查現有打印機端口並創建它們。我還使用WMI將打印機連接到打印機端口。

在Windows 7上,這很像一個魅力。但在我的(虛擬)XP機器上,該服務似乎沒有任何WMI權限。端口檢查失敗,創建失敗。給出了一個簡單的來自ManagementException的「拒絕訪問」。

如果我製作一個小測試程序(C#中的控制檯應用程序),它的作用也像魅力一樣。

我試着在不同的帳戶下運行服務(本地系統,管理員,我的個人用管理員權限登錄),似乎沒有任何工作,我感覺你不能在Windows XP的Windows服務中使用WMI。

你們有什麼線索如何解決這個問題?或者這裏有什麼問題?

不知道在哪裏尋找答案,所以我在這裏做了一個帳戶,希望能找到正確的答案。

回答

0

您使用的是Win32_Printer嗎?在Win32_Printer參考頁,它說,

備註

的Win32_Printer類是從CIM_Printer的。在爲Win32_Printer實例調用SWbemObject.Put_或IWbemServices :: PutInstance之前,必須啓用SeLoadDriverPrivilege特權(用於Visual Basic的wbemPrivilegeLoadDriver和用於腳本標記的LoadDriver)。有關更多信息,請參閱權限常量和執行特權操作。以下VBScript代碼示例顯示如何在腳本中啓用SeLoadDriverPrivilege特權。

編輯:我知道Windows Server 2003和Server 2008在服務方面存在差異。在較舊的操作系統下(可能包含XP),默認情況下不會加載用戶的配置文件。嘗試使用DPAPI API時遇到問題。也許,在這種情況下會出現類似的情況。只有猜測。

編輯:確保在連接到WMI時啓用模擬。在Win32_TCPIPPrinterPort頁面上有一個示例。

ConnectionOptions options = new ConnectionOptions(); 
options.Impersonation = System.Management.ImpersonationLevel.Impersonate; 

ManagementScope scope = new ManagementScope(@"\\root\\cimv2", options); 
scope.Connect(); 
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_TCPIPPrinterPort where HostAddress = '" + printerPort + "'"); 
+0

是的,我用WIN32_Printer。但它可以在同一臺XP計算機上使用控制檯應用程序。 – Aspage 2012-02-01 01:08:58

+0

更正:我使用WMI,它引用WMI中的Win32_Printer'文件夾/類'。我不直接使用Win32_Printer來完成任務。 – Aspage 2012-02-01 11:15:06

+0

Win32_Printer是一個WMI類。如果您不使用Win32_Printer,哪個WMI類正在使用? – 2012-02-01 15:21:49

0

有兩兩件事你可以嘗試,首先,你可以嘗試設置你的ConnectionOptions

ConnectionOptions options = new ConnectionOptions(); 
options.Username = userName; 
options.Password = password; 
options.EnablePrivileges = true; 

另一種方法可能是通過一些模擬弄虛作假包裝你的整個代碼中的一些證書,但我肯定會先嚐試查看ConnectionOptions。

如果你想嘗試模仿位,我寫了一篇關於它的博客文章。 http://beddet.wordpress.com/2011/09/25/remote-controlling/