Script for upgrading certain versions of AME
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

264 lines
12 KiB

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Security.AccessControl;
using System.Security.Principal;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using amecs;
using Ameliorated.ConsoleUtils;
using Microsoft.Win32;
namespace ame_upgrade_preparation_tool
{
internal class Program
{
private static void RunAsUser(Action action)
{
var token = NSudo.GetUserToken();
Task.Run((Action)Delegate.Combine((Action)(() => { NSudo.GetUserPrivilege(token); }),
action)).Wait();
Marshal.FreeHGlobal(token);
}
public static async Task Main(string[] args)
{
ConsoleTUI.Initialize("AME Upgrade Script");
Console.WriteLine("\r\nChecking drives...");
var drives = DriveInfo.GetDrives();
List<string> driveLetters = new List<string>();
foreach (var drive in drives)
{
try
{
if (Directory.GetFiles(drive.RootDirectory.FullName).Contains(Path.Combine(drive.RootDirectory.FullName, "setup.exe")) && Directory.GetDirectories(drive.RootDirectory.FullName).Contains(Path.Combine(drive.RootDirectory.FullName, "sources")))
{
try
{
string extension = Directory.GetFiles(Path.Combine(drive.RootDirectory.FullName, "sources")).Contains(Path.Combine(drive.RootDirectory.FullName, "sources", "install.wim")) ? ".wim" : Directory.GetFiles(Path.Combine(drive.RootDirectory.FullName, "sources")).Contains(Path.Combine(drive.RootDirectory.FullName, "sources", "install.esd")) ? ".esd" : null;
if (string.IsNullOrEmpty(extension))
continue;
/*
var startInfo = new ProcessStartInfo
{
CreateNoWindow = true,
UseShellExecute = false,
WindowStyle = ProcessWindowStyle.Normal,
RedirectStandardError = true,
RedirectStandardOutput = true,
FileName = "DISM",
Arguments = "/Get-WimInfo /WimFile:\"" + Path.Combine(drive.RootDirectory.FullName, "sources", "install" + extension) + '"'
};
var exeProcess = new Process
{
StartInfo = startInfo,
EnableRaisingEvents = true
};
string versionString = null;
bool Win11 = false;
exeProcess.OutputDataReceived += delegate(object sender, DataReceivedEventArgs outLine)
{
if (!String.IsNullOrEmpty(outLine.Data))
{
var outputString = outLine.Data;
if (outputString.Contains("Version: "))
{
versionString = outputString.Substring(outputString.IndexOf(' ') + 1);
}
else if (outputString.Contains("Windows 11"))
{
Win11 = true;
}
}
};
exeProcess.Start();
exeProcess.BeginOutputReadLine();
bool exited = exeProcess.WaitForExit(5000);
exeProcess.CancelOutputRead();
if (versionString == null)
{
await Task.Delay(500);
}
*/
driveLetters.Add(drive.RootDirectory.FullName);
} catch (Exception e)
{
driveLetters.Add(drive.RootDirectory.FullName);
}
}
} catch
{
}
}
if (driveLetters.Count < 1)
{
Console.WriteLine("No mounted Windows ISO was detected.\r\n");
new ChoicePrompt() { Text = "Press any key to Exit...", AnyKey = true}.Start();
Environment.Exit(0);
}
if (driveLetters.Count > 1)
{
Console.WriteLine("Multiple ISOs detected, please dismount one.\r\n");
new ChoicePrompt() { Text = "Press any key to Exit...", AnyKey = true}.Start();
Environment.Exit(0);
}
var choice = new ChoicePrompt() { AllowEscape = false, Text = "\r\nThis will cause partial de-amelioration. Continue? (Y/N): " }.Start();
if (choice.Value == 2)
Environment.Exit(0);
string Username = null;
string UserDomain = null;
string UserSID = null;
try
{
NSudo.GetSystemPrivilege();
RunAsUser(() =>
{
Username = WindowsIdentity.GetCurrent().Name.Split('\\').Last();
UserDomain = WindowsIdentity.GetCurrent().Name.Split('\\').FirstOrDefault();
UserSID = WindowsIdentity.GetCurrent().User.ToString();
});
} catch (Exception e)
{
}
bool isSystem = WindowsIdentity.GetCurrent().IsSystem;
try
{
string ID = null;
var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
foreach (var item in key.GetSubKeyNames())
{
try
{
if (((string)key.OpenSubKey(item).GetValue("DisplayName")).Equals("Open-Shell"))
{
ID = item;
}
} catch (Exception e)
{
}
}
if (ID != null)
{
Console.WriteLine("\r\nUninstalling Open-Shell...");
var proc = Process.Start("MsiExec.exe", $"/X{ID} /quiet");
proc.WaitForExit();
if (UserSID != null)
{
try
{
var appData = (string)Registry.Users.OpenSubKey(UserSID + @"\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders").GetValue("AppData");
if (Directory.Exists(Path.Combine(appData, "OpenShell")))
Directory.Delete(Path.Combine(appData, "OpenShell"), true);
} catch (Exception e)
{
Console.WriteLine("Error: " + e);
}
}
await Task.Delay(5000);
if (!Process.GetProcessesByName("explorer").Any())
{
if (isSystem)
NSudo.RunProcessAsUser(NSudo.GetUserToken(), "explorer.exe", "");
else
Process.Start("explorer.exe");
}
}
} catch (Exception e)
{
Console.WriteLine("Error: " + e.Message);
}
Console.WriteLine("\r\nReverting settings...");
try
{
var polKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer", true);
if (polKey.GetValueNames().Contains("SettingsPageVisibility", StringComparer.InvariantCultureIgnoreCase))
{
polKey.DeleteValue("SettingsPageVisibility");
}
if (UserSID != null)
{
new Reg.Value() { KeyName = @$"HKU\{UserSID}\SOFTWARE\Policies\Microsoft\Windows\Explorer", ValueName = "DisableNotificationCenter", Operation = Reg.RegistryValueOperation.Delete }.Apply();
new Reg.Value() { KeyName = @$"HKU\{UserSID}\SOFTWARE\Classes\CLSID\{{27DD0F8B-3E0E-4ADC-A78A-66047E71ADC5}}\InprocServer32", ValueName = "", Type = Reg.RegistryValueType.REG_SZ, Data = ""}.Apply();
}
} catch (Exception e)
{
Console.WriteLine("Error: " + e.Message);
}
Thread.Sleep(3000);
Console.WriteLine("\r\nApplying preparation settings...");
try
{
new Reg.Key() { KeyName = @"HKLM\SYSTEM\Setup\LabConfig", Operation = RegistryOperation.Add }.Apply();
new Reg.Value() { KeyName = @"HKLM\SYSTEM\Setup\LabConfig", ValueName = "BypassTPMCheck", Type = Reg.RegistryValueType.REG_DWORD, Data = 1 }.Apply();
new Reg.Value() { KeyName = @"HKLM\SYSTEM\Setup\LabConfig", ValueName = "BypassCPUCheck", Type = Reg.RegistryValueType.REG_DWORD, Data = 1 }.Apply();
new Reg.Value() { KeyName = @"HKLM\SYSTEM\Setup\LabConfig", ValueName = "BypassStorageCheck", Type = Reg.RegistryValueType.REG_DWORD, Data = 1 }.Apply();
new Reg.Value() { KeyName = @"HKLM\SYSTEM\Setup\LabConfig", ValueName = "BypassSecureBootCheck", Type = Reg.RegistryValueType.REG_DWORD, Data = 1 }.Apply();
new Reg.Value() { KeyName = @"HKLM\SYSTEM\Setup\LabConfig", ValueName = "BypassRAMCheck", Type = Reg.RegistryValueType.REG_DWORD, Data = 1 }.Apply();
new Reg.Key() { KeyName = @"HKLM\SYSTEM\Setup\MoSetup", Operation = RegistryOperation.Add }.Apply();
new Reg.Value() { KeyName = @"HKLM\SYSTEM\Setup\MoSetup", ValueName = "AllowUpgradesWithUnsupportedTPMOrCPU", Type = Reg.RegistryValueType.REG_DWORD, Data = 1 }.Apply();
} catch (Exception e)
{
Console.WriteLine("Error: " + e.Message);
}
Thread.Sleep(1500);
var fc = Console.ForegroundColor;
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("\r\nCompleted configuration");
Console.ForegroundColor = fc;
Console.WriteLine("\r\nStarting Windows Setup...");
try
{
Process.Start(Path.Combine(driveLetters.First(), "setup.exe"), "/Auto Upgrade /DynamicUpdate Disable");
} catch (Exception e)
{
fc = Console.ForegroundColor;
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Error launching Windows Setup: " + e.Message);
Console.ForegroundColor = fc;
new ChoicePrompt() { Text = "Press any key to Exit...", AnyKey = true}.Start();
Environment.Exit(0);
}
fc = Console.ForegroundColor;
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("\r\nSetup launch successful, exiting...");
Thread.Sleep(6000);
}
}
}