Register minio.exe as a Windows Service

Time:2021-11-27

Tool development of registering Minio as windows service

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Management.Automation;
using System.Management.Automation.Runspaces;
using System.ServiceProcess;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Main : Form
    {
        public Main()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //Registration service
           var script= this.CreateXmlContent();

            try
            {
                using (Runspace runspace = RunspaceFactory.CreateRunspace())
                {
                    runspace.Open();
                    PowerShell ps = PowerShell.Create();
                    ps.Runspace = runspace;
                    ps.AddScript(script);
                    ps.Invoke();
                }

                Thread.Sleep(2000);
                //Start service
                StartService();

                MessageBox. Show (@ "service started successfully");
            }
            catch (Exception ex)
            {
                MessageBox. Show (@ "registration failed");
            }
        }

        private string CreateXmlContent()
        {
            var filePath = Path.Combine(Directory.GetCurrentDirectory(), "minio-service.ps1");
            if (!File.Exists(filePath))
            {
                File.Create(filePath).Close();
            }

            var content =
                "if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] \"Administrator\")) { Start-Process powershell.exe \"-NoProfile -ExecutionPolicy Bypass -File `\"$PSCommandPath`\"\" -Verb RunAs; exit }";
            content += "Set-Location -Path $PSScriptRoot\r\n\r\n";
            content += "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12\r\n";
            content += "$config = @'\r\n";
            content += "\r\n";
            content += $" {textBox1.Text}\r\n";
            content += $" {textBox1.Text}\r\n";
            content += " MinIO server is a nb oss server\r\n";
            content += " minio.exe\r\n";
            content += [email protected]" " + "\r\n";
            content += [email protected]" " + "\r\n";
            content += [email protected]" server --address 0.0.0.0:{textBox2.Text} {textBox3.Text}" + "\r\n";
            content += @" rotate" + "\r\n";
            content += @" " + "\r\n";
            content += @"'@" + "\r\n\r\n";
            content += @"Set-Content ""minio-service.xml"" $config" + "\r\n";
            content += @"Start-Process -WorkingDirectory $PSScriptRoot -FilePath ""$($PSScriptRoot)\minio-service.exe"" -ArgumentList ""install"" -NoNewWindow -PassThru -Wait" + "\r\n";
            content += @"Write-Host ""Installation done""";

            File.WriteAllText(filePath, content, Encoding.Default);

            return filePath;
        }

        private void Main_Load(object sender, EventArgs e)
        {
            textBox3.Text = Path.Combine(Directory.GetCurrentDirectory(), "minio");
            //Get resources
            var minio_service = MinioTool.Properties.Resources.minio_service;
            var exePath = Path.Combine(Directory.GetCurrentDirectory(), "minio-service.exe");
            if (!File.Exists(exePath))
            {
                File.Create(exePath).Close();
            }
            File.WriteAllBytes(exePath, minio_service);
        }

        /// 
        ///Start service
        /// 
        private void StartService()
        {
            ServiceController[] services = ServiceController.GetServices();
            foreach (ServiceController service in services)
            {
                if (service.ServiceName == textBox1.Text)
                {
                    if (service.Status != ServiceControllerStatus.Running)
                    {
                        service.Start();
                    }
                }
            }
        }
    }
}

Software screenshot:
png