使用WMI的Windows服务

时间:2012-02-01 00:59:45

标签: c# windows service windows-xp wmi

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

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

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

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

我尝试在不同的帐户下运行该服务(本地系统,管理员,我的个人登录管理员权限),似乎没有任何工作,我感觉你不能在Windows XP上的Windows服务中使用WMI。

你们有什么线索如何解决这个问题?或者这里有什么问题?

不知道在哪里寻找答案,所以我在这里开了一个帐户,希望能找到合适的答案。

2 个答案:

答案 0 :(得分: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 + "'"); 

答案 1 :(得分: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/