- Upgrade Go version from 1.21 to 1.25.0 - Update golang.org/x/sys dependency to v0.42.0 - Add Unix/Linux admin check using os.Geteuid() with sudo requirement - Add Windows admin check using windows.SID and token membership validation - Integrate admin privilege validation into main CLI entry point - Enhance monitor.go with graceful signal handling for Ctrl+C interrupts - Add signal channels for clean shutdown of monitoring loop - Ensures VPN client runs with required elevated privileges on both platforms
58 lines
2.0 KiB
Go
58 lines
2.0 KiB
Go
// +build windows
|
||
|
||
package admin
|
||
|
||
import (
|
||
"fmt"
|
||
"os"
|
||
"golang.org/x/sys/windows"
|
||
)
|
||
|
||
// IsAdmin проверяет, запущено ли приложение с правами администратора
|
||
func IsAdmin() bool {
|
||
var sid *windows.SID
|
||
|
||
// Получаем SID группы администраторов
|
||
err := windows.AllocateAndInitializeSid(
|
||
&windows.SECURITY_NT_AUTHORITY,
|
||
2,
|
||
windows.SECURITY_BUILTIN_DOMAIN_RID,
|
||
windows.DOMAIN_ALIAS_RID_ADMINS,
|
||
0, 0, 0, 0, 0, 0,
|
||
&sid)
|
||
if err != nil {
|
||
return false
|
||
}
|
||
defer windows.FreeSid(sid)
|
||
|
||
// Получаем текущий токен процесса
|
||
token := windows.Token(0)
|
||
|
||
// Проверяем членство в группе
|
||
member, err := token.IsMember(sid)
|
||
if err != nil {
|
||
return false
|
||
}
|
||
|
||
return member
|
||
}
|
||
|
||
// RequireAdmin проверяет права администратора и завершает программу, если их нет
|
||
func RequireAdmin() {
|
||
if !IsAdmin() {
|
||
fmt.Println("╔════════════════════════════════════════════════════════════╗")
|
||
fmt.Println("║ ⚠ ТРЕБУЮТСЯ ПРАВА АДМИНИСТРАТОРА ║")
|
||
fmt.Println("╚════════════════════════════════════════════════════════════╝")
|
||
fmt.Println()
|
||
fmt.Println("Это приложение требует прав администратора для работы с VPN.")
|
||
fmt.Println()
|
||
fmt.Println("Пожалуйста, запустите приложение от имени администратора:")
|
||
fmt.Println(" 1. Щелкните правой кнопкой мыши на vpn-client-cli.exe")
|
||
fmt.Println(" 2. Выберите 'Запуск от имени администратора'")
|
||
fmt.Println()
|
||
fmt.Println("Нажмите Enter для выхода...")
|
||
fmt.Scanln()
|
||
os.Exit(1)
|
||
}
|
||
}
|