【问题标题】:Is it possible to use WMI in a Windows service?是否可以在 Windows 服务中使用 WMI?
【发布时间】:2010-12-28 20:55:10
【问题描述】:

我正在编写一个简单的服务来根据我的连接位置设置默认打印机,但是在我的服务中使用 WMI 时遇到了问题。我想得越多,我就越觉得不可能做我想做的事;作为一项服务与特定用户没有关联,但我想我还是会问一下,以防我的怀疑是错误的。

这就是我正在做的事情。

  1. 服务订阅NetworkChange.NetworkAvailabilityChanged 事件。
  2. 收到事件时查询 WMI SELECT * FROM Win32_Printer WHERE Network=true
  3. 循环通过ManagementObjectCollection 并检查每台打印机的状态。
  4. 如果打印机已连接,请致电ManagementObject.InvokeMethod("SetDefaultPrinter",null)

当我检查安全事件日志时,我注意到失败审核事件“未知用户名或错误密码”,我假设这是因为我没有明确提供该信息。

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

【问题讨论】:

  • 服务必须以 some 用户身份运行,可能是 NETWORK SERVICE、LOCAL SERVICE、SYSTEM 之类的?您需要确保给定帐户有权做您想做的事。
  • @Serguei - 我如何以用户身份运行服务?
  • 部署服务后,您可以在服务属性中设置服务帐户,假设您使用的是 Windows 开始 > 管理工具 > 服务。
  • @Serguei - 请添加您的 cmets 作为答案,以便我接受,谢谢您的帮助。
  • 开始->控制面板->管理工具->服务,右键点击服务选择“属性”,切换到登录选项卡。您可以设置运行服务的帐户并提供所需的任何密码。

标签: c# windows-services wmi


【解决方案1】:

服务必须以一些用户身份运行,例如网络服务、本地服务或系统。您需要确保给定帐户有权执行您想要的操作。 要更改 Windows 上已部署服务的权限,请转到开始 > 管理工具 > 服务,然后您可以更改给定服务的服务帐户。

【讨论】:

    【解决方案2】:

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

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

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

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

    我建议使用 winforms 应用程序,因为它的输入栏较低,您可以使用任何其他从 UI 角度看项目类型的不可见项目类型。

    【讨论】:

      【解决方案3】:

      你应该使用linqtowmi,它非常有效!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-04
        相关资源
        最近更新 更多