Add support for running RobloxPlayerBeta as Admin

for some reason, i'm unable to delete the appcompatflags entry programatically in the uninstall process? weird
This commit is contained in:
pizzaboxer 2024-10-26 23:51:40 +01:00
parent 643a1f0db2
commit aab9e153d1
No known key found for this signature in database
GPG Key ID: 59D4A1DBAD0F2BA8
2 changed files with 33 additions and 1 deletions

View File

@ -11,6 +11,8 @@
#warning "Automatic updater debugging is enabled"
#endif
using System.ComponentModel;
using System.Data;
using System.Windows;
using System.Windows.Forms;
using System.Windows.Shell;
@ -337,7 +339,12 @@ namespace Bloxstrap
WorkingDirectory = AppData.Directory
};
if (_launchMode == LaunchMode.StudioAuth)
if (_launchMode == LaunchMode.Player && ShouldRunAsAdmin())
{
startInfo.Verb = "runas";
startInfo.UseShellExecute = true;
}
else if (_launchMode == LaunchMode.StudioAuth)
{
Process.Start(startInfo);
return;
@ -372,6 +379,11 @@ namespace Bloxstrap
using var process = Process.Start(startInfo)!;
_appPid = process.Id;
}
catch (Win32Exception ex) when (ex.NativeErrorCode == 1223)
{
// 1223 = ERROR_CANCELLED, gets thrown if a UAC prompt is cancelled
return;
}
catch (Exception)
{
// attempt a reinstall on next launch
@ -456,6 +468,24 @@ namespace Bloxstrap
Thread.Sleep(1000);
}
private bool ShouldRunAsAdmin()
{
foreach (var root in WindowsRegistry.Roots)
{
using var key = root.OpenSubKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers");
if (key is null)
continue;
string? flags = (string?)key.GetValue(AppData.ExecutablePath);
if (flags is not null && flags.Contains("RUNASADMIN", StringComparison.OrdinalIgnoreCase))
return true;
}
return false;
}
public void Cancel()
{
const string LOG_IDENT = "Bootstrapper::Cancel";

View File

@ -5,6 +5,8 @@ namespace Bloxstrap.Utility
static class WindowsRegistry
{
private const string RobloxPlaceKey = "Roblox.Place";
public static readonly List<RegistryKey> Roots = new() { Registry.CurrentUser, Registry.LocalMachine };
public static void RegisterProtocol(string key, string name, string handler, string handlerParam = "%1")
{