ServiceManager.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. using System;
  2. using System.Runtime.InteropServices;
  3. using System.Threading;
  4. namespace AipGateway.FileJob.Scheduler
  5. {
  6. internal static class ServiceManager
  7. {
  8. public static bool ServiceInstall(string serviceName, string displayName, ServiceManagerNative.SERVICE_START dwStartType, string path)
  9. {
  10. IntPtr scManager;
  11. IntPtr scService;
  12. scManager = ServiceManagerNative.OpenSCManager(IntPtr.Zero, IntPtr.Zero, ServiceManagerNative.SCM_ACCESS.SC_MANAGER_ALL_ACCESS);
  13. if (scManager.Equals(IntPtr.Zero)) {
  14. Console.WriteLine("[서비스 설치] 서비스 관리자를 열지 못하였습니다.");
  15. return false;
  16. }
  17. scService = ServiceManagerNative.CreateService(
  18. scManager,
  19. serviceName,
  20. displayName,
  21. ServiceManagerNative.SERVICE_ACCESS.SERVICE_ALL_ACCESS,
  22. (uint)ServiceManagerNative.SERVICE_TYPE.SERVICE_WIN32_OWN_PROCESS,
  23. (uint) dwStartType,
  24. (uint) ServiceManagerNative.SERVICE_ERROR.SERVICE_ERROR_NORMAL,
  25. path,
  26. IntPtr.Zero,
  27. IntPtr.Zero,
  28. IntPtr.Zero,
  29. IntPtr.Zero,
  30. IntPtr.Zero);
  31. ServiceManagerNative.CloseServiceHandle(scService);
  32. ServiceManagerNative.CloseServiceHandle(scManager);
  33. return true;
  34. }
  35. unsafe public static bool ServiceUninstall(string serviceName)
  36. {
  37. IntPtr scManager;
  38. IntPtr scService;
  39. scManager = ServiceManagerNative.OpenSCManager(IntPtr.Zero, IntPtr.Zero, ServiceManagerNative.SCM_ACCESS.SC_MANAGER_ALL_ACCESS);
  40. if (scManager.Equals(IntPtr.Zero))
  41. {
  42. Console.WriteLine("[서비스 설치 해제] 서비스 관리자를 열지 못하였습니다.");
  43. return false;
  44. }
  45. scService = ServiceManagerNative.OpenService(scManager, serviceName, ServiceManagerNative.SERVICE_ACCESS.SERVICE_ALL_ACCESS);
  46. if (scService.Equals(IntPtr.Zero))
  47. {
  48. Console.WriteLine("[서비스 설치 해제] 서비스를 열지 못하였습니다.");
  49. ServiceManagerNative.CloseServiceHandle(scManager);
  50. return false;
  51. }
  52. IntPtr buf = Marshal.AllocHGlobal(sizeof(ServiceManagerNative.SERVICE_STATUS_PROCESS));
  53. int buf_len = sizeof(ServiceManagerNative.SERVICE_STATUS_PROCESS);
  54. for (int i = 0; i < 30; i++)
  55. {
  56. if (!ServiceManagerNative.QueryServiceStatusEx(scService, 0, buf, buf_len, out buf_len))
  57. {
  58. if (!buf.Equals(IntPtr.Zero))
  59. {
  60. Marshal.FreeHGlobal(buf);
  61. }
  62. ServiceManagerNative.CloseServiceHandle(scService);
  63. ServiceManagerNative.CloseServiceHandle(scManager);
  64. return false;
  65. }
  66. ServiceManagerNative.SERVICE_STATUS_PROCESS pStatus = (ServiceManagerNative.SERVICE_STATUS_PROCESS)Marshal.PtrToStructure(buf, typeof(ServiceManagerNative.SERVICE_STATUS_PROCESS));
  67. switch (pStatus.currentState)
  68. {
  69. case (int) ServiceManagerNative.SERVICE_STATE.SERVICE_RUNNING:
  70. ServiceManagerNative.SERVICE_STATUS serviceStatus = new ServiceManagerNative.SERVICE_STATUS();
  71. ServiceManagerNative.ControlService(scService, ServiceManagerNative.SERVICE_CONTROL.STOP, ref serviceStatus);
  72. break;
  73. case (int)ServiceManagerNative.SERVICE_STATE.SERVICE_STOPPED:
  74. ServiceManagerNative.DeleteService(scService);
  75. i = 30;
  76. break;
  77. default:
  78. break;
  79. }
  80. Thread.Sleep(1000);
  81. }
  82. if (!buf.Equals(IntPtr.Zero))
  83. {
  84. Marshal.FreeHGlobal(buf);
  85. }
  86. ServiceManagerNative.CloseServiceHandle(scService);
  87. ServiceManagerNative.CloseServiceHandle(scManager);
  88. return true;
  89. }
  90. public static bool ServiceStart(string service_name)
  91. {
  92. IntPtr scManager;
  93. IntPtr scService;
  94. scManager = ServiceManagerNative.OpenSCManager(IntPtr.Zero, IntPtr.Zero, ServiceManagerNative.SCM_ACCESS.SC_MANAGER_ALL_ACCESS);
  95. if (scManager.Equals(IntPtr.Zero))
  96. {
  97. Console.WriteLine("[서비스 실행] 서비스 관리자를 열지 못하였습니다.");
  98. return false;
  99. }
  100. scService = ServiceManagerNative.OpenService(scManager, service_name, ServiceManagerNative.SERVICE_ACCESS.SERVICE_ALL_ACCESS);
  101. if (scService.Equals(IntPtr.Zero))
  102. {
  103. Console.WriteLine("[서비스 실행] 서비스를 열지 못하였습니다.");
  104. ServiceManagerNative.CloseServiceHandle(scManager);
  105. return false;
  106. }
  107. ServiceManagerNative.StartService(scService, 0, IntPtr.Zero);
  108. ServiceManagerNative.CloseServiceHandle(scService);
  109. ServiceManagerNative.CloseServiceHandle(scManager);
  110. return true;
  111. }
  112. public static bool ServiceStop(string service_name)
  113. {
  114. IntPtr scManager;
  115. IntPtr scService;
  116. ServiceManagerNative.SERVICE_STATUS serviceStatus = new ServiceManagerNative.SERVICE_STATUS();
  117. scManager = ServiceManagerNative.OpenSCManager(IntPtr.Zero, IntPtr.Zero, ServiceManagerNative.SCM_ACCESS.SC_MANAGER_ALL_ACCESS);
  118. if (scManager.Equals(IntPtr.Zero))
  119. {
  120. Console.WriteLine("[서비스 종료] 서비스 관리자를 열지 못하였습니다.");
  121. return false;
  122. }
  123. scService = ServiceManagerNative.OpenService(scManager, service_name, ServiceManagerNative.SERVICE_ACCESS.SERVICE_ALL_ACCESS);
  124. if (scService.Equals(IntPtr.Zero))
  125. {
  126. Console.WriteLine("[서비스 종료] 서비스를 열지 못하였습니다.");
  127. ServiceManagerNative.CloseServiceHandle(scManager);
  128. return false;
  129. }
  130. ServiceManagerNative.ControlService(scService, ServiceManagerNative.SERVICE_CONTROL.STOP, ref serviceStatus);
  131. ServiceManagerNative.CloseServiceHandle(scService);
  132. ServiceManagerNative.CloseServiceHandle(scManager);
  133. return true;
  134. }
  135. }
  136. }