mail-organizer/scripts/Install-Service.ps1

101 lines
3.1 KiB
PowerShell

#Requires -Version 5.1
#Requires -RunAsAdministrator
<#
.SYNOPSIS
Installs the MailOrganizer Windows service via NSSM.
.DESCRIPTION
Registers a Windows service that runs Run-ServiceLoop.ps1 via NSSM.
NSSM must be available in PATH or specified via -NssmPath.
.PARAMETER ServiceName
Name of the Windows service (default: MailOrganizer)
.PARAMETER NssmPath
Path to nssm.exe (default: looks in PATH, then tools\nssm.exe)
.EXAMPLE
.\Install-Service.ps1
.\Install-Service.ps1 -ServiceName "MailOrganizer-Test" -NssmPath "C:\tools\nssm.exe"
#>
param(
[string]$ServiceName = "MailOrganizer",
[string]$NssmPath
)
$ErrorActionPreference = "Stop"
# --- Locate NSSM ---
if ($NssmPath -and (Test-Path $NssmPath)) {
$nssm = $NssmPath
}
elseif (Get-Command nssm -ErrorAction SilentlyContinue) {
$nssm = (Get-Command nssm).Source
}
else {
$toolsPath = Join-Path (Split-Path $PSScriptRoot -Parent) "tools\nssm.exe"
if (Test-Path $toolsPath) {
$nssm = $toolsPath
}
else {
Write-Host "ERROR: NSSM not found. Provide -NssmPath, add to PATH, or place in tools\nssm.exe" -ForegroundColor Red
exit 1
}
}
Write-Host "Using NSSM: $nssm"
# --- Check if service already exists ---
$existing = Get-Service -Name $ServiceName -ErrorAction SilentlyContinue
if ($existing) {
Write-Host "ERROR: Service '$ServiceName' already exists (Status: $($existing.Status)). Uninstall first." -ForegroundColor Red
exit 1
}
# --- Paths ---
$scriptDir = $PSScriptRoot
$projectRoot = Split-Path $scriptDir -Parent
$loopScript = Join-Path $scriptDir "Run-ServiceLoop.ps1"
$logDir = Join-Path $projectRoot "logs"
if (-not (Test-Path $logDir)) {
New-Item -ItemType Directory -Path $logDir -Force | Out-Null
}
$powershell = Join-Path $env:SystemRoot "System32\WindowsPowerShell\v1.0\powershell.exe"
# --- Install service ---
Write-Host "Installing service '$ServiceName'..."
& $nssm install $ServiceName $powershell "-ExecutionPolicy Bypass -NoProfile -File `"$loopScript`""
if ($LASTEXITCODE -ne 0) { throw "NSSM install failed" }
# Configure working directory
& $nssm set $ServiceName AppDirectory $scriptDir
# Configure logging
$stdoutLog = Join-Path $logDir "service_stdout.log"
$stderrLog = Join-Path $logDir "service_stderr.log"
& $nssm set $ServiceName AppStdout $stdoutLog
& $nssm set $ServiceName AppStderr $stderrLog
& $nssm set $ServiceName AppStdoutCreationDisposition 4
& $nssm set $ServiceName AppStderrCreationDisposition 4
& $nssm set $ServiceName AppRotateFiles 1
& $nssm set $ServiceName AppRotateOnline 1
& $nssm set $ServiceName AppRotateBytes 5242880
# Set startup type to Automatic
& $nssm set $ServiceName Start SERVICE_AUTO_START
# Set description
& $nssm set $ServiceName Description "Mail-Organizer: Processes emails and files attachments to SharePoint"
Write-Host ""
Write-Host "Service '$ServiceName' installed successfully." -ForegroundColor Green
Write-Host " Stdout log: $stdoutLog"
Write-Host " Stderr log: $stderrLog"
Write-Host ""
Write-Host "To start: Start-Service $ServiceName"
Write-Host "To check: Get-Service $ServiceName"