JJ_MKVMaker/lib/platform/windows/elevation.dart

34 lines
1003 B
Dart

import 'dart:ffi';
import 'dart:io';
import 'package:flutter/foundation.dart';
typedef _IsAdminC = Int32 Function();
typedef _IsAdminD = int Function();
/// 이 프로그램이 관리자 권한 (높은 무결성) 으로 실행 중인지 (207).
/// 내장 Chrome 엔진 (CEF) 은 관리자 권한이면 스스로 끝나고, 억지로 돌리면 샌드박스 없이 관리자 권한으로 웹 페이지를 돌린다.
class Elevation {
Elevation._();
/// 시험용: 정해 두면 그 값
@visibleForTesting
static bool? debugElevated;
static bool? _cached;
/// 관리자 권한으로 실행 중인지 (Windows 만, 모르면 false)
static bool get elevated {
if (debugElevated case final v?) return v;
if (!Platform.isWindows) return false;
return _cached ??= () {
try {
final f = DynamicLibrary.open('shell32.dll').lookupFunction<_IsAdminC, _IsAdminD>('IsUserAnAdmin');
return f() != 0;
} catch (_) {
return false;
}
}();
}
}