public void CreateService()

in SimpleRemoteConsole/ServiceInterop/Service.cs [88:166]


        public void CreateService(bool start = true)
        {
            var hSCManager = IntPtr.Zero;
            var hService = IntPtr.Zero;

            if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
            {
                var errorMsg = "Services can only be installed on Windows platforms.";
                logger.Error("Create service failed: " + errorMsg);
                throw new PlatformNotSupportedException();
            }

            try
            {
                hSCManager = NativeServiceWrapper.OpenSCManagerW(null, null, (uint)SCMPermissions.SC_MANAGER_ALL_ACCESS);
                if (hSCManager == IntPtr.Zero)
                {
                    var error = Marshal.GetLastWin32Error();
                    var errorMsg = "Error when opening SCM: " + error;

                    if (error == 0x5)
                    {
                        errorMsg = "Error when opening SCM: Access Denied. Please try again with administrator privileges.";
                    }

                    logger.Error("Create service failed: " + errorMsg);
                    throw new Win32Exception(error, errorMsg);
                }

                var serviceCmd = new StringBuilder();
                serviceCmd.AppendFormat("\"{0}\"", binaryPath);
                if (serviceArgs != null)
                {
                    foreach (var arg in serviceArgs)
                    {
                        serviceCmd.Append(" ");
                        serviceCmd.Append(arg);
                    }
                }

                hService = NativeServiceWrapper.CreateServiceW(hSCManager, serviceName, displayName, (uint)ServicePermissions.SERVICE_ALL_ACCESS, serviceType, startType, errorSeverity, serviceCmd.ToString(), null, IntPtr.Zero, null, username, password);
                if (hService == IntPtr.Zero)
                {
                    var error = Marshal.GetLastWin32Error();
                    if (error != (int)ServiceErrorCodes.ERROR_SERVICE_EXISTS)
                    {
                        var errorMsg = "Create service failed with error: " + error;
                        logger.Error("Create service failed: " + errorMsg);
                        throw new Win32Exception(error, errorMsg);
                    }

                    hService = NativeServiceWrapper.OpenServiceW(hSCManager, serviceName, (uint)ServicePermissions.SERVICE_START);
                    if (hService == IntPtr.Zero)
                    {
                        error = Marshal.GetLastWin32Error();
                        var errorMsg = "Could not open the existing service. Error: " + error;
                        logger.Error("Create service failed: " + errorMsg);
                        throw new Win32Exception(error, errorMsg);
                    }
                }

                if (start)
                {
                    LaunchService(hSCManager, hService);
                }
            }
            finally
            {
                if (hService != IntPtr.Zero)
                {
                    NativeServiceWrapper.CloseServiceHandle(hService);
                }

                if (hSCManager != IntPtr.Zero)
                {
                    NativeServiceWrapper.CloseServiceHandle(hSCManager);
                }
            }
        }