ServiceManagerNative.cs 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. using System;
  2. using System.Runtime.InteropServices;
  3. namespace AipGateway.FileJob.Scheduler
  4. {
  5. internal static class ServiceManagerNative
  6. {
  7. #region Enums
  8. [Flags]
  9. public enum SCM_ACCESS : uint
  10. {
  11. SC_MANAGER_CONNECT = 0x00001,
  12. SC_MANAGER_CREATE_SERVICE = 0x00002,
  13. SC_MANAGER_ENUMERATE_SERVICE = 0x00004,
  14. SC_MANAGER_LOCK = 0x00008,
  15. SC_MANAGER_QUERY_LOCK_STATUS = 0x00010,
  16. SC_MANAGER_MODIFY_BOOT_CONFIG = 0x00020,
  17. SC_MANAGER_ALL_ACCESS = ACCESS_MASK.STANDARD_RIGHTS_REQUIRED |
  18. SC_MANAGER_CONNECT |
  19. SC_MANAGER_CREATE_SERVICE |
  20. SC_MANAGER_ENUMERATE_SERVICE |
  21. SC_MANAGER_LOCK |
  22. SC_MANAGER_QUERY_LOCK_STATUS |
  23. SC_MANAGER_MODIFY_BOOT_CONFIG,
  24. GENERIC_READ = ACCESS_MASK.STANDARD_RIGHTS_READ |
  25. SC_MANAGER_ENUMERATE_SERVICE |
  26. SC_MANAGER_QUERY_LOCK_STATUS,
  27. GENERIC_WRITE = ACCESS_MASK.STANDARD_RIGHTS_WRITE |
  28. SC_MANAGER_CREATE_SERVICE |
  29. SC_MANAGER_MODIFY_BOOT_CONFIG,
  30. GENERIC_EXECUTE = ACCESS_MASK.STANDARD_RIGHTS_EXECUTE |
  31. SC_MANAGER_CONNECT | SC_MANAGER_LOCK,
  32. GENERIC_ALL = SC_MANAGER_ALL_ACCESS,
  33. }
  34. [Flags]
  35. public enum SERVICE_ACCESS : uint
  36. {
  37. SERVICE_QUERY_CONFIG = 0x00001,
  38. SERVICE_CHANGE_CONFIG = 0x00002,
  39. SERVICE_QUERY_STATUS = 0x00004,
  40. SERVICE_ENUMERATE_DEPENDENTS = 0x00008,
  41. SERVICE_START = 0x00010,
  42. SERVICE_STOP = 0x00020,
  43. SERVICE_PAUSE_CONTINUE = 0x00040,
  44. SERVICE_INTERROGATE = 0x00080,
  45. SERVICE_USER_DEFINED_CONTROL = 0x00100,
  46. SERVICE_ALL_ACCESS = (ACCESS_MASK.STANDARD_RIGHTS_REQUIRED |
  47. SERVICE_QUERY_CONFIG |
  48. SERVICE_CHANGE_CONFIG |
  49. SERVICE_QUERY_STATUS |
  50. SERVICE_ENUMERATE_DEPENDENTS |
  51. SERVICE_START |
  52. SERVICE_STOP |
  53. SERVICE_PAUSE_CONTINUE |
  54. SERVICE_INTERROGATE |
  55. SERVICE_USER_DEFINED_CONTROL),
  56. GENERIC_READ = ACCESS_MASK.STANDARD_RIGHTS_READ |
  57. SERVICE_QUERY_CONFIG |
  58. SERVICE_QUERY_STATUS |
  59. SERVICE_INTERROGATE |
  60. SERVICE_ENUMERATE_DEPENDENTS,
  61. GENERIC_WRITE = ACCESS_MASK.STANDARD_RIGHTS_WRITE |
  62. SERVICE_CHANGE_CONFIG,
  63. GENERIC_EXECUTE = ACCESS_MASK.STANDARD_RIGHTS_EXECUTE |
  64. SERVICE_START |
  65. SERVICE_STOP |
  66. SERVICE_PAUSE_CONTINUE |
  67. SERVICE_USER_DEFINED_CONTROL,
  68. ACCESS_SYSTEM_SECURITY = ACCESS_MASK.ACCESS_SYSTEM_SECURITY,
  69. DELETE = ACCESS_MASK.DELETE,
  70. READ_CONTROL = ACCESS_MASK.READ_CONTROL,
  71. WRITE_DAC = ACCESS_MASK.WRITE_DAC,
  72. WRITE_OWNER = ACCESS_MASK.WRITE_OWNER,
  73. }
  74. public enum SERVICE_CONTROL : uint
  75. {
  76. STOP = 0x00000001,
  77. PAUSE = 0x00000002,
  78. CONTINUE = 0x00000003,
  79. INTERROGATE = 0x00000004,
  80. SHUTDOWN = 0x00000005,
  81. PARAMCHANGE = 0x00000006,
  82. NETBINDADD = 0x00000007,
  83. NETBINDREMOVE = 0x00000008,
  84. NETBINDENABLE = 0x00000009,
  85. NETBINDDISABLE = 0x0000000A,
  86. DEVICEEVENT = 0x0000000B,
  87. HARDWAREPROFILECHANGE = 0x0000000C,
  88. POWEREVENT = 0x0000000D,
  89. SESSIONCHANGE = 0x0000000E
  90. }
  91. public enum SERVICE_STATE : uint
  92. {
  93. SERVICE_STOPPED = 0x00000001,
  94. SERVICE_START_PENDING = 0x00000002,
  95. SERVICE_STOP_PENDING = 0x00000003,
  96. SERVICE_RUNNING = 0x00000004,
  97. SERVICE_CONTINUE_PENDING = 0x00000005,
  98. SERVICE_PAUSE_PENDING = 0x00000006,
  99. SERVICE_PAUSED = 0x00000007
  100. }
  101. [Flags]
  102. public enum SERVICE_TYPES : int
  103. {
  104. SERVICE_KERNEL_DRIVER = 0x00000001,
  105. SERVICE_FILE_SYSTEM_DRIVER = 0x00000002,
  106. SERVICE_WIN32_OWN_PROCESS = 0x00000010,
  107. SERVICE_WIN32_SHARE_PROCESS = 0x00000020,
  108. SERVICE_INTERACTIVE_PROCESS = 0x00000100
  109. }
  110. [Flags]
  111. public enum SERVICE_TYPE : uint
  112. {
  113. SERVICE_KERNEL_DRIVER = 0x00000001,
  114. SERVICE_FILE_SYSTEM_DRIVER = 0x00000002,
  115. SERVICE_WIN32_OWN_PROCESS = 0x00000010,
  116. SERVICE_WIN32_SHARE_PROCESS = 0x00000020,
  117. SERVICE_INTERACTIVE_PROCESS = 0x00000100,
  118. }
  119. public enum SERVICE_START : uint
  120. {
  121. SERVICE_BOOT_START = 0x00000000,
  122. SERVICE_SYSTEM_START = 0x00000001,
  123. SERVICE_AUTO_START = 0x00000002,
  124. SERVICE_DEMAND_START = 0x00000003,
  125. SERVICE_DISABLED = 0x00000004,
  126. }
  127. public enum SERVICE_ERROR
  128. {
  129. SERVICE_ERROR_IGNORE = 0x00000000,
  130. SERVICE_ERROR_NORMAL = 0x00000001,
  131. SERVICE_ERROR_SEVERE = 0x00000002,
  132. SERVICE_ERROR_CRITICAL = 0x00000003,
  133. }
  134. [Flags]
  135. private enum ACCESS_MASK : uint
  136. {
  137. DELETE = 0x00010000,
  138. READ_CONTROL = 0x00020000,
  139. WRITE_DAC = 0x00040000,
  140. WRITE_OWNER = 0x00080000,
  141. SYNCHRONIZE = 0x00100000,
  142. STANDARD_RIGHTS_REQUIRED = 0x000F0000,
  143. STANDARD_RIGHTS_READ = 0x00020000,
  144. STANDARD_RIGHTS_WRITE = 0x00020000,
  145. STANDARD_RIGHTS_EXECUTE = 0x00020000,
  146. STANDARD_RIGHTS_ALL = 0x001F0000,
  147. SPECIFIC_RIGHTS_ALL = 0x0000FFFF,
  148. ACCESS_SYSTEM_SECURITY = 0x01000000,
  149. MAXIMUM_ALLOWED = 0x02000000,
  150. GENERIC_READ = 0x80000000,
  151. GENERIC_WRITE = 0x40000000,
  152. GENERIC_EXECUTE = 0x20000000,
  153. GENERIC_ALL = 0x10000000,
  154. DESKTOP_READOBJECTS = 0x00000001,
  155. DESKTOP_CREATEWINDOW = 0x00000002,
  156. DESKTOP_CREATEMENU = 0x00000004,
  157. DESKTOP_HOOKCONTROL = 0x00000008,
  158. DESKTOP_JOURNALRECORD = 0x00000010,
  159. DESKTOP_JOURNALPLAYBACK = 0x00000020,
  160. DESKTOP_ENUMERATE = 0x00000040,
  161. DESKTOP_WRITEOBJECTS = 0x00000080,
  162. DESKTOP_SWITCHDESKTOP = 0x00000100,
  163. WINSTA_ENUMDESKTOPS = 0x00000001,
  164. WINSTA_READATTRIBUTES = 0x00000002,
  165. WINSTA_ACCESSCLIPBOARD = 0x00000004,
  166. WINSTA_CREATEDESKTOP = 0x00000008,
  167. WINSTA_WRITEATTRIBUTES = 0x00000010,
  168. WINSTA_ACCESSGLOBALATOMS = 0x00000020,
  169. WINSTA_EXITWINDOWS = 0x00000040,
  170. WINSTA_ENUMERATE = 0x00000100,
  171. WINSTA_READSCREEN = 0x00000200,
  172. WINSTA_ALL_ACCESS = 0x0000037F
  173. }
  174. #endregion
  175. #region Structs
  176. [StructLayout(LayoutKind.Sequential, Pack = 0)]
  177. public struct SERVICE_STATUS
  178. {
  179. public SERVICE_TYPES dwServiceType;
  180. public SERVICE_STATE dwCurrentState;
  181. public uint dwControlsAccepted;
  182. public uint dwWin32ExitCode;
  183. public uint dwServiceSpecificExitCode;
  184. public uint dwCheckPoint;
  185. public uint dwWaitHint;
  186. }
  187. [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
  188. public struct SERVICE_STATUS_PROCESS
  189. {
  190. public int serviceType;
  191. public int currentState;
  192. public int controlsAccepted;
  193. public int win32ExitCode;
  194. public int serviceSpecificExitCode;
  195. public int checkPoint;
  196. public int waitHint;
  197. public int processID;
  198. public int serviceFlags;
  199. public static explicit operator SERVICE_STATUS_PROCESS(IntPtr v)
  200. {
  201. throw new NotImplementedException(v.ToString());
  202. }
  203. }
  204. #endregion
  205. #region Functions
  206. [DllImport("advapi32.dll", EntryPoint = "OpenSCManagerW", ExactSpelling = true, CharSet = CharSet.Unicode, SetLastError = true)]
  207. public static extern IntPtr OpenSCManager(string machineName, string databaseName, ServiceManagerNative.SCM_ACCESS dwAccess);
  208. [DllImport("advapi32.dll", EntryPoint = "OpenSCManagerW", ExactSpelling = true, CharSet = CharSet.Unicode, SetLastError = true)]
  209. public static extern IntPtr OpenSCManager(IntPtr machineName, IntPtr databaseName, ServiceManagerNative.SCM_ACCESS dwAccess);
  210. [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
  211. public static extern IntPtr CreateService(IntPtr hSCManager, string lpServiceName, string lpDisplayName, ServiceManagerNative.SERVICE_ACCESS dwDesiredAccess, uint dwServiceType, uint dwStartType, uint dwErrorControl, string lpBinaryPathName, string lpLoadOrderGroup, string lpdwTagId, string lpDependencies, string lpServiceStartName, string lpPassword);
  212. [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
  213. public static extern IntPtr CreateService(IntPtr hSCManager, string lpServiceName, string lpDisplayName, ServiceManagerNative.SERVICE_ACCESS dwDesiredAccess, uint dwServiceType, uint dwStartType, uint dwErrorControl, string lpBinaryPathName, IntPtr lpLoadOrderGroup, IntPtr lpdwTagId, IntPtr lpDependencies, IntPtr lpServiceStartName, IntPtr lpPassword);
  214. [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
  215. public static extern IntPtr OpenService(IntPtr hSCManager, string lpServiceName, ServiceManagerNative.SERVICE_ACCESS dwDesiredAccess);
  216. [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
  217. public static extern bool QueryServiceStatusEx(IntPtr serviceHandle, int infoLevel, IntPtr buffer, int bufferSize, out int bytesNeeded);
  218. [DllImport("advapi32", SetLastError = true)]
  219. [return: MarshalAs(UnmanagedType.Bool)]
  220. public static extern bool StartService(IntPtr hService, int dwNumServiceArgs, IntPtr lpServiceArgVectors);
  221. [DllImport("advapi32.dll", SetLastError = true)]
  222. [return: MarshalAs(UnmanagedType.Bool)]
  223. public static extern bool ControlService(IntPtr hService, SERVICE_CONTROL dwControl, ref SERVICE_STATUS lpServiceStatus);
  224. [DllImport("advapi32.dll", SetLastError = true)]
  225. [return: MarshalAs(UnmanagedType.Bool)]
  226. public static extern bool DeleteService(IntPtr hService);
  227. [DllImport("advapi32.dll", SetLastError = true)]
  228. [return: MarshalAs(UnmanagedType.Bool)]
  229. public static extern bool CloseServiceHandle(IntPtr hSCObject);
  230. #endregion
  231. }
  232. }