I’m writing a simple service to set the default printer based on where I’m connected, but I’m having trouble using WMI in my service. The more I think about it the less I think it’s possible to do what I’m trying to do; as a service is not associated with a particular user, but I thought I would ask about it anyway in case my suspicions are wrong.
Here is what I’m doing.
- Service subscribes to
NetworkChange.NetworkAvailabilityChangedevent. - When event is received query WMI
SELECT * FROM Win32_Printer WHERE Network=true. - Loop through the
ManagementObjectCollectionand check the status of each printer. - If the printer is connected call
ManagementObject.InvokeMethod("SetDefaultPrinter",null)
When I check the Security event log I noticed Failure Audit events “Unknown username or bad password”, which I’m assuming is because I did not explicitly supply that information.
Is there a way to do this without specifying a username and password, or are credentials required for security purposes?
The service must run as some user, for example NETWORK SERVICE, LOCAL SERVICE or SYSTEM. You need to make sure the given account has permission to do what you want.
To change the permission of a deployed service on Windows go to Start > Administrative Tools > Services then you can change the service account for a given service.