Windows服务与WMI

问题描述:

对于我的一位客户,我正在用C#编写Windows服务。它检查了很多东西,但它必须做的一件事是检查一个打印机端口(ip地址)是否已经存在。如果是,请将某台打印机连接到IP端口。如果不是,请创建端口并连接。Windows服务与WMI

我使用WMI检查现有打印机端口并创建它们。我还使用WMI将打印机连接到打印机端口。

在Windows 7上,这很像一个魅力。但在我的(虚拟)XP机器上,该服务似乎没有任何WMI权限。端口检查失败,创建失败。给出了一个简单的来自ManagementException的“拒绝访问”。

如果我制作一个小测试程序(C#中的控制台应用程序),它的作用也像魅力一样。

我试着在不同的帐户下运行服务(本地系统,管理员,我的个人用管理员权限登录),似乎没有任何工作,我感觉你不能在Windows XP的Windows服务中使用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 + "'"); 
+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

有两两件事你可以尝试,首先,你可以尝试设置你的ConnectionOptions

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

另一种方法可能是通过一些模拟弄虚作假包装你的整个代码中的一些证书,但我肯定会先尝试查看ConnectionOptions。

如果你想尝试模仿位,我写了一篇关于它的博客文章。 http://beddet.wordpress.com/2011/09/25/remote-controlling/