<# Senkronis Yedekleme Ajani - Kurulum Scripti Kullanim (Yonetici PowerShell): .\install.ps1 -Token "snk_..." -ServerUrl "https://sunucu-adresi" Yapilanlar: - C:\ProgramData\Senkronis\Agent klasorune agent.ps1 ve config.json yazilir - "SenkronisAgent" adli zamanlanmis gorev SYSTEM hesabiyla, her 1 dakikada bir calisacak sekilde kurulur - Sunucuya cihaz kaydi yapilir #> param( [Parameter(Mandatory = $true)][string]$Token, [Parameter(Mandatory = $true)][string]$ServerUrl, [string]$InstallDir = "$env:ProgramData\Senkronis\Agent", [switch]$Uninstall ) $ErrorActionPreference = 'Stop' [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 $ServerUrl = $ServerUrl.TrimEnd('/') $TaskName = 'SenkronisAgent' function Write-Step($msg) { Write-Host "[Senkronis] $msg" -ForegroundColor Cyan } $isAdmin = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) if (-not $isAdmin) { throw 'Bu script Yonetici (Administrator) olarak calistirilmalidir.' } if ($Uninstall) { Write-Step 'Kaldiriliyor...' schtasks /Delete /TN $TaskName /F 2>$null | Out-Null if (Test-Path $InstallDir) { Remove-Item $InstallDir -Recurse -Force } Write-Step 'Ajan kaldirildi.' return } Write-Step "Kurulum klasoru: $InstallDir" New-Item -ItemType Directory -Force -Path $InstallDir | Out-Null New-Item -ItemType Directory -Force -Path "$InstallDir\logs" | Out-Null New-Item -ItemType Directory -Force -Path "$InstallDir\temp" | Out-Null Write-Step 'Ajan dosyasi sunucudan indiriliyor...' $agentPath = Join-Path $InstallDir 'agent.ps1' Invoke-WebRequest -Uri "$ServerUrl/api/agent/download/agent.ps1" -OutFile $agentPath -UseBasicParsing Write-Step 'Yapilandirma yaziliyor...' $config = @{ token = $Token; serverUrl = $ServerUrl; installDir = $InstallDir; version = '1.0.0' } $config | ConvertTo-Json | Set-Content -Path (Join-Path $InstallDir 'config.json') -Encoding UTF8 # config.json yalnizca SYSTEM ve Administrators okuyabilsin try { $cfgPath = Join-Path $InstallDir 'config.json' icacls $cfgPath /inheritance:r /grant:r 'SYSTEM:F' /grant:r 'Administrators:F' | Out-Null } catch { Write-Warning "Dosya izinleri ayarlanamadi: $_" } Write-Step 'Sunucuya cihaz kaydi yapiliyor...' try { $os = (Get-CimInstance Win32_OperatingSystem) $body = @{ hostname = $env:COMPUTERNAME; os = "$($os.Caption) $($os.Version)"; agentVersion = '1.0.0' } | ConvertTo-Json $resp = Invoke-RestMethod -Method Post -Uri "$ServerUrl/api/agent/register" -Headers @{ 'X-Agent-Token' = $Token } -ContentType 'application/json' -Body $body Write-Step "Kayit basarili: $($resp.deviceName) ($($resp.tenantName))" } catch { throw "Cihaz kaydi basarisiz. Token veya sunucu adresini kontrol edin. Hata: $($_.Exception.Message)" } Write-Step 'Zamanlanmis gorev olusturuluyor (her 1 dakika, SYSTEM)...' schtasks /Delete /TN $TaskName /F 2>$null | Out-Null $action = "powershell.exe -NoProfile -NonInteractive -ExecutionPolicy Bypass -WindowStyle Hidden -File `"$agentPath`"" $r = schtasks /Create /TN $TaskName /SC MINUTE /MO 1 /RU SYSTEM /RL HIGHEST /F /TR $action if ($LASTEXITCODE -ne 0) { throw "Zamanlanmis gorev olusturulamadi: $r" } # Gorev ayarlari: pil/AC kisitlamasi yok, uzun calismaya izin ver, zaten calisiyorsa yeni ornek baslatma try { $task = Get-ScheduledTask -TaskName $TaskName $task.Settings.DisallowStartIfOnBatteries = $false $task.Settings.StopIfGoingOnBatteries = $false $task.Settings.ExecutionTimeLimit = 'PT12H' $task.Settings.MultipleInstances = 'IgnoreNew' $task.Settings.StartWhenAvailable = $true Set-ScheduledTask -TaskName $TaskName -Settings $task.Settings | Out-Null } catch { Write-Warning "Gorev ayarlari guncellenemedi: $_" } schtasks /Run /TN $TaskName | Out-Null Write-Step 'Kurulum tamamlandi. Ajan her dakika sunucuyu kontrol edecek.' Write-Step "Loglar: $InstallDir\logs"