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

C# 是否可以在Windows服务中使用WMI?,c#,windows-services,wmi,C#,Windows Services,Wmi,我正在编写一个简单的服务,根据连接的位置设置默认打印机,但在服务中使用WMI时遇到问题。我想得越多,就越不可能做我想做的事情;因为服务与特定的用户没有关联,但我想无论如何我都会询问它,以防我的怀疑是错误的 这就是我正在做的 服务订阅了NetworkChange.NetworkAvailabilityChanged事件 收到事件时,查询WMI从Win32\u打印机中选择*,其中Network=true 循环浏览ManagementObjectCollection,检查每台打印机的状态 如果打印机已

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

这就是我正在做的

  • 服务订阅了
    NetworkChange.NetworkAvailabilityChanged
    事件
  • 收到事件时,查询WMI
    从Win32\u打印机中选择*,其中Network=true
  • 循环浏览
    ManagementObjectCollection
    ,检查每台打印机的状态
  • 如果打印机已连接,请调用ManagementObject.InvokeMethod(“SetDefaultPrinter”,null)
  • 当我检查安全事件日志时,我注意到失败审计事件“未知用户名或错误密码”,我认为这是因为我没有明确提供该信息

    是否有一种方法可以在不指定用户名和密码的情况下执行此操作,或者出于安全目的是否需要凭据

    你应该使用它,它工作得很好

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

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

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

    使用隐藏表单创建winforms程序,并在用户使用任务调度器登录时启动它

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


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

    该服务必须以某个用户的身份运行,例如网络服务、本地服务、系统服务?您需要确保给定的帐户具有执行所需操作的权限。@Serguei-如何以用户身份运行该服务?部署该服务后,您可以在“服务属性”中设置服务帐户,前提是您使用的是windows Start>Admin Tools>Services。@Serguei-请添加您的注释作为答案,以便我可以接受,谢谢您的帮助。开始->控制面板->管理工具->服务,右键单击服务并选择“属性”,然后切换到登录选项卡。您可以设置服务运行所使用的帐户,并从中提供所需的任何密码。