123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260 |
- using System;
- using System.Runtime.InteropServices;
- namespace AipGateway.FileJob.Scheduler
- {
- internal static class ServiceManagerNative
- {
- #region Enums
- [Flags]
- public enum SCM_ACCESS : uint
- {
- SC_MANAGER_CONNECT = 0x00001,
- SC_MANAGER_CREATE_SERVICE = 0x00002,
- SC_MANAGER_ENUMERATE_SERVICE = 0x00004,
- SC_MANAGER_LOCK = 0x00008,
- SC_MANAGER_QUERY_LOCK_STATUS = 0x00010,
- SC_MANAGER_MODIFY_BOOT_CONFIG = 0x00020,
- SC_MANAGER_ALL_ACCESS = ACCESS_MASK.STANDARD_RIGHTS_REQUIRED |
- SC_MANAGER_CONNECT |
- SC_MANAGER_CREATE_SERVICE |
- SC_MANAGER_ENUMERATE_SERVICE |
- SC_MANAGER_LOCK |
- SC_MANAGER_QUERY_LOCK_STATUS |
- SC_MANAGER_MODIFY_BOOT_CONFIG,
- GENERIC_READ = ACCESS_MASK.STANDARD_RIGHTS_READ |
- SC_MANAGER_ENUMERATE_SERVICE |
- SC_MANAGER_QUERY_LOCK_STATUS,
- GENERIC_WRITE = ACCESS_MASK.STANDARD_RIGHTS_WRITE |
- SC_MANAGER_CREATE_SERVICE |
- SC_MANAGER_MODIFY_BOOT_CONFIG,
- GENERIC_EXECUTE = ACCESS_MASK.STANDARD_RIGHTS_EXECUTE |
- SC_MANAGER_CONNECT | SC_MANAGER_LOCK,
- GENERIC_ALL = SC_MANAGER_ALL_ACCESS,
- }
- [Flags]
- public enum SERVICE_ACCESS : uint
- {
- SERVICE_QUERY_CONFIG = 0x00001,
- SERVICE_CHANGE_CONFIG = 0x00002,
- SERVICE_QUERY_STATUS = 0x00004,
- SERVICE_ENUMERATE_DEPENDENTS = 0x00008,
- SERVICE_START = 0x00010,
- SERVICE_STOP = 0x00020,
- SERVICE_PAUSE_CONTINUE = 0x00040,
- SERVICE_INTERROGATE = 0x00080,
- SERVICE_USER_DEFINED_CONTROL = 0x00100,
- SERVICE_ALL_ACCESS = (ACCESS_MASK.STANDARD_RIGHTS_REQUIRED |
- SERVICE_QUERY_CONFIG |
- SERVICE_CHANGE_CONFIG |
- SERVICE_QUERY_STATUS |
- SERVICE_ENUMERATE_DEPENDENTS |
- SERVICE_START |
- SERVICE_STOP |
- SERVICE_PAUSE_CONTINUE |
- SERVICE_INTERROGATE |
- SERVICE_USER_DEFINED_CONTROL),
- GENERIC_READ = ACCESS_MASK.STANDARD_RIGHTS_READ |
- SERVICE_QUERY_CONFIG |
- SERVICE_QUERY_STATUS |
- SERVICE_INTERROGATE |
- SERVICE_ENUMERATE_DEPENDENTS,
- GENERIC_WRITE = ACCESS_MASK.STANDARD_RIGHTS_WRITE |
- SERVICE_CHANGE_CONFIG,
- GENERIC_EXECUTE = ACCESS_MASK.STANDARD_RIGHTS_EXECUTE |
- SERVICE_START |
- SERVICE_STOP |
- SERVICE_PAUSE_CONTINUE |
- SERVICE_USER_DEFINED_CONTROL,
- ACCESS_SYSTEM_SECURITY = ACCESS_MASK.ACCESS_SYSTEM_SECURITY,
- DELETE = ACCESS_MASK.DELETE,
- READ_CONTROL = ACCESS_MASK.READ_CONTROL,
- WRITE_DAC = ACCESS_MASK.WRITE_DAC,
- WRITE_OWNER = ACCESS_MASK.WRITE_OWNER,
- }
- public enum SERVICE_CONTROL : uint
- {
- STOP = 0x00000001,
- PAUSE = 0x00000002,
- CONTINUE = 0x00000003,
- INTERROGATE = 0x00000004,
- SHUTDOWN = 0x00000005,
- PARAMCHANGE = 0x00000006,
- NETBINDADD = 0x00000007,
- NETBINDREMOVE = 0x00000008,
- NETBINDENABLE = 0x00000009,
- NETBINDDISABLE = 0x0000000A,
- DEVICEEVENT = 0x0000000B,
- HARDWAREPROFILECHANGE = 0x0000000C,
- POWEREVENT = 0x0000000D,
- SESSIONCHANGE = 0x0000000E
- }
- public enum SERVICE_STATE : uint
- {
- SERVICE_STOPPED = 0x00000001,
- SERVICE_START_PENDING = 0x00000002,
- SERVICE_STOP_PENDING = 0x00000003,
- SERVICE_RUNNING = 0x00000004,
- SERVICE_CONTINUE_PENDING = 0x00000005,
- SERVICE_PAUSE_PENDING = 0x00000006,
- SERVICE_PAUSED = 0x00000007
- }
- [Flags]
- public enum SERVICE_TYPES : int
- {
- SERVICE_KERNEL_DRIVER = 0x00000001,
- SERVICE_FILE_SYSTEM_DRIVER = 0x00000002,
- SERVICE_WIN32_OWN_PROCESS = 0x00000010,
- SERVICE_WIN32_SHARE_PROCESS = 0x00000020,
- SERVICE_INTERACTIVE_PROCESS = 0x00000100
- }
- [Flags]
- public enum SERVICE_TYPE : uint
- {
- SERVICE_KERNEL_DRIVER = 0x00000001,
- SERVICE_FILE_SYSTEM_DRIVER = 0x00000002,
- SERVICE_WIN32_OWN_PROCESS = 0x00000010,
- SERVICE_WIN32_SHARE_PROCESS = 0x00000020,
- SERVICE_INTERACTIVE_PROCESS = 0x00000100,
- }
- public enum SERVICE_START : uint
- {
- SERVICE_BOOT_START = 0x00000000,
- SERVICE_SYSTEM_START = 0x00000001,
- SERVICE_AUTO_START = 0x00000002,
- SERVICE_DEMAND_START = 0x00000003,
- SERVICE_DISABLED = 0x00000004,
- }
- public enum SERVICE_ERROR
- {
- SERVICE_ERROR_IGNORE = 0x00000000,
- SERVICE_ERROR_NORMAL = 0x00000001,
- SERVICE_ERROR_SEVERE = 0x00000002,
- SERVICE_ERROR_CRITICAL = 0x00000003,
- }
- [Flags]
- private enum ACCESS_MASK : uint
- {
- DELETE = 0x00010000,
- READ_CONTROL = 0x00020000,
- WRITE_DAC = 0x00040000,
- WRITE_OWNER = 0x00080000,
- SYNCHRONIZE = 0x00100000,
- STANDARD_RIGHTS_REQUIRED = 0x000F0000,
- STANDARD_RIGHTS_READ = 0x00020000,
- STANDARD_RIGHTS_WRITE = 0x00020000,
- STANDARD_RIGHTS_EXECUTE = 0x00020000,
- STANDARD_RIGHTS_ALL = 0x001F0000,
- SPECIFIC_RIGHTS_ALL = 0x0000FFFF,
- ACCESS_SYSTEM_SECURITY = 0x01000000,
- MAXIMUM_ALLOWED = 0x02000000,
- GENERIC_READ = 0x80000000,
- GENERIC_WRITE = 0x40000000,
- GENERIC_EXECUTE = 0x20000000,
- GENERIC_ALL = 0x10000000,
- DESKTOP_READOBJECTS = 0x00000001,
- DESKTOP_CREATEWINDOW = 0x00000002,
- DESKTOP_CREATEMENU = 0x00000004,
- DESKTOP_HOOKCONTROL = 0x00000008,
- DESKTOP_JOURNALRECORD = 0x00000010,
- DESKTOP_JOURNALPLAYBACK = 0x00000020,
- DESKTOP_ENUMERATE = 0x00000040,
- DESKTOP_WRITEOBJECTS = 0x00000080,
- DESKTOP_SWITCHDESKTOP = 0x00000100,
- WINSTA_ENUMDESKTOPS = 0x00000001,
- WINSTA_READATTRIBUTES = 0x00000002,
- WINSTA_ACCESSCLIPBOARD = 0x00000004,
- WINSTA_CREATEDESKTOP = 0x00000008,
- WINSTA_WRITEATTRIBUTES = 0x00000010,
- WINSTA_ACCESSGLOBALATOMS = 0x00000020,
- WINSTA_EXITWINDOWS = 0x00000040,
- WINSTA_ENUMERATE = 0x00000100,
- WINSTA_READSCREEN = 0x00000200,
- WINSTA_ALL_ACCESS = 0x0000037F
- }
- #endregion
- #region Structs
- [StructLayout(LayoutKind.Sequential, Pack = 0)]
- public struct SERVICE_STATUS
- {
- public SERVICE_TYPES dwServiceType;
- public SERVICE_STATE dwCurrentState;
- public uint dwControlsAccepted;
- public uint dwWin32ExitCode;
- public uint dwServiceSpecificExitCode;
- public uint dwCheckPoint;
- public uint dwWaitHint;
- }
- [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
- public struct SERVICE_STATUS_PROCESS
- {
- public int serviceType;
- public int currentState;
- public int controlsAccepted;
- public int win32ExitCode;
- public int serviceSpecificExitCode;
- public int checkPoint;
- public int waitHint;
- public int processID;
- public int serviceFlags;
- public static explicit operator SERVICE_STATUS_PROCESS(IntPtr v)
- {
- throw new NotImplementedException(v.ToString());
- }
- }
- #endregion
- #region Functions
- [DllImport("advapi32.dll", EntryPoint = "OpenSCManagerW", ExactSpelling = true, CharSet = CharSet.Unicode, SetLastError = true)]
- public static extern IntPtr OpenSCManager(string machineName, string databaseName, ServiceManagerNative.SCM_ACCESS dwAccess);
- [DllImport("advapi32.dll", EntryPoint = "OpenSCManagerW", ExactSpelling = true, CharSet = CharSet.Unicode, SetLastError = true)]
- public static extern IntPtr OpenSCManager(IntPtr machineName, IntPtr databaseName, ServiceManagerNative.SCM_ACCESS dwAccess);
- [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
- 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);
- [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
- 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);
- [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
- public static extern IntPtr OpenService(IntPtr hSCManager, string lpServiceName, ServiceManagerNative.SERVICE_ACCESS dwDesiredAccess);
- [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
- public static extern bool QueryServiceStatusEx(IntPtr serviceHandle, int infoLevel, IntPtr buffer, int bufferSize, out int bytesNeeded);
- [DllImport("advapi32", SetLastError = true)]
- [return: MarshalAs(UnmanagedType.Bool)]
- public static extern bool StartService(IntPtr hService, int dwNumServiceArgs, IntPtr lpServiceArgVectors);
- [DllImport("advapi32.dll", SetLastError = true)]
- [return: MarshalAs(UnmanagedType.Bool)]
- public static extern bool ControlService(IntPtr hService, SERVICE_CONTROL dwControl, ref SERVICE_STATUS lpServiceStatus);
- [DllImport("advapi32.dll", SetLastError = true)]
- [return: MarshalAs(UnmanagedType.Bool)]
- public static extern bool DeleteService(IntPtr hService);
- [DllImport("advapi32.dll", SetLastError = true)]
- [return: MarshalAs(UnmanagedType.Bool)]
- public static extern bool CloseServiceHandle(IntPtr hSCObject);
- #endregion
- }
- }
|