簡體   English   中英

Windows服務與WMI

[英]Windows Service with WMI

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

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

在Windows 7上,這就像一個超級按鈕。 但是在我的(虛擬)XP計算機上,該服務似乎根本沒有任何WMI權限。 端口檢查失敗,創建失敗。 僅給出了來自ManagementException的簡單“拒絕訪問”。

如果我編寫一些測試程序(C#中的控制台應用程序),它的工作原理也很吸引人。

我嘗試使用其他帳戶(本地系統,管理員,具有管理員權限的個人登錄名)運行該服務,但似乎沒有任何效果,並且我感覺到您無法在Windows XP的Windows Service中使用WMI。

你們有什么線索解決這個問題嗎? 還是這里有什么問題?

不知道在哪里可以找到答案,所以我在這里注冊了一個帳戶,希望能找到合適的答案。

您正在使用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 + "'"); 

您可以嘗試兩種方法,首先可以嘗試在ConnectionOptions上設置一些憑據

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

另一種方法可能是將整個代碼包裝在一些模擬欺騙中,但是我一定會嘗試首先查看ConnectionOptions。

如果您想嘗試模仿,我前不久就寫了一篇博客文章。 http://beddet.wordpress.com/2011/09/25/remote-controlling/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM