# redeploy.ps1 — xoa file cu, copy file moi da ky, start lai service va tray $ErrorActionPreference = "Stop" $isAdmin = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole( [Security.Principal.WindowsBuiltInRole]::Administrator ) if (-not $isAdmin) { $log = "$env:TEMP\redeploy-log.txt" Remove-Item $log -ErrorAction SilentlyContinue Start-Process powershell -Verb RunAs -Wait ` -ArgumentList "-ExecutionPolicy Bypass -File `"$PSCommandPath`"" Start-Sleep -Milliseconds 600 if (Test-Path $log) { Get-Content $log } else { Write-Warning "Khong co log / UAC bi tu choi" } exit } Start-Transcript -Path "$env:TEMP\redeploy-log.txt" -Force | Out-Null $dist = "C:\Users\huanld\tailscale\dist" $dest = "C:\Program Files\Tailscale-Custom" $bins = @("tailscaled.exe","tailscale.exe","tailscale-tray.exe") # ─── Lay cert ky ─────────────────────────────────────── $cert = Get-ChildItem Cert:\LocalMachine\My | Where-Object { $_.Subject -eq "CN=Tailscale-Custom, O=SoftsBusiness, C=VN" -and $_.HasPrivateKey } | Sort-Object NotAfter -Descending | Select-Object -First 1 if (-not $cert) { Write-Error "Khong tim thay code-signing cert!"; Stop-Transcript | Out-Null; exit 1 } Write-Host "[cert] $($cert.Thumbprint)" # ─── Dung service va tray ────────────────────────────── Write-Host "`n==> Dung service + tray..." Stop-Service "Tailscale-Custom" -Force -ErrorAction SilentlyContinue Stop-Process -Name tailscaled -Force -ErrorAction SilentlyContinue Stop-Process -Name "tailscale-tray" -Force -ErrorAction SilentlyContinue Start-Sleep -Seconds 2 Write-Host " Done" # ─── Xoa binary cu trong Program Files ──────────────── Write-Host "`n==> Xoa file cu..." foreach ($b in $bins) { $path = Join-Path $dest $b if (Test-Path $path) { Remove-Item $path -Force Write-Host " Deleted: $b" } } # ─── Ky + copy file moi ─────────────────────────────── Write-Host "`n==> Ky va copy file moi..." foreach ($b in $bins) { $src = Join-Path $dist $b if (-not (Test-Path $src)) { Write-Warning " Khong co: $src"; continue } # Ky $r = Set-AuthenticodeSignature -FilePath $src -Certificate $cert ` -TimestampServer "http://timestamp.digicert.com" -HashAlgorithm SHA256 ` -ErrorAction SilentlyContinue if (-not $r -or $r.Status -eq "NotSigned") { $r = Set-AuthenticodeSignature -FilePath $src -Certificate $cert -HashAlgorithm SHA256 } $sigStatus = if ($r) { $r.Status } else { "?" } # Copy Copy-Item $src (Join-Path $dest $b) -Force $mb = [math]::Round((Get-Item $src).Length/1MB,1) Write-Host " [OK] $b | $mb MB | sig=$sigStatus" } # ─── Start service ───────────────────────────────────── Write-Host "`n==> Start service Tailscale-Custom..." Start-Service "Tailscale-Custom" Start-Sleep -Seconds 3 $svc = Get-Service "Tailscale-Custom" Write-Host " Status: $($svc.Status)" # ─── Start tray ──────────────────────────────────────── Write-Host "`n==> Start tailscale-tray..." $trayExe = Join-Path $dest "tailscale-tray.exe" Start-Process $trayExe Write-Host " Started: $trayExe" # ─── Xac nhan chu ky ────────────────────────────────── Write-Host "`n==> Xac nhan chu ky cuoi cung..." foreach ($b in $bins) { $path = Join-Path $dest $b if (-not (Test-Path $path)) { continue } $sig = Get-AuthenticodeSignature -FilePath $path Write-Host " $b => $($sig.Status)" } Write-Host "`n==> HOAN THANH" Stop-Transcript | Out-Null