是否可以在Windows服务中使用WMI?

时间:2010-12-28 20:55:11

标签: c# windows-services wmi

我正在编写一个简单的服务来根据我连接的位置设置默认打印机,但我在服务中使用WMI时遇到了问题。我想的越多,我认为可以做我想做的事情就越少;因为服务与某个特定用户无关,但我想如果我的怀疑是错误的话我会问它。

这就是我正在做的事情。

  1. 服务订阅NetworkChange.NetworkAvailabilityChanged活动。
  2. 收到事件时,请查询WMI SELECT * FROM Win32_Printer WHERE Network=true
  3. 循环浏览ManagementObjectCollection并检查每台打印机的状态。
  4. 如果已连接打印机,请致电ManagementObject.InvokeMethod("SetDefaultPrinter",null)
  5. 当我检查安全事件日志时,我注意到失败审核事件“未知用户名或密码错误”,我假设是因为我没有明确提供该信息。

    有没有办法在不指定用户名和密码的情况下执行此操作,或者出于安全目的需要凭据?

3 个答案:

答案 0 :(得分:1)

该服务必须以某些用户身份运行,例如NETWORK SERVICE,LOCAL SERVICE或SYSTEM。您需要确保给定帐户有权执行您想要的操作。 要在Windows上更改已部署服务的权限,请转到“开始”>管理工具>然后,您可以更改服务的服务帐户。

答案 1 :(得分:0)

我知道这是一个老问题,但我觉得现有的答案并不能提供一个可管理的解决方案。

正如指出影响用户默认打印机选择,您需要作为该用户进行身份验证,同时可以将Windows服务设置为以特定用户身份登录,更好的解决方案是...

使用隐藏表单创建winforms程序,并在用户使用任务计划程序登录时启动它。

这样,PC可以被许多用户使用,并且无需更改服务登录设置即可从应用程序中受益。

我建议使用winforms应用程序,因为它具有较低的条目栏,您可以使用UI透视项目类型中的任何其他类型的隐形。

答案 2 :(得分:-1)

你应该使用linqtowmi这样做很棒!