Mercurial > hg > ucis.core
diff Windows/ServiceManager.cs @ 0:3ab940a0c7a0
Initial commit
author | Ivo Smits <Ivo@UCIS.nl> |
---|---|
date | Tue, 11 Sep 2012 16:28:53 +0200 |
parents | |
children | 4b78cc5f116b |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Windows/ServiceManager.cs Tue Sep 11 16:28:53 2012 +0200 @@ -0,0 +1,116 @@ +using System; +using System.Management; +using System.IO; + +namespace UCIS.Windows { + public class ServiceManager { + private ManagementObject _serviceObject; + + public const string StartMode_Automatic = "Automatic"; + public const string StartMode_Manual = "Manual"; + public const string StartMode_Disabled = "Disabled"; + + private ServiceManager(ManagementObject ob) { + _serviceObject = ob; + } + + public static ServiceManager GetServiceByPath(string FileName) { + ManagementClass mc = new ManagementClass("Win32_Service"); + foreach (ManagementObject ob in mc.GetInstances()) { + string Value = (string)ob.GetPropertyValue("PathName"); + if (Value == null) continue; + int Position = Value.IndexOf(FileName); + if (Position == 0 || Position == 1) { //Either <filepath> or <"filepath"> + return new ServiceManager(ob); + } + } + return null; + } + public static ServiceManager GetServiceByName(string Name) { + ManagementClass mc = new ManagementClass("Win32_Service"); + foreach (ManagementObject ob in mc.GetInstances()) { + string Value = (string)ob.GetPropertyValue("Name"); + if (Value == null) continue; + if (Value.Equals(Name, StringComparison.InvariantCultureIgnoreCase)) return new ServiceManager(ob); + } + return null; + } + public static ServiceManager Create(string Name, string DisplayName, string PathName, string StartMode, bool DesktopInteract, string StartName, string StartPassword) { + ManagementClass mc = new ManagementClass("Win32_Service"); + UInt32 ret; + ret = (UInt32)mc.InvokeMethod("Create", new Object[] { + Name, //Name + DisplayName, //DisplayName + PathName, //PathName + 16, //ServiceType (16 = own process) + 1, //ErrorControl (1 = user is notified) + StartMode, //StartMode + DesktopInteract, //DesktopInteract + StartName, //StartName (null = LocalSystem) + StartPassword, //StartPassword + null, //LoadOrderGroup + null, //LoadOrderGroupDependencies + null //ServiceDependencies + }); + if (ret != 0) throw new ManagementException("Could not create service (code " + ret.ToString() + ")"); + return GetServiceByName(Name); + } + + public string Name { get { return (string)_serviceObject.GetPropertyValue("Name"); } } + public string DisplayName { get { return (string)_serviceObject.GetPropertyValue("DisplayName"); } } + public string PathName { get { return (string)_serviceObject.GetPropertyValue("PathName"); } } + public string StartMode { + get { return (string)_serviceObject.GetPropertyValue("StartMode"); } + set { _serviceObject.InvokeMethod("ChangeStartMode", new Object[] { value }); Refresh(); } + } + public bool DesktopInteract { get { return (bool)_serviceObject.GetPropertyValue("DesktopInteract"); } } + public string StartName { get { return (string)_serviceObject.GetPropertyValue("StartName"); } } + public string StartPassword { get { return (string)_serviceObject.GetPropertyValue("StartPassword"); } } + + public void Change(string DisplayName, string PathName, string StartMode, bool DesktopInteract, string StartName, string StartPassword) { + UInt32 ret; + ret = (UInt32)_serviceObject.InvokeMethod("Change", new Object[] { + DisplayName, //DisplayName + PathName, //PathName + 16, //ServiceType (16 = own process) + 1, //ErrorControl (1 = user is notified) + StartMode, //StartMode + DesktopInteract, //DesktopInteract + StartName, //StartName (null = LocalSystem) + StartPassword, //StartPassword + null, //LoadOrderGroup + null, //LoadOrderGroupDependencies + null //ServiceDependencies + }); + if (ret != 0) throw new ManagementException("Could not change service (code " + ret.ToString() + ")"); + Refresh(); + } + + public void Refresh() { + _serviceObject.Get(); + } + + public void Start() { + _serviceObject.InvokeMethod("StartService", null); + Refresh(); + } + public void Stop() { + _serviceObject.InvokeMethod("StopService", null); + Refresh(); + } + + public bool Running { + get { + Refresh(); + return (bool)_serviceObject.GetPropertyValue("Started"); + } + } + + public String State { + get { + Refresh(); + return (String)_serviceObject.GetPropertyValue("State"); + } + } + } +} \ No newline at end of file