对于我的一位客户,我正在用C#编写Windows服务。它会检查很多东西,但它必须做的一件事就是检查打印机端口(IP地址)是否已经存在。如果是,请将某个打印机连接到IP端口。如果不是,请创建端口并连接。
我使用WMI检查现有的打印机端口并创建它们。我还使用WMI将打印机连接到打印机端口。
在Windows 7上,这就像魅力一样。但是在我的(虚拟)XP机器上,该服务似乎根本没有任何WMI权限。端口检查失败,创建失败。只给出了一个简单的来自ManagementException的“拒绝访问”。
如果我制作了一个小程序(C#中的控制台应用程序),它就像魅力一样。
我尝试在不同的帐户下运行该服务(本地系统,管理员,我的个人登录管理员权限),似乎没有任何工作,我感觉你不能在Windows XP上的Windows服务中使用WMI。
你们有什么线索如何解决这个问题?或者这里有什么问题?
不知道在哪里寻找答案,所以我在这里开了一个帐户,希望能找到合适的答案。
答案 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/