feat.PLONDS在线安装器继续优化

This commit is contained in:
lincube
2026-06-09 22:18:27 +08:00
parent 2768b76e1e
commit 13895e0f43
16 changed files with 287 additions and 120 deletions

View File

@@ -28,6 +28,7 @@ internal sealed class FilesPackageInstaller
var sourceAppDirectory = ResolveFullPackageAppDirectory(package.ExtractDirectory, package.Version);
var targetDeployment = BuildDeploymentDirectory(launcherRoot, package.Version);
InstallerElevation.EnsureCanInstall(launcherRoot);
InstallerPathGuard.EnsureUsableInstallPath(launcherRoot, EstimateRequiredBytes(sourceAppDirectory));
Directory.CreateDirectory(launcherRoot);
await CopyLauncherRootPayloadAsync(package.ExtractDirectory, sourceAppDirectory, launcherRoot, package.Version, progress, cancellationToken)
@@ -299,7 +300,9 @@ internal sealed class FilesPackageInstaller
return;
}
var startMenu = Environment.GetFolderPath(Environment.SpecialFolder.CommonStartMenu);
var startMenu = InstallerElevation.IsRunningElevated()
? Environment.GetFolderPath(Environment.SpecialFolder.CommonStartMenu)
: Environment.GetFolderPath(Environment.SpecialFolder.StartMenu);
if (string.IsNullOrWhiteSpace(startMenu))
{
startMenu = Environment.GetFolderPath(Environment.SpecialFolder.StartMenu);

View File

@@ -0,0 +1,52 @@
using System.Security.Principal;
namespace LanDesktopPLONDS.Installer.Services;
internal static class InstallerElevation
{
public static bool IsRunningElevated()
{
if (!OperatingSystem.IsWindows())
{
return true;
}
using var identity = WindowsIdentity.GetCurrent();
var principal = new WindowsPrincipal(identity);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
public static bool RequiresElevation(string installPath)
{
if (!OperatingSystem.IsWindows())
{
return false;
}
var fullPath = Path.GetFullPath(installPath);
return IsUnderSpecialFolder(fullPath, Environment.SpecialFolder.ProgramFiles)
|| IsUnderSpecialFolder(fullPath, Environment.SpecialFolder.ProgramFilesX86)
|| IsUnderWindowsDirectory(fullPath);
}
public static void EnsureCanInstall(string installPath)
{
if (RequiresElevation(installPath) && !IsRunningElevated())
{
throw new UnauthorizedAccessException(
"The selected installation path requires administrator permission. Restart the installer as administrator or choose a user-writable folder.");
}
}
private static bool IsUnderSpecialFolder(string fullPath, Environment.SpecialFolder folder)
{
var root = Environment.GetFolderPath(folder);
return !string.IsNullOrWhiteSpace(root) && InstallerPathGuard.IsSameOrChildPath(root, fullPath);
}
private static bool IsUnderWindowsDirectory(string fullPath)
{
var windows = Environment.GetFolderPath(Environment.SpecialFolder.Windows);
return !string.IsNullOrWhiteSpace(windows) && InstallerPathGuard.IsSameOrChildPath(windows, fullPath);
}
}

View File

@@ -6,15 +6,13 @@ public static class InstallerPathGuard
public static string GetDefaultInstallPath()
{
var programFiles = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);
if (string.IsNullOrWhiteSpace(programFiles))
var localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
if (string.IsNullOrWhiteSpace(localAppData))
{
programFiles = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
"Programs");
localAppData = AppContext.BaseDirectory;
}
return Path.Combine(programFiles, ApplicationDirectoryName);
return Path.Combine(localAppData, "Programs", ApplicationDirectoryName);
}
public static string GetInstallPathForSelectedFolder(string selectedFolder)