记一个windows管理服务的powershell脚本

脚本部分

$servicePath = "C:\Users\Administrator\Desktop\service\detection.exe"
$workingDirectory = "C:\Users\Administrator\Desktop\service"
$logFile = "C:\Users\Administrator\Desktop\service\service.log"
$errorLogFile = "C:\Users\Administrator\Desktop\service\error.log"
$serviceName = "DetectionService"
$taskName = "DetectionService_AutoStart"

# 检查服务状态函数
function Get-ServiceStatus {
    $process = Get-Process -Name "detection" -ErrorAction SilentlyContinue
    if ($process) {
        return "Running (PID: $($process.Id))"
    }
    return "Stopped"
}

# 启动服务函数
function Start-Service {
    if (-not (Get-Process -Name "detection" -ErrorAction SilentlyContinue)) {
        Write-Host "Starting service..."
        try {
            $processArgs = @{
                FilePath = $servicePath
                WorkingDirectory = $workingDirectory
                RedirectStandardOutput = $logFile
                RedirectStandardError = $errorLogFile
                WindowStyle = 'Hidden'
                PassThru = $true
                ErrorAction = 'Stop'
            }
            $process = Start-Process @processArgs
            Write-Host "Service started successfully (PID: $($process.Id))" -ForegroundColor Green
        } catch {
            Write-Host "Error starting service: $_" -ForegroundColor Red
        }
    } else {
        $status = Get-ServiceStatus
        Write-Host "Service is already $status. Cannot start again." -ForegroundColor Yellow
    }
}

# 停止服务函数
function Stop-Service {
    $process = Get-Process -Name "detection" -ErrorAction SilentlyContinue
    if ($process) {
        Write-Host "Stopping service (PID: $($process.Id))..."
        try {
            $process | Stop-Process -Force -ErrorAction Stop
            Start-Sleep -Seconds 1  # 给进程一些时间退出
            if (-not (Get-Process -Name "detection" -ErrorAction SilentlyContinue)) {
                Write-Host "Service stopped successfully." -ForegroundColor Green
            } else {
                Write-Host "Failed to stop service. Please check manually." -ForegroundColor Red
            }
        } catch {
            Write-Host "Error stopping service: $_" -ForegroundColor Red
        }
    } else {
        Write-Host "Service is not currently running." -ForegroundColor Yellow
    }
}

# 重启服务函数
function Restart-Service {
    Stop-Service
    if (-not (Get-Process -Name "detection" -ErrorAction SilentlyContinue)) {
        Start-Sleep -Seconds 1
        Start-Service
    } else {
        Write-Host "Failed to stop service, cannot restart." -ForegroundColor Red
    }
}

# 使用任务计划程序设置开机自启
function Set-AutoStart {
    Write-Host "Setting service to start on boot using Task Scheduler..."
    try {
        # 检查是否以管理员身份运行
        $currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
        if (-not $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
            throw "This operation requires administrator privileges. Please run the script as an administrator."
        }

        # 检查任务是否已存在
        $taskExists = Get-ScheduledTask -TaskName $taskName -ErrorAction SilentlyContinue
        if ($taskExists) {
            Write-Host "Auto-start task already exists. Updating configuration..." -ForegroundColor Yellow
            Unregister-ScheduledTask -TaskName $taskName -Confirm:$false
        }

        # 创建新任务
        $action = New-ScheduledTaskAction -Execute $servicePath -WorkingDirectory $workingDirectory
        $trigger = New-ScheduledTaskTrigger -AtStartup
        $settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable
        $principal = New-ScheduledTaskPrincipal -UserId "NT AUTHORITY\SYSTEM" -LogonType ServiceAccount -RunLevel Highest

        $task = New-ScheduledTask -Action $action -Trigger $trigger -Settings $settings -Principal $principal
        Register-ScheduledTask -TaskName $taskName -InputObject $task -ErrorAction Stop | Out-Null

        Write-Host "Service set to auto start on boot (Task Name: $taskName)." -ForegroundColor Green
        Write-Host "Task Scheduler configuration:"
        Get-ScheduledTask -TaskName $taskName | Format-List
    } catch {
        Write-Host "Error setting auto-start: $_" -ForegroundColor Red
    }
}

# 取消开机自启
function Remove-AutoStart {
    Write-Host "Removing auto-start configuration..."
    try {
        # 检查是否以管理员身份运行
        $currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
        if (-not $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
            throw "This operation requires administrator privileges. Please run the script as an administrator."
        }

        $task = Get-ScheduledTask -TaskName $taskName -ErrorAction SilentlyContinue
        if ($task) {
            Unregister-ScheduledTask -TaskName $taskName -Confirm:$false -ErrorAction Stop
            Write-Host "Auto-start configuration removed successfully." -ForegroundColor Green
        } else {
            Write-Host "Auto-start task not found. Nothing to remove." -ForegroundColor Yellow
        }
    } catch {
        Write-Host "Error removing auto-start: $_" -ForegroundColor Red
    }
}

# 检查自启状态
function Check-AutoStartStatus {
    Write-Host "Checking auto-start configuration..."
    try {
        $task = Get-ScheduledTask -TaskName $taskName -ErrorAction SilentlyContinue
        if ($task) {
            Write-Host "Auto-start is ENABLED (Task Name: $taskName)" -ForegroundColor Green
            $task | Format-List State, Actions, Triggers, Settings
        } else {
            Write-Host "Auto-start is DISABLED" -ForegroundColor Yellow
        }
    } catch {
        Write-Host "Error checking auto-start status: $_" -ForegroundColor Red
    }
}

# 显示服务状态
function Show-Status {
    $status = Get-ServiceStatus
    Write-Host "Service status: $status" -ForegroundColor Cyan
}

# 脚本菜单
function Show-Menu {
    Clear-Host
    Write-Host "===================="
    Write-Host "Service Management"
    Write-Host "===================="
    Write-Host "1. Start Service"
    Write-Host "2. Stop Service"
    Write-Host "3. Restart Service"
    Write-Host "4. Set Auto Start (Admin required)"
    Write-Host "5. Remove Auto Start (Admin required)"
    Write-Host "6. Check Auto Start Status"
    Write-Host "7. Check Service Status"
    Write-Host "8. Exit"
    Write-Host "===================="
    Show-Status
}

# 主程序
do {
    Show-Menu
    $choice = Read-Host "Enter your choice"
    
    switch ($choice) {
        1 { Start-Service }
        2 { Stop-Service }
        3 { Restart-Service }
        4 { Set-AutoStart }
        5 { Remove-AutoStart }
        6 { Check-AutoStartStatus }
        7 { Show-Status }
        8 { break }
        default { Write-Host "Invalid choice. Please try again." -ForegroundColor Red }
    }
    if ($choice -ne 8) {
        Read-Host "Press Enter to continue..."
    }
} while ($choice -ne 8)

Write-Host "Exiting service manager..."
Write-Host "Exiting service manager..."

功能介绍

管理服务

  • 启停
  • 开关自启
  • 查看状态

存放

脚本文件需要以 .ps1 结尾
只需要将脚本的路径加入到环境变量的PATH中就可以在powershell中自动补全了

posted @ 2025-07-23 09:44  厚礼蝎  阅读(43)  评论(0)    收藏  举报