@ -0,0 +1,67 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<project version="4"> | |||
<component name="AutoGeneratedRunConfigurationManager"> | |||
<projectFile>ame-upgrade-preparation-tool/ame-upgrade-preparation-tool.csproj</projectFile> | |||
</component> | |||
<component name="ChangeListManager"> | |||
<list default="true" id="6c2e4715-53e2-47ae-96d0-747ee55baae5" name="Changes" comment="" /> | |||
<option name="SHOW_DIALOG" value="false" /> | |||
<option name="HIGHLIGHT_CONFLICTS" value="true" /> | |||
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" /> | |||
<option name="LAST_RESOLUTION" value="IGNORE" /> | |||
</component> | |||
<component name="MarkdownSettingsMigration"> | |||
<option name="stateVersion" value="1" /> | |||
</component> | |||
<component name="ProjectId" id="2NfDy4X2JVU58v3kW9KOeDzH93f" /> | |||
<component name="ProjectViewState"> | |||
<option name="hideEmptyMiddlePackages" value="true" /> | |||
<option name="showLibraryContents" value="true" /> | |||
</component> | |||
<component name="PropertiesComponent"><![CDATA[{ | |||
"keyToString": { | |||
"RunOnceActivity.OpenProjectViewOnStart": "true", | |||
"WebServerToolWindowFactoryState": "false", | |||
"vue.rearranger.settings.migration": "true" | |||
} | |||
}]]></component> | |||
<component name="RunManager"> | |||
<configuration name="ame-upgrade-preparation-tool" type="DotNetProject" factoryName=".NET Project"> | |||
<option name="EXE_PATH" value="$PROJECT_DIR$/ame-upgrade-preparation-tool/bin/Debug/ame_upgrade_preparation_tool.exe" /> | |||
<option name="PROGRAM_PARAMETERS" value="" /> | |||
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/ame-upgrade-preparation-tool/bin/Debug" /> | |||
<option name="PASS_PARENT_ENVS" value="1" /> | |||
<option name="USE_EXTERNAL_CONSOLE" value="1" /> | |||
<option name="USE_MONO" value="0" /> | |||
<option name="RUNTIME_ARGUMENTS" value="" /> | |||
<option name="PROJECT_PATH" value="$PROJECT_DIR$/ame-upgrade-preparation-tool/ame-upgrade-preparation-tool.csproj" /> | |||
<option name="PROJECT_EXE_PATH_TRACKING" value="1" /> | |||
<option name="PROJECT_ARGUMENTS_TRACKING" value="1" /> | |||
<option name="PROJECT_WORKING_DIRECTORY_TRACKING" value="1" /> | |||
<option name="PROJECT_KIND" value="Console" /> | |||
<option name="PROJECT_TFM" value=".NETFramework,Version=v4.7.2" /> | |||
<method v="2"> | |||
<option name="Build" /> | |||
</method> | |||
</configuration> | |||
</component> | |||
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" /> | |||
<component name="TaskManager"> | |||
<task active="true" id="Default" summary="Default task"> | |||
<changelist id="6c2e4715-53e2-47ae-96d0-747ee55baae5" name="Changes" comment="" /> | |||
<created>1680046494161</created> | |||
<option name="number" value="Default" /> | |||
<option name="presentableId" value="Default" /> | |||
<updated>1680046494161</updated> | |||
<workItem from="1680046507858" duration="13562000" /> | |||
</task> | |||
<servers /> | |||
</component> | |||
<component name="TypeScriptGeneratedFilesManager"> | |||
<option name="version" value="3" /> | |||
</component> | |||
<component name="UnityUnitTestConfiguration" currentTestLauncher="NUnit" /> | |||
<component name="VcsManagerConfiguration"> | |||
<option name="CLEAR_INITIAL_COMMIT_MESSAGE" value="true" /> | |||
</component> | |||
</project> |
@ -0,0 +1 @@ | |||
ame_upgrade_script |
@ -0,0 +1,4 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<project version="4"> | |||
<component name="Encoding" addBOMForNewFiles="with BOM under Windows, with no BOM otherwise" /> | |||
</project> |
@ -0,0 +1,8 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<project version="4"> | |||
<component name="UserContentModel"> | |||
<attachedFolders /> | |||
<explicitIncludes /> | |||
<explicitExcludes /> | |||
</component> | |||
</project> |
@ -0,0 +1,6 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<project version="4"> | |||
<component name="RiderProjectSettingsUpdater"> | |||
<option name="vcsConfiguration" value="2" /> | |||
</component> | |||
</project> |
@ -0,0 +1,67 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<project version="4"> | |||
<component name="AutoGeneratedRunConfigurationManager"> | |||
<projectFile>ame-upgrade-preparation-tool/ame-upgrade-preparation-tool.csproj</projectFile> | |||
</component> | |||
<component name="ChangeListManager"> | |||
<list default="true" id="6c2e4715-53e2-47ae-96d0-747ee55baae5" name="Changes" comment="" /> | |||
<option name="SHOW_DIALOG" value="false" /> | |||
<option name="HIGHLIGHT_CONFLICTS" value="true" /> | |||
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" /> | |||
<option name="LAST_RESOLUTION" value="IGNORE" /> | |||
</component> | |||
<component name="MarkdownSettingsMigration"> | |||
<option name="stateVersion" value="1" /> | |||
</component> | |||
<component name="ProjectId" id="2NfDy4X2JVU58v3kW9KOeDzH93f" /> | |||
<component name="ProjectViewState"> | |||
<option name="hideEmptyMiddlePackages" value="true" /> | |||
<option name="showLibraryContents" value="true" /> | |||
</component> | |||
<component name="PropertiesComponent"><![CDATA[{ | |||
"keyToString": { | |||
"RunOnceActivity.OpenProjectViewOnStart": "true", | |||
"WebServerToolWindowFactoryState": "false", | |||
"vue.rearranger.settings.migration": "true" | |||
} | |||
}]]></component> | |||
<component name="RunManager"> | |||
<configuration name="ame-upgrade-preparation-tool" type="DotNetProject" factoryName=".NET Project"> | |||
<option name="EXE_PATH" value="$PROJECT_DIR$/ame-upgrade-preparation-tool/bin/Debug/ame_upgrade_preparation_tool.exe" /> | |||
<option name="PROGRAM_PARAMETERS" value="" /> | |||
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/ame-upgrade-preparation-tool/bin/Debug" /> | |||
<option name="PASS_PARENT_ENVS" value="1" /> | |||
<option name="USE_EXTERNAL_CONSOLE" value="1" /> | |||
<option name="USE_MONO" value="0" /> | |||
<option name="RUNTIME_ARGUMENTS" value="" /> | |||
<option name="PROJECT_PATH" value="$PROJECT_DIR$/ame-upgrade-preparation-tool/ame-upgrade-preparation-tool.csproj" /> | |||
<option name="PROJECT_EXE_PATH_TRACKING" value="1" /> | |||
<option name="PROJECT_ARGUMENTS_TRACKING" value="1" /> | |||
<option name="PROJECT_WORKING_DIRECTORY_TRACKING" value="1" /> | |||
<option name="PROJECT_KIND" value="Console" /> | |||
<option name="PROJECT_TFM" value=".NETFramework,Version=v4.7.2" /> | |||
<method v="2"> | |||
<option name="Build" /> | |||
</method> | |||
</configuration> | |||
</component> | |||
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" /> | |||
<component name="TaskManager"> | |||
<task active="true" id="Default" summary="Default task"> | |||
<changelist id="6c2e4715-53e2-47ae-96d0-747ee55baae5" name="Changes" comment="" /> | |||
<created>1680046494161</created> | |||
<option name="number" value="Default" /> | |||
<option name="presentableId" value="Default" /> | |||
<updated>1680046494161</updated> | |||
<workItem from="1680046507858" duration="9257000" /> | |||
</task> | |||
<servers /> | |||
</component> | |||
<component name="TypeScriptGeneratedFilesManager"> | |||
<option name="version" value="3" /> | |||
</component> | |||
<component name="UnityUnitTestConfiguration" currentTestLauncher="NUnit" /> | |||
<component name="VcsManagerConfiguration"> | |||
<option name="CLEAR_INITIAL_COMMIT_MESSAGE" value="true" /> | |||
</component> | |||
</project> |
@ -0,0 +1,289 @@ | |||
using System; | |||
using System.Diagnostics; | |||
using System.Runtime.InteropServices; | |||
using System.Windows.Forms; | |||
using Microsoft.Win32; | |||
namespace Ameliorated.ConsoleUtils | |||
{ | |||
public static partial class ConsoleTUI | |||
{ | |||
private const int MF_BYCOMMAND = 0x00000000; | |||
private const int SC_CLOSE = 0xF060; | |||
private const int SC_MINIMIZE = 0xF020; | |||
private const int SC_MAXIMIZE = 0xF030; | |||
private const int SC_SIZE = 0xF000; //resize | |||
private const uint CHECK_QUICK_EDIT = 0x0040; | |||
private const int ENABLE_QUICK_EDIT = 0x40 | 0x80; | |||
// STD_INPUT_HANDLE (DWORD): -10 is the standard input device. | |||
private const int STD_INPUT_HANDLE = -10; | |||
private static string PreviousTitle; | |||
private static int PreviousBufferHeight = 26; | |||
private static int PreviousBufferWidth = 80; | |||
private static int PreviousSizeHeight = 26; | |||
private static int PreviousSizeWidth = 80; | |||
private static bool IsInitialized; | |||
private static int InitializedWidth = 80; | |||
public static void ShowErrorBox(string message, string caption) | |||
{ | |||
NativeWindow window = new NativeWindow(); | |||
window.AssignHandle(Process.GetCurrentProcess().MainWindowHandle); | |||
MessageBox.Show(window, message, caption, MessageBoxButtons.OK, MessageBoxIcon.Error); | |||
} | |||
public enum BackdropType | |||
{ | |||
None = 1, | |||
Mica = 2, | |||
Acrylic = 3, | |||
Tabbed = 4 | |||
} | |||
public static readonly int WinVer = Int32.Parse(Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion").GetValue("CurrentBuildNumber").ToString()); | |||
[DllImport("dwmapi.dll")] | |||
private static extern int DwmSetWindowAttribute(IntPtr hwnd, int attribute, ref int pvAttribute, int cbAttribute); | |||
public static void Initialize(string title, int width = 80, int height = 26, bool resize = false, bool quickedit = false) | |||
{ | |||
if (width < 2) throw new ArgumentException("Width must be greater than one."); | |||
IsInitialized = true; | |||
PreviousSizeHeight = Console.WindowHeight; | |||
PreviousSizeWidth = Console.WindowWidth; | |||
PreviousBufferHeight = Console.BufferHeight; | |||
PreviousBufferWidth = Console.BufferWidth; | |||
Console.SetWindowSize(width, height); | |||
Console.SetBufferSize(width, height); | |||
Console.SetWindowSize(width, height); | |||
InitializedWidth = width; | |||
Console.Clear(); | |||
Console.CursorVisible = false; | |||
PreviousTitle = Console.Title; | |||
Console.Title = title; | |||
try | |||
{ | |||
if ((Console.CursorLeft == 0 && Console.CursorTop == 0) || ParentProcess.ProcessName.Equals("Explorer", StringComparison.OrdinalIgnoreCase)) | |||
{ | |||
var bd = (int)BackdropType.Mica; | |||
var trueA = 0x01; | |||
if (WinVer >= 22523) | |||
{ | |||
var handle = Process.GetCurrentProcess().MainWindowHandle; | |||
DwmSetWindowAttribute(handle, 38, ref bd, Marshal.SizeOf<int>()); | |||
DwmSetWindowAttribute(handle, 20, ref trueA, Marshal.SizeOf<int>()); | |||
} | |||
} | |||
} catch (Exception e) { } | |||
if (!resize) | |||
try | |||
{ | |||
DisableResize(); | |||
} catch (Exception e) | |||
{ | |||
//ConsoleUtils.WriteError("Error disabling window resize - " + e.Message); | |||
} | |||
if (!quickedit) | |||
try | |||
{ | |||
DisableQuickEdit(); | |||
} catch (Exception e) | |||
{ | |||
//ConsoleUtils.WriteError("Error disabling quickedit - " + e.Message); | |||
} | |||
} | |||
public static void Close() | |||
{ | |||
if (!IsInitialized) throw new MethodAccessException("Console TUI must be initialized before calling other TUI functions."); | |||
IsInitialized = false; | |||
var parent = ParentProcess.ProcessName; | |||
if (parent.Equals("Explorer", StringComparison.CurrentCultureIgnoreCase)) return; | |||
try | |||
{ | |||
EnableResize(); | |||
} catch (Exception e) | |||
{ | |||
//ConsoleUtils.WriteError("Error enabling window resize - " + e.Message); | |||
} | |||
try | |||
{ | |||
EnableQuickEdit(); | |||
} catch (Exception e) | |||
{ | |||
//ConsoleUtils.WriteError("Error enabling quickedit - " + e.Message); | |||
} | |||
Console.CursorVisible = true; | |||
Console.Clear(); | |||
Console.Title = PreviousTitle; | |||
Console.SetWindowSize(PreviousSizeWidth, PreviousSizeHeight); | |||
Console.SetBufferSize(PreviousBufferWidth, PreviousBufferHeight); | |||
} | |||
[DllImport("user32.dll")] | |||
public static extern int DeleteMenu(IntPtr hMenu, int nPosition, int wFlags); | |||
[DllImport("user32.dll")] | |||
private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert); | |||
[DllImport("kernel32.dll", ExactSpelling = true)] | |||
private static extern IntPtr GetConsoleWindow(); | |||
private static void DisableResize() | |||
{ | |||
var handle = GetConsoleWindow(); | |||
var sysMenu = GetSystemMenu(handle, false); | |||
if (handle != IntPtr.Zero) | |||
{ | |||
//DeleteMenu(sysMenu, SC_CLOSE, MF_BYCOMMAND); | |||
//DeleteMenu(sysMenu, SC_MINIMIZE, MF_BYCOMMAND); | |||
DeleteMenu(sysMenu, SC_MAXIMIZE, MF_BYCOMMAND); | |||
DeleteMenu(sysMenu, SC_SIZE, MF_BYCOMMAND); //resize | |||
} | |||
} | |||
private static void EnableResize() | |||
{ | |||
var handle = GetConsoleWindow(); | |||
GetSystemMenu(handle, true); | |||
} | |||
[DllImport("kernel32.dll", SetLastError = true)] | |||
private static extern IntPtr GetStdHandle(int nStdHandle); | |||
[DllImport("kernel32.dll")] | |||
private static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode); | |||
[DllImport("kernel32.dll")] | |||
private static extern bool SetConsoleMode(IntPtr hConsoleHandle, uint dwMode); | |||
private static void DisableQuickEdit() | |||
{ | |||
var consoleHandle = GetStdHandle(STD_INPUT_HANDLE); | |||
// get current console mode | |||
uint consoleMode; | |||
GetConsoleMode(consoleHandle, out consoleMode); | |||
// set the new mode | |||
SetConsoleMode(consoleHandle, consoleMode &= ~CHECK_QUICK_EDIT); | |||
} | |||
private static void EnableQuickEdit() | |||
{ | |||
var consoleHandle = GetStdHandle(STD_INPUT_HANDLE); | |||
// get current console mode | |||
uint consoleMode; | |||
GetConsoleMode(consoleHandle, out consoleMode); | |||
// set the new mode | |||
SetConsoleMode(consoleHandle, consoleMode | ENABLE_QUICK_EDIT); | |||
} | |||
} | |||
public class ChoicePrompt : Prompt | |||
{ | |||
public string Choices { get; set; } = "YN"; | |||
public bool BeepSound { get; set; } = true; | |||
public bool CaseSensitive { get; set; } = false; | |||
public bool AllowEscape { get; set; } = true; | |||
public bool AnyKey { get; set; } = false; | |||
public ConsoleColor? TextForeground { get; set; } | |||
private bool _bindToOpenFrame; | |||
public new int? Start() | |||
{ | |||
if (Choices.Length < 1 && !AnyKey) throw new ArgumentException("There must be at least 1 choice."); | |||
Console.Write(Text); | |||
var cursorVisibility = Console.CursorVisible; | |||
int? result; | |||
while (true) | |||
{ | |||
Console.CursorVisible = true; | |||
var key = Console.ReadKey(true); | |||
if (AnyKey) | |||
{ | |||
Console.CursorVisible = cursorVisibility; | |||
return key.KeyChar; | |||
} | |||
if (key.Key == ConsoleKey.Escape && AllowEscape) | |||
{ | |||
Console.CursorVisible = cursorVisibility; | |||
return null; | |||
} | |||
if (CaseSensitive) | |||
result = Choices.IndexOf(key.KeyChar.ToString(), StringComparison.Ordinal); | |||
else | |||
result = Choices.IndexOf(key.KeyChar.ToString(), StringComparison.OrdinalIgnoreCase); | |||
if (result >= 0) | |||
{ | |||
if (!CaseSensitive) Console.Write(key.KeyChar.ToString().ToUpper()); | |||
else Console.Write(key.KeyChar.ToString()); | |||
break; | |||
} | |||
else if (BeepSound) Console.Beep(); | |||
} | |||
Console.CursorVisible = cursorVisibility; | |||
Console.WriteLine(); | |||
return result.Value; | |||
} | |||
} | |||
public abstract class Prompt | |||
{ | |||
/// <summary> | |||
/// Text to be displayed before the input. | |||
/// </summary> | |||
public string Text { get; set; } = ""; | |||
public int? MaxLength { get; set; } | |||
/// <summary> | |||
/// (Optional) | |||
/// </summary> | |||
public ConsoleColor? InputForeground { get; set; } = null; | |||
public ConsoleColor? InputBackground { get; set; } = null; | |||
public bool BindToOpenFrame { get; set; } = true; | |||
public bool AllowEscape { get; set; } = true; | |||
} | |||
} |
@ -0,0 +1,510 @@ | |||
using System; | |||
using System.Diagnostics; | |||
using System.IO; | |||
using System.Runtime.ConstrainedExecution; | |||
using System.Runtime.InteropServices; | |||
using System.Security; | |||
using System.Security.Principal; | |||
using System.Threading; | |||
using Microsoft.Win32.SafeHandles; | |||
namespace amecs | |||
{ | |||
[StructLayout(LayoutKind.Sequential)] | |||
public class NSudo | |||
{ | |||
private struct SECURITY_ATTRIBUTES | |||
{ | |||
public int nLength; | |||
public unsafe byte* lpSecurityDescriptor; | |||
public int bInheritHandle; | |||
} | |||
private enum SECURITY_IMPERSONATION_LEVEL | |||
{ | |||
SecurityAnonymous, | |||
SecurityIdentification, | |||
SecurityImpersonation, | |||
SecurityDelegation | |||
} | |||
private enum TOKEN_TYPE { | |||
TokenPrimary = 1, | |||
TokenImpersonation | |||
} | |||
[StructLayout(LayoutKind.Sequential)] | |||
private struct LUID { | |||
public uint LowPart; | |||
public uint HighPart; | |||
} | |||
[StructLayout(LayoutKind.Sequential, Pack = 4)] | |||
private struct LUID_AND_ATTRIBUTES { | |||
public LUID Luid; | |||
public UInt32 Attributes; | |||
} | |||
private struct TOKEN_PRIVILEGES { | |||
public int PrivilegeCount; | |||
[MarshalAs(UnmanagedType.ByValArray, SizeConst=1)] | |||
public LUID_AND_ATTRIBUTES[] Privileges; | |||
} | |||
private static UInt32 MAXIMUM_ALLOWED = (UInt32)TokenAccessLevels.MaximumAllowed; | |||
[DllImport("advapi32.dll", SetLastError=true)] | |||
[return: MarshalAs(UnmanagedType.Bool)] | |||
private static extern bool OpenProcessToken(IntPtr ProcessHandle, | |||
UInt32 DesiredAccess, out IntPtr TokenHandle); | |||
[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)] | |||
private static extern bool DuplicateTokenEx( | |||
IntPtr hExistingToken, | |||
uint dwDesiredAccess, | |||
IntPtr lpTokenAttributes, | |||
SECURITY_IMPERSONATION_LEVEL ImpersonationLevel, | |||
TOKEN_TYPE TokenType, | |||
out IntPtr phNewToken ); | |||
[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)] | |||
private static extern bool DuplicateTokenEx( | |||
IntPtr hExistingToken, | |||
uint dwDesiredAccess, | |||
ref SECURITY_ATTRIBUTES lpTokenAttributes, | |||
SECURITY_IMPERSONATION_LEVEL ImpersonationLevel, | |||
TOKEN_TYPE TokenType, | |||
out IntPtr phNewToken ); | |||
[DllImport("advapi32.dll")] | |||
static extern bool LookupPrivilegeValue(IntPtr lpSystemName, string lpName, | |||
ref LUID lpLuid); | |||
internal const int SE_PRIVILEGE_ENABLED = 0x00000002; | |||
// Use this signature if you do not want the previous state | |||
[DllImport("advapi32.dll", SetLastError=true)] | |||
[return: MarshalAs(UnmanagedType.Bool)] | |||
static extern bool AdjustTokenPrivileges(IntPtr TokenHandle, | |||
[MarshalAs(UnmanagedType.Bool)]bool DisableAllPrivileges, | |||
ref TOKEN_PRIVILEGES NewState, | |||
UInt32 Zero, | |||
IntPtr Null1, | |||
IntPtr Null2); | |||
[System.Runtime.InteropServices.DllImport("advapi32.dll", SetLastError = true)] | |||
private static extern bool SetThreadToken(IntPtr pHandle, | |||
IntPtr hToken); | |||
[DllImport("wtsapi32.dll", SetLastError=true)] | |||
static extern bool WTSQueryUserToken(UInt32 sessionId, out IntPtr Token); | |||
[DllImport("advapi32.dll", SetLastError = true)] | |||
static extern Boolean SetTokenInformation(IntPtr TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, | |||
ref UInt32 TokenInformation, UInt32 TokenInformationLength); | |||
[DllImport("userenv.dll", SetLastError=true)] | |||
static extern bool CreateEnvironmentBlock(out IntPtr lpEnvironment, IntPtr hToken, bool bInherit ); | |||
public static bool GetUserPrivilege(IntPtr Token) | |||
{ | |||
IntPtr NewToken; | |||
DuplicateTokenEx(Token, MAXIMUM_ALLOWED, IntPtr.Zero, SECURITY_IMPERSONATION_LEVEL.SecurityImpersonation, TOKEN_TYPE.TokenImpersonation, out NewToken); | |||
SetThreadToken(IntPtr.Zero, NewToken); | |||
return true; | |||
} | |||
[DllImport("advapi32.dll", SetLastError=true, CharSet=CharSet.Unicode)] | |||
static extern bool CreateProcessAsUser( | |||
IntPtr hToken, | |||
string lpApplicationName, | |||
string lpCommandLine, | |||
ref SECURITY_ATTRIBUTES lpProcessAttributes, | |||
ref SECURITY_ATTRIBUTES lpThreadAttributes, | |||
bool bInheritHandles, | |||
uint dwCreationFlags, | |||
IntPtr lpEnvironment, | |||
string lpCurrentDirectory, | |||
ref STARTUPINFO lpStartupInfo, | |||
out PROCESS_INFORMATION lpProcessInformation); | |||
[Flags] | |||
enum CreationFlags | |||
{ | |||
CREATE_SUSPENDED = 0x00000004, | |||
CREATE_UNICODE_ENVIRONMENT = 0x00000400, | |||
CREATE_NO_WINDOW = 0x08000000, | |||
CREATE_NEW_CONSOLE = 0x00000010 | |||
} | |||
[DllImport("advapi32.dll", SetLastError = true, BestFitMapping = false, ThrowOnUnmappableChar = true)] | |||
[return: MarshalAs(UnmanagedType.Bool)] | |||
internal static extern bool LogonUser( | |||
[MarshalAs(UnmanagedType.LPStr)] string pszUserName, | |||
[MarshalAs(UnmanagedType.LPStr)] string pszDomain, | |||
[MarshalAs(UnmanagedType.LPStr)] string pszPassword, | |||
int dwLogonType, | |||
int dwLogonProvider, | |||
ref IntPtr phToken); | |||
public static int? RunProcessAsUser(IntPtr Token, string Executable, string Arguments, uint timeout = 0xFFFFFFFF) | |||
{ | |||
GetAssignPrivilege(); | |||
GetQuotaPrivilege(); | |||
var startupInfo = new STARTUPINFO(); | |||
startupInfo.cb = Marshal.SizeOf(startupInfo); | |||
startupInfo.dwFlags = 0x00000001; | |||
startupInfo.wShowWindow = 1; | |||
var procAttrs = new SECURITY_ATTRIBUTES(); | |||
var threadAttrs = new SECURITY_ATTRIBUTES(); | |||
procAttrs.nLength = Marshal.SizeOf(procAttrs); | |||
threadAttrs.nLength = Marshal.SizeOf(threadAttrs); | |||
// Log on user temporarily in order to start console process in its security context. | |||
var hUserTokenDuplicate = IntPtr.Zero; | |||
var pEnvironmentBlock = IntPtr.Zero; | |||
DuplicateTokenEx(Token, MAXIMUM_ALLOWED, IntPtr.Zero, SECURITY_IMPERSONATION_LEVEL.SecurityIdentification, TOKEN_TYPE.TokenPrimary, out hUserTokenDuplicate); | |||
CreateEnvironmentBlock(out pEnvironmentBlock, Token, false); | |||
PROCESS_INFORMATION _processInfo; | |||
if (!CreateProcessAsUser(hUserTokenDuplicate, null, String.IsNullOrEmpty(Arguments) ? $"\"{Executable}\"" : $"\"{Executable}\" {Arguments}", | |||
ref procAttrs, ref threadAttrs, false, (uint)CreationFlags.CREATE_NO_WINDOW | | |||
(uint)CreationFlags.CREATE_UNICODE_ENVIRONMENT, | |||
pEnvironmentBlock, null, ref startupInfo, out _processInfo)) return null; | |||
return 0; | |||
/* | |||
uint dwCreationFlags = (uint)CreationFlags.CREATE_UNICODE_ENVIRONMENT; | |||
startupInfo.cb = Marshal.SizeOf(startupInfo); | |||
SECURITY_ATTRIBUTES throwaway = new SECURITY_ATTRIBUTES(); | |||
SECURITY_ATTRIBUTES throwaway2 = new SECURITY_ATTRIBUTES(); | |||
Console.WriteLine(Marshal.GetLastWin32Error() + "-3"); | |||
Console.WriteLine(CreateProcessAsUser(hUserToken, String.Empty, "\"C:\\Windows\\notepad.exe\"", ref throwaway, ref throwaway2, false, 0, IntPtr.Zero, String.Empty, ref StartupInfo, out ProcessInfo)); | |||
Console.WriteLine(Marshal.GetLastWin32Error() + "-4"); | |||
return Process.GetProcessById(ProcessInfo.dwProcessId); | |||
*/ | |||
} | |||
[DllImport("kernel32.dll", SetLastError = true)] | |||
[return: MarshalAs(UnmanagedType.Bool)] | |||
static extern bool GetExitCodeProcess(IntPtr hProcess, out uint lpExitCode); | |||
[DllImport("kernel32.dll", SetLastError=true)] | |||
static extern UInt32 WaitForSingleObject(IntPtr hHandle, UInt32 dwMilliseconds); | |||
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] | |||
struct STARTUPINFO | |||
{ | |||
public Int32 cb; | |||
public IntPtr lpReserved; | |||
public IntPtr lpDesktop; | |||
public IntPtr lpTitle; | |||
public Int32 dwX; | |||
public Int32 dwY; | |||
public Int32 dwXSize; | |||
public Int32 dwYSize; | |||
public Int32 dwXCountChars; | |||
public Int32 dwYCountChars; | |||
public Int32 dwFillAttribute; | |||
public Int32 dwFlags; | |||
public Int16 wShowWindow; | |||
public Int16 cbReserved2; | |||
public IntPtr lpReserved2; | |||
public IntPtr hStdInput; | |||
public IntPtr hStdOutput; | |||
public IntPtr hStdError; | |||
} | |||
[StructLayout(LayoutKind.Sequential)] | |||
internal struct PROCESS_INFORMATION | |||
{ | |||
public IntPtr hProcess; | |||
public IntPtr hThread; | |||
public int dwProcessId; | |||
public int dwThreadId; | |||
} | |||
public static IntPtr GetUserToken() | |||
{ | |||
IntPtr Token; | |||
WTSQueryUserToken((uint)SessionID, out Token); | |||
return Token; | |||
} | |||
private static int SessionID = -1; | |||
public static bool GetSystemPrivilege() | |||
{ | |||
IntPtr CurrentProcessToken; | |||
OpenProcessToken(Process.GetCurrentProcess().Handle, MAXIMUM_ALLOWED, out CurrentProcessToken); | |||
IntPtr DuplicatedCurrentProcessToken; | |||
DuplicateTokenEx(CurrentProcessToken, MAXIMUM_ALLOWED, IntPtr.Zero, SECURITY_IMPERSONATION_LEVEL.SecurityImpersonation, TOKEN_TYPE.TokenImpersonation, out DuplicatedCurrentProcessToken); | |||
LUID_AND_ATTRIBUTES RawPrivilege = new LUID_AND_ATTRIBUTES(); | |||
LookupPrivilegeValue(IntPtr.Zero, "SeDebugPrivilege", ref RawPrivilege.Luid); | |||
RawPrivilege.Attributes = SE_PRIVILEGE_ENABLED; | |||
TOKEN_PRIVILEGES TokenPrivilege = new TOKEN_PRIVILEGES(); | |||
TokenPrivilege.Privileges = new LUID_AND_ATTRIBUTES[] { RawPrivilege }; | |||
TokenPrivilege.PrivilegeCount = 1; | |||
AdjustTokenPrivileges(DuplicatedCurrentProcessToken, false, ref TokenPrivilege, 0, IntPtr.Zero, IntPtr.Zero); | |||
SetThreadToken(IntPtr.Zero, DuplicatedCurrentProcessToken); | |||
SessionID = GetActiveSession(); | |||
IntPtr OriginalProcessToken = new IntPtr(-1); | |||
CreateSystemToken((int)MAXIMUM_ALLOWED, SessionID, ref OriginalProcessToken); | |||
IntPtr SystemToken; | |||
DuplicateTokenEx(OriginalProcessToken, MAXIMUM_ALLOWED, IntPtr.Zero, SECURITY_IMPERSONATION_LEVEL.SecurityImpersonation, TOKEN_TYPE.TokenImpersonation, out SystemToken); | |||
SetThreadToken(IntPtr.Zero, SystemToken); | |||
return true; | |||
} | |||
[DllImport("advapi32.dll", SetLastError=true)] | |||
static extern bool GetTokenInformation( | |||
IntPtr TokenHandle, | |||
TOKEN_INFORMATION_CLASS TokenInformationClass, | |||
IntPtr TokenInformation, | |||
int TokenInformationLength, | |||
out int ReturnLength); | |||
enum TOKEN_INFORMATION_CLASS | |||
{ | |||
TokenUser = 1, | |||
TokenGroups, | |||
TokenPrivileges, | |||
TokenOwner, | |||
TokenPrimaryGroup, | |||
TokenDefaultDacl, | |||
TokenSource, | |||
TokenType, | |||
TokenImpersonationLevel, | |||
TokenStatistics, | |||
TokenRestrictedSids, | |||
TokenSessionId, | |||
TokenGroupsAndPrivileges, | |||
TokenSessionReference, | |||
TokenSandBoxInert, | |||
TokenAuditPolicy, | |||
TokenOrigin | |||
} | |||
private static int GetActiveSession() | |||
{ | |||
IntPtr pSessionInfo = IntPtr.Zero; | |||
Int32 Count = 0; | |||
var retval = WTSEnumerateSessions((IntPtr)null, 0, 1, ref pSessionInfo, ref Count); | |||
Int32 dataSize = Marshal.SizeOf(typeof(WTS_SESSION_INFO)); | |||
Int64 current = (Int64)pSessionInfo; | |||
int result = -1; | |||
if (retval != 0) | |||
{ | |||
for (int i = 0; i < Count; i++) | |||
{ | |||
WTS_SESSION_INFO si = (WTS_SESSION_INFO)Marshal.PtrToStructure((System.IntPtr)current, typeof(WTS_SESSION_INFO)); | |||
current += dataSize; | |||
if (si.State == WTS_CONNECTSTATE_CLASS.WTSActive) | |||
{ | |||
result = si.SessionID; | |||
break; | |||
} | |||
} | |||
WTSFreeMemory(pSessionInfo); | |||
} | |||
return result; | |||
} | |||
private static void CreateSystemToken(int DesiredAccess, int dwSessionID, ref IntPtr TokenHandle) | |||
{ | |||
int dwLsassPID = -1; | |||
int dwWinLogonPID = -1; | |||
WTS_PROCESS_INFO[] pProcesses; | |||
IntPtr pProcessInfo = IntPtr.Zero; | |||
int dwProcessCount = 0; | |||
if (WTSEnumerateProcesses((IntPtr)null, 0, 1, ref pProcessInfo, ref dwProcessCount)) | |||
{ | |||
IntPtr pMemory = pProcessInfo; | |||
pProcesses = new WTS_PROCESS_INFO[dwProcessCount]; | |||
for (int i = 0; i < dwProcessCount; i++) | |||
{ | |||
pProcesses[i] = (WTS_PROCESS_INFO)Marshal.PtrToStructure(pProcessInfo, typeof(WTS_PROCESS_INFO)); | |||
pProcessInfo = (IntPtr)((long)pProcessInfo + Marshal.SizeOf(pProcesses[i])); | |||
var processName = Marshal.PtrToStringAnsi(pProcesses[i].ProcessName); | |||
ConvertSidToStringSid(pProcesses[i].UserSid, out string sid); | |||
string strSid; | |||
if (processName == null || pProcesses[i].UserSid == default || sid != "S-1-5-18") | |||
continue; | |||
if ((-1 == dwLsassPID) && (0 == pProcesses[i].SessionID) && (processName == "lsass.exe")) | |||
{ | |||
dwLsassPID = pProcesses[i].ProcessID; | |||
continue; | |||
} | |||
if ((-1 == dwWinLogonPID) && (dwSessionID == pProcesses[i].SessionID) && (processName == "winlogon.exe")) | |||
{ | |||
dwWinLogonPID = pProcesses[i].ProcessID; | |||
continue; | |||
} | |||
} | |||
WTSFreeMemory(pMemory); | |||
} | |||
bool Result = false; | |||
IntPtr SystemProcessHandle = IntPtr.Zero; | |||
try | |||
{ | |||
SystemProcessHandle = Process.GetProcessById(dwLsassPID).Handle; | |||
} catch | |||
{ | |||
SystemProcessHandle = Process.GetProcessById(dwWinLogonPID).Handle; | |||
} | |||
IntPtr SystemTokenHandle = IntPtr.Zero; | |||
if (OpenProcessToken(SystemProcessHandle, TOKEN_DUPLICATE, out SystemTokenHandle)) | |||
{ | |||
Result = DuplicateTokenEx(SystemTokenHandle, (uint)DesiredAccess, IntPtr.Zero, SECURITY_IMPERSONATION_LEVEL.SecurityIdentification, TOKEN_TYPE.TokenPrimary, out TokenHandle); | |||
CloseHandle(SystemTokenHandle); | |||
} | |||
CloseHandle(SystemProcessHandle); | |||
// return Result; | |||
return; | |||
} | |||
[DllImport("kernel32.dll", SetLastError = true)] | |||
public static extern IntPtr OpenProcess( | |||
uint processAccess, | |||
bool bInheritHandle, | |||
uint processId | |||
); | |||
public const UInt32 TOKEN_DUPLICATE = 0x0002; | |||
[DllImport("advapi32", CharSet = CharSet.Auto, SetLastError = true)] | |||
static extern bool ConvertSidToStringSid(IntPtr pSid, out string strSid); | |||
[DllImport("kernel32.dll", SetLastError=true)] | |||
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] | |||
[SuppressUnmanagedCodeSecurity] | |||
[return: MarshalAs(UnmanagedType.Bool)] | |||
static extern bool CloseHandle(IntPtr hObject); | |||
[DllImport("wtsapi32.dll", SetLastError=true)] | |||
static extern int WTSEnumerateSessions( | |||
System.IntPtr hServer, | |||
int Reserved, | |||
int Version, | |||
ref System.IntPtr ppSessionInfo, | |||
ref int pCount); | |||
[StructLayout(LayoutKind.Sequential)] | |||
private struct WTS_SESSION_INFO | |||
{ | |||
public Int32 SessionID; | |||
[MarshalAs(UnmanagedType.LPStr)] | |||
public String pWinStationName; | |||
public WTS_CONNECTSTATE_CLASS State; | |||
} | |||
public enum WTS_CONNECTSTATE_CLASS | |||
{ | |||
WTSActive, | |||
WTSConnected, | |||
WTSConnectQuery, | |||
WTSShadow, | |||
WTSDisconnected, | |||
WTSIdle, | |||
WTSListen, | |||
WTSReset, | |||
WTSDown, | |||
WTSInit | |||
} | |||
[DllImport("wtsapi32.dll")] | |||
static extern void WTSFreeMemory(IntPtr pMemory); | |||
[DllImport("wtsapi32.dll", SetLastError=true)] | |||
static extern bool WTSEnumerateProcesses( | |||
IntPtr serverHandle, // Handle to a terminal server. | |||
Int32 reserved, // must be 0 | |||
Int32 version, // must be 1 | |||
ref IntPtr ppProcessInfo, // pointer to array of WTS_PROCESS_INFO | |||
ref Int32 pCount // pointer to number of processes | |||
); | |||
struct WTS_PROCESS_INFO | |||
{ | |||
public int SessionID; | |||
public int ProcessID; | |||
//This is a pointer to string... | |||
public IntPtr ProcessName; | |||
public IntPtr UserSid; | |||
} | |||
[DllImport("ntdll.dll", SetLastError = true)] | |||
static extern IntPtr RtlAdjustPrivilege(int Privilege, bool bEnablePrivilege, bool IsThreadPrivilege, out bool PreviousValue); | |||
[DllImport("advapi32.dll")] | |||
static extern bool LookupPrivilegeValue(IntPtr lpSystemName, string lpName, ref UInt64 lpLuid); | |||
public static void GetOwnershipPrivilege() | |||
{ | |||
ulong luid = 0; | |||
bool throwaway; | |||
LookupPrivilegeValue(IntPtr.Zero, "SeTakeOwnershipPrivilege", ref luid); | |||
RtlAdjustPrivilege((int)luid, true, true, out throwaway); | |||
} | |||
public static void GetAssignPrivilege() | |||
{ | |||
ulong luid = 0; | |||
bool throwaway; | |||
LookupPrivilegeValue(IntPtr.Zero, "SeAssignPrimaryTokenPrivilege", ref luid); | |||
RtlAdjustPrivilege((int)luid, true, true, out throwaway); | |||
} | |||
public static void GetQuotaPrivilege() | |||
{ | |||
ulong luid = 0; | |||
bool throwaway; | |||
LookupPrivilegeValue(IntPtr.Zero, "SeIncreaseQuotaPrivilege", ref luid); | |||
RtlAdjustPrivilege((int)luid, true, true, out throwaway); | |||
} | |||
public static void GetShutdownPrivilege() | |||
{ | |||
ulong luid = 0; | |||
bool throwaway; | |||
LookupPrivilegeValue(IntPtr.Zero, "SeShutdownPrivilege", ref luid); | |||
RtlAdjustPrivilege((int)luid, true, true, out throwaway); | |||
} | |||
public class Win32 { | |||
} | |||
} | |||
} |
@ -0,0 +1,74 @@ | |||
using System; | |||
using System.Diagnostics; | |||
using System.Runtime.InteropServices; | |||
namespace Ameliorated.ConsoleUtils | |||
{ | |||
public static class ParentProcess | |||
{ | |||
private static readonly uint TH32CS_SNAPPROCESS = 2; | |||
public static string ProcessName = Get().ProcessName; | |||
public static Process Get() | |||
{ | |||
try | |||
{ | |||
var iParentPid = 0; | |||
var iCurrentPid = Process.GetCurrentProcess().Id; | |||
var oHnd = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); | |||
if (oHnd == IntPtr.Zero) | |||
return null; | |||
var oProcInfo = new PROCESSENTRY32(); | |||
oProcInfo.dwSize = | |||
(uint)Marshal.SizeOf(typeof(PROCESSENTRY32)); | |||
if (Process32First(oHnd, ref oProcInfo) == false) | |||
return null; | |||
do | |||
{ | |||
if (iCurrentPid == oProcInfo.th32ProcessID) | |||
iParentPid = (int)oProcInfo.th32ParentProcessID; | |||
} while (iParentPid == 0 && Process32Next(oHnd, ref oProcInfo)); | |||
if (iParentPid > 0) | |||
return Process.GetProcessById(iParentPid); | |||
return null; | |||
} catch (Exception e) | |||
{ | |||
return null; | |||
} | |||
} | |||
[DllImport("kernel32.dll", SetLastError = true)] | |||
private static extern IntPtr CreateToolhelp32Snapshot(uint dwFlags, uint th32ProcessID); | |||
[DllImport("kernel32.dll")] | |||
private static extern bool Process32First(IntPtr hSnapshot, ref PROCESSENTRY32 lppe); | |||
[DllImport("kernel32.dll")] | |||
private static extern bool Process32Next(IntPtr hSnapshot, ref PROCESSENTRY32 lppe); | |||
[StructLayout(LayoutKind.Sequential)] | |||
public struct PROCESSENTRY32 | |||
{ | |||
public uint dwSize; | |||
public uint cntUsage; | |||
public uint th32ProcessID; | |||
public IntPtr th32DefaultHeapID; | |||
public uint th32ModuleID; | |||
public uint cntThreads; | |||
public uint th32ParentProcessID; | |||
public int pcPriClassBase; | |||
public uint dwFlags; | |||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] | |||
public string szExeFile; | |||
} | |||
} | |||
} |
@ -0,0 +1,264 @@ | |||
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); | |||
} | |||
} | |||
} |
@ -0,0 +1,35 @@ | |||
using System.Reflection; | |||
using System.Runtime.InteropServices; | |||
// General Information about an assembly is controlled through the following | |||
// set of attributes. Change these attribute values to modify the information | |||
// associated with an assembly. | |||
[assembly: AssemblyTitle("ame_upgrade_preparation_tool")] | |||
[assembly: AssemblyDescription("")] | |||
[assembly: AssemblyConfiguration("")] | |||
[assembly: AssemblyCompany("")] | |||
[assembly: AssemblyProduct("ame_upgrade_preparation_tool")] | |||
[assembly: AssemblyCopyright("Copyright © 2023")] | |||
[assembly: AssemblyTrademark("")] | |||
[assembly: AssemblyCulture("")] | |||
// Setting ComVisible to false makes the types in this assembly not visible | |||
// to COM components. If you need to access a type in this assembly from | |||
// COM, set the ComVisible attribute to true on that type. | |||
[assembly: ComVisible(false)] | |||
// The following GUID is for the ID of the typelib if this project is exposed to COM | |||
[assembly: Guid("DD855BAB-FA5B-458D-8F42-F2F5E7866D0E")] | |||
// Version information for an assembly consists of the following four values: | |||
// | |||
// Major Version | |||
// Minor Version | |||
// Build Number | |||
// Revision | |||
// | |||
// You can specify all the values or you can default the Build and Revision Numbers | |||
// by using the '*' as shown below: | |||
// [assembly: AssemblyVersion("1.0.*")] | |||
[assembly: AssemblyVersion("1.0.0.0")] | |||
[assembly: AssemblyFileVersion("1.0.0.0")] |
@ -0,0 +1,375 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Runtime.InteropServices; | |||
using System.Text.RegularExpressions; | |||
using System.Threading.Tasks; | |||
using Microsoft.Win32; | |||
namespace amecs | |||
{ | |||
public enum RegistryOperation | |||
{ | |||
Delete = 0, | |||
Add = 1 | |||
} | |||
public class Reg | |||
{ | |||
public class Key | |||
{ | |||
public string KeyName { get; set; } | |||
//public Scope Scope { get; set; } = Scope.AllUsers; | |||
public RegistryOperation Operation { get; set; } = RegistryOperation.Delete; | |||
private List<RegistryKey> GetRoots() | |||
{ | |||
var hive = KeyName.Split('\\').GetValue(0).ToString().ToUpper(); | |||
var list = new List<RegistryKey>(); | |||
list.Add(hive switch | |||
{ | |||
"HKCU" => RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Default), | |||
"HKEY_CURRENT_USER" => RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Default), | |||
"HKLM" => RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Default), | |||
"HKEY_LOCAL_MACHINE" => RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Default), | |||
"HKCR" => RegistryKey.OpenBaseKey(RegistryHive.ClassesRoot, RegistryView.Default), | |||
"HKEY_CLASSES_ROOT" => RegistryKey.OpenBaseKey(RegistryHive.ClassesRoot, RegistryView.Default), | |||
"HKU" => RegistryKey.OpenBaseKey(RegistryHive.Users, RegistryView.Default), | |||
"HKEY_USERS" => RegistryKey.OpenBaseKey(RegistryHive.Users, RegistryView.Default), | |||
_ => throw new ArgumentException($"Key '{KeyName}' does not specify a valid registry hive.") | |||
}); | |||
return list; | |||
} | |||
public string GetSubKey() => KeyName.Substring(KeyName.IndexOf('\\') + 1); | |||
public bool IsEqual() | |||
{ | |||
try | |||
{ | |||
var roots = GetRoots(); | |||
foreach (var _root in roots) | |||
{ | |||
var root = _root; | |||
var subKey = GetSubKey(); | |||
var openedSubKey = root.OpenSubKey(subKey); | |||
if (Operation == RegistryOperation.Delete && openedSubKey != null) | |||
{ | |||
return false; | |||
} | |||
if (Operation == RegistryOperation.Add && openedSubKey == null) | |||
{ | |||
return false; | |||
} | |||
} | |||
} catch (Exception e) | |||
{ | |||
return false; | |||
} | |||
return true; | |||
} | |||
public bool Apply() | |||
{ | |||
var roots = GetRoots(); | |||
foreach (var _root in roots) | |||
{ | |||
var root = _root; | |||
var subKey = GetSubKey(); | |||
var openedSubKey = root.OpenSubKey(subKey); | |||
if (openedSubKey != null) openedSubKey.Close(); | |||
if (Operation == RegistryOperation.Add && openedSubKey == null) | |||
{ | |||
root.CreateSubKey(subKey)?.Close(); | |||
} | |||
if (Operation == RegistryOperation.Delete) | |||
{ | |||
root.DeleteSubKeyTree(subKey, false); | |||
} | |||
root.Close(); | |||
} | |||
return true; | |||
} | |||
} | |||
public enum RegistryValueOperation | |||
{ | |||
Delete = 0, | |||
Add = 1, | |||
// This indicates to skip the action if the specified value does not already exist | |||
Set = 2 | |||
} | |||
public enum RegistryValueType | |||
{ | |||
REG_SZ = RegistryValueKind.String, | |||
REG_MULTI_SZ = RegistryValueKind.MultiString, | |||
REG_EXPAND_SZ = RegistryValueKind.ExpandString, | |||
REG_DWORD = RegistryValueKind.DWord, | |||
REG_QWORD = RegistryValueKind.QWord, | |||
REG_BINARY = RegistryValueKind.Binary, | |||
REG_NONE = RegistryValueKind.None, | |||
REG_UNKNOWN = RegistryValueKind.Unknown | |||
} | |||
public class Value | |||
{ | |||
public string KeyName { get; set; } | |||
public string ValueName { get; set; } = ""; | |||
public object? Data { get; set; } | |||
public RegistryValueType Type { get; set; } | |||
//public Scope Scope { get; set; } = Scope.AllUsers; | |||
public RegistryValueOperation Operation { get; set; } = RegistryValueOperation.Add; | |||
private List<RegistryKey> GetRoots() | |||
{ | |||
var hive = KeyName.Split('\\').GetValue(0).ToString().ToUpper(); | |||
var list = new List<RegistryKey>(); | |||
list.Add(hive switch | |||
{ | |||
"HKCU" => RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Default), | |||
"HKEY_CURRENT_USER" => RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Default), | |||
"HKLM" => RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Default), | |||
"HKEY_LOCAL_MACHINE" => RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Default), | |||
"HKCR" => RegistryKey.OpenBaseKey(RegistryHive.ClassesRoot, RegistryView.Default), | |||
"HKEY_CLASSES_ROOT" => RegistryKey.OpenBaseKey(RegistryHive.ClassesRoot, RegistryView.Default), | |||
"HKU" => RegistryKey.OpenBaseKey(RegistryHive.Users, RegistryView.Default), | |||
"HKEY_USERS" => RegistryKey.OpenBaseKey(RegistryHive.Users, RegistryView.Default), | |||
_ => throw new ArgumentException($"Key '{KeyName}' does not specify a valid registry hive.") | |||
}); | |||
return list; | |||
} | |||
public string GetSubKey() => KeyName.Substring(KeyName.IndexOf('\\') + 1); | |||
public object? GetCurrentValue(RegistryKey root) | |||
{ | |||
var subkey = GetSubKey(); | |||
return Registry.GetValue(root.Name + "\\" + subkey, ValueName, null); | |||
} | |||
public static byte[] StringToByteArray(string hex) | |||
{ | |||
return Enumerable.Range(0, hex.Length) | |||
.Where(x => x % 2 == 0) | |||
.Select(x => Convert.ToByte(hex.Substring(x, 2), 16)) | |||
.ToArray(); | |||
} | |||
public bool IsEqual() | |||
{ | |||
try | |||
{ | |||
var roots = GetRoots(); | |||
foreach (var _root in roots) | |||
{ | |||
var root = _root; | |||
var subKey = GetSubKey(); | |||
var openedSubKey = root.OpenSubKey(subKey); | |||
if (openedSubKey == null && (Operation == RegistryValueOperation.Set || Operation == RegistryValueOperation.Delete)) | |||
continue; | |||
if (openedSubKey == null) return false; | |||
var value = openedSubKey.GetValue(ValueName); | |||
if (value == null) | |||
{ | |||
if (Operation == RegistryValueOperation.Set || Operation == RegistryValueOperation.Delete) | |||
continue; | |||
return false; | |||
} | |||
if (Operation == RegistryValueOperation.Delete) return false; | |||
if (Data == null) return false; | |||
bool matches; | |||
try | |||
{ | |||
matches = Type switch | |||
{ | |||
RegistryValueType.REG_SZ => | |||
Data.ToString() == value.ToString(), | |||
RegistryValueType.REG_EXPAND_SZ => | |||
// RegistryValueOptions.DoNotExpandEnvironmentNames above did not seem to work. | |||
Environment.ExpandEnvironmentVariables(Data.ToString()) == value.ToString(), | |||
RegistryValueType.REG_MULTI_SZ => | |||
Data.ToString() == "" ? ((string[])value).SequenceEqual(new string[] { }) : ((string[])value).SequenceEqual(Data.ToString().Split(new string[] { "\\0" }, StringSplitOptions.None)), | |||
RegistryValueType.REG_DWORD => | |||
unchecked((int)Convert.ToUInt32(Data)) == (int)value, | |||
RegistryValueType.REG_QWORD => | |||
Convert.ToUInt64(Data) == (ulong)value, | |||
RegistryValueType.REG_BINARY => | |||
((byte[])value).SequenceEqual(StringToByteArray(Data.ToString())), | |||
RegistryValueType.REG_NONE => | |||
((byte[])value).SequenceEqual(new byte[0]), | |||
RegistryValueType.REG_UNKNOWN => | |||
Data.ToString() == value.ToString(), | |||
_ => throw new ArgumentException("Impossible.") | |||
}; | |||
} catch (InvalidCastException) | |||
{ | |||
matches = false; | |||
} | |||
if (!matches) return false; | |||
} | |||
} catch (Exception e) | |||
{ | |||
return false; | |||
} | |||
return true; | |||
} | |||
public bool Apply() | |||
{ | |||
var roots = GetRoots(); | |||
foreach (var _root in roots) | |||
{ | |||
var root = _root; | |||
var subKey = GetSubKey(); | |||
if (GetCurrentValue(root) == Data) continue; | |||
var opened = root.OpenSubKey(subKey); | |||
if (opened == null && Operation == RegistryValueOperation.Set) continue; | |||
if (opened == null && Operation == RegistryValueOperation.Add) root.CreateSubKey(subKey)?.Close(); | |||
if (opened != null) opened.Close(); | |||
if (Operation == RegistryValueOperation.Delete) | |||
{ | |||
var key = root.OpenSubKey(subKey, true); | |||
key?.DeleteValue(ValueName); | |||
key?.Close(); | |||
root.Close(); | |||
continue; | |||
} | |||
if (Type == RegistryValueType.REG_BINARY) | |||
{ | |||
var data = StringToByteArray(Data.ToString()); | |||
Registry.SetValue(root.Name + "\\" + subKey, ValueName, data, (RegistryValueKind)Type); | |||
} | |||
else if (Type == RegistryValueType.REG_DWORD) | |||
{ | |||
// DWORD values using the highest bit set fail without this, for example '2962489444'. | |||
// See https://stackoverflow.com/questions/6608400/how-to-put-a-dword-in-the-registry-with-the-highest-bit-set; | |||
var value = unchecked((int)Convert.ToUInt32(Data)); | |||
Registry.SetValue(root.Name + "\\" + subKey, ValueName, value, (RegistryValueKind)Type); | |||
} | |||
else if (Type == RegistryValueType.REG_QWORD) | |||
{ | |||
Registry.SetValue(root.Name + "\\" + subKey, ValueName, Convert.ToUInt64(Data), (RegistryValueKind)Type); | |||
} | |||
else if (Type == RegistryValueType.REG_NONE) | |||
{ | |||
byte[] none = new byte[0]; | |||
Registry.SetValue(root.Name + "\\" + subKey, ValueName, none, (RegistryValueKind)Type); | |||
} | |||
else if (Type == RegistryValueType.REG_MULTI_SZ) | |||
{ | |||
string[] data; | |||
if (Data.ToString() == "") data = new string[] { }; | |||
else data = Data.ToString().Split(new string[] { "\\0" }, StringSplitOptions.None); | |||
Registry.SetValue(root.Name + "\\" + subKey, ValueName, data, (RegistryValueKind)Type); | |||
} | |||
else | |||
{ | |||
Registry.SetValue(root.Name + "\\" + subKey, ValueName, Data, (RegistryValueKind)Type); | |||
} | |||
root.Close(); | |||
} | |||
return true; | |||
} | |||
} | |||
[DllImport("advapi32.dll", SetLastError = true)] | |||
static extern int RegLoadKey(IntPtr hKey, string lpSubKey, string lpFile); | |||
[DllImport("advapi32.dll", SetLastError = true)] | |||
static extern int RegSaveKey(IntPtr hKey, string lpFile, uint securityAttrPtr = 0); | |||
[DllImport("advapi32.dll", SetLastError = true)] | |||
static extern int RegUnLoadKey(IntPtr hKey, string lpSubKey); | |||
[DllImport("ntdll.dll", SetLastError = true)] | |||
static extern IntPtr RtlAdjustPrivilege(int Privilege, bool bEnablePrivilege, bool IsThreadPrivilege, out bool PreviousValue); | |||
[DllImport("advapi32.dll")] | |||
static extern bool LookupPrivilegeValue(string lpSystemName, string lpName, ref UInt64 lpLuid); | |||
[DllImport("advapi32.dll")] | |||
static extern bool LookupPrivilegeValue(IntPtr lpSystemName, string lpName, ref UInt64 lpLuid); | |||
public static void LoadDefaultUserHive() | |||
{ | |||
var parentKey = RegistryKey.OpenBaseKey(RegistryHive.Users, RegistryView.Default); | |||
IntPtr parentHandle = parentKey.Handle.DangerousGetHandle(); | |||
AcquirePrivileges(); | |||
RegLoadKey(parentHandle, "DefaultUserHive", Environment.ExpandEnvironmentVariables(@"%SYSTEMDRIVE%\Users\Default\NTUSER.dat")); | |||
parentKey.Close(); | |||
} | |||
public static void UnloadDefaultUserHive() | |||
{ | |||
var parentKey = RegistryKey.OpenBaseKey(RegistryHive.Users, RegistryView.Default); | |||
AcquirePrivileges(); | |||
RegUnLoadKey(parentKey.Handle.DangerousGetHandle(), "DefaultUserHive"); | |||
parentKey.Close(); | |||
} | |||
public static void AcquirePrivileges() | |||
{ | |||
ulong luid = 0; | |||
bool throwaway; | |||
LookupPrivilegeValue(IntPtr.Zero, "SeRestorePrivilege", ref luid); | |||
RtlAdjustPrivilege((int)luid, true, true, out throwaway); | |||
LookupPrivilegeValue(IntPtr.Zero, "SeBackupPrivilege", ref luid); | |||
RtlAdjustPrivilege((int)luid, true, true, out throwaway); | |||
} | |||
public static void ReturnPrivileges() | |||
{ | |||
ulong luid = 0; | |||
bool throwaway; | |||
LookupPrivilegeValue(IntPtr.Zero, "SeRestorePrivilege", ref luid); | |||
RtlAdjustPrivilege((int)luid, false, true, out throwaway); | |||
LookupPrivilegeValue(IntPtr.Zero, "SeBackupPrivilege", ref luid); | |||
RtlAdjustPrivilege((int)luid, false, true, out throwaway); | |||
} | |||
} | |||
} |
@ -0,0 +1,70 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | |||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> | |||
<PropertyGroup> | |||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> | |||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> | |||
<ProjectGuid>{DD855BAB-FA5B-458D-8F42-F2F5E7866D0E}</ProjectGuid> | |||
<OutputType>Exe</OutputType> | |||
<AppDesignerFolder>Properties</AppDesignerFolder> | |||
<RootNamespace>ame_upgrade_script</RootNamespace> | |||
<AssemblyName>ame_upgrade_script</AssemblyName> | |||
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion> | |||
<FileAlignment>512</FileAlignment> | |||
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> | |||
<ApplicationIcon>console.ico</ApplicationIcon> | |||
<ApplicationManifest>app.manifest</ApplicationManifest> | |||
<LangVersion>8</LangVersion> | |||
</PropertyGroup> | |||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> | |||
<PlatformTarget>AnyCPU</PlatformTarget> | |||
<DebugSymbols>true</DebugSymbols> | |||
<DebugType>full</DebugType> | |||
<Optimize>false</Optimize> | |||
<OutputPath>bin\Debug\</OutputPath> | |||
<DefineConstants>DEBUG;TRACE</DefineConstants> | |||
<ErrorReport>prompt</ErrorReport> | |||
<WarningLevel>4</WarningLevel> | |||
</PropertyGroup> | |||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> | |||
<PlatformTarget>x64</PlatformTarget> | |||
<DebugType>embedded</DebugType> | |||
<Optimize>true</Optimize> | |||
<OutputPath>bin\Release\</OutputPath> | |||
<DefineConstants>TRACE</DefineConstants> | |||
<ErrorReport>prompt</ErrorReport> | |||
<WarningLevel>4</WarningLevel> | |||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> | |||
<Prefer32bit>false</Prefer32bit> | |||
</PropertyGroup> | |||
<ItemGroup> | |||
<Reference Include="System" /> | |||
<Reference Include="System.Core" /> | |||
<Reference Include="System.Data" /> | |||
<Reference Include="System.Windows.Forms" /> | |||
<Reference Include="System.Xml" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<Compile Include="ConsoleTUI.cs" /> | |||
<Compile Include="NSudo.cs" /> | |||
<Compile Include="ParentProcess.cs" /> | |||
<Compile Include="Program.cs" /> | |||
<Compile Include="Properties\AssemblyInfo.cs" /> | |||
<Compile Include="Registry.cs" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<Content Include="app.manifest" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<None Include="console.ico" /> | |||
</ItemGroup> | |||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> | |||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. | |||
Other similar extension points exist, see Microsoft.Common.targets. | |||
<Target Name="BeforeBuild"> | |||
</Target> | |||
<Target Name="AfterBuild"> | |||
</Target> | |||
--> | |||
</Project> |
@ -0,0 +1,10 @@ | |||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> | |||
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> | |||
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> | |||
<security> | |||
<requestedPrivileges> | |||
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/> | |||
</requestedPrivileges> | |||
</security> | |||
</trustInfo> | |||
</assembly> |
@ -0,0 +1,4 @@ | |||
// <autogenerated /> | |||
using System; | |||
using System.Reflection; | |||
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] |
@ -0,0 +1 @@ | |||
0230e1a8c2cc18fc014551fc4191dbdbe4d55139 |
@ -0,0 +1,7 @@ | |||
C:\Users\Styris\RiderProjects\ame-upgrade-preparation-tool\ame-upgrade-preparation-tool\bin\Debug\ame_upgrade_preparation_tool.exe | |||
C:\Users\Styris\RiderProjects\ame-upgrade-preparation-tool\ame-upgrade-preparation-tool\bin\Debug\ame_upgrade_preparation_tool.pdb | |||
C:\Users\Styris\RiderProjects\ame-upgrade-preparation-tool\ame-upgrade-preparation-tool\obj\Debug\ame-upgrade-preparation-tool.csproj.AssemblyReference.cache | |||
C:\Users\Styris\RiderProjects\ame-upgrade-preparation-tool\ame-upgrade-preparation-tool\obj\Debug\ame-upgrade-preparation-tool.csproj.SuggestedBindingRedirects.cache | |||
C:\Users\Styris\RiderProjects\ame-upgrade-preparation-tool\ame-upgrade-preparation-tool\obj\Debug\ame-upgrade-preparation-tool.csproj.CoreCompileInputs.cache | |||
C:\Users\Styris\RiderProjects\ame-upgrade-preparation-tool\ame-upgrade-preparation-tool\obj\Debug\ame_upgrade_preparation_tool.exe | |||
C:\Users\Styris\RiderProjects\ame-upgrade-preparation-tool\ame-upgrade-preparation-tool\obj\Debug\ame_upgrade_preparation_tool.pdb |
@ -0,0 +1,4 @@ | |||
// <autogenerated /> | |||
using System; | |||
using System.Reflection; | |||
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] |
@ -0,0 +1 @@ | |||
d48447f2b70dbd1ba252db0dc53fc93e856d2017 |
@ -0,0 +1,5 @@ | |||
C:\Users\Styris\RiderProjects\ame-upgrade-preparation-tool\ame-upgrade-preparation-tool\obj\Release\ame-upgrade-preparation-tool.csproj.AssemblyReference.cache | |||
C:\Users\Styris\RiderProjects\ame-upgrade-preparation-tool\ame-upgrade-preparation-tool\obj\Release\ame-upgrade-preparation-tool.csproj.SuggestedBindingRedirects.cache | |||
C:\Users\Styris\RiderProjects\ame-upgrade-preparation-tool\ame-upgrade-preparation-tool\obj\Release\ame-upgrade-preparation-tool.csproj.CoreCompileInputs.cache | |||
C:\Users\Styris\RiderProjects\ame-upgrade-preparation-tool\ame-upgrade-preparation-tool\bin\Release\ame_upgrade_script.exe | |||
C:\Users\Styris\RiderProjects\ame-upgrade-preparation-tool\ame-upgrade-preparation-tool\obj\Release\ame_upgrade_script.exe |
@ -0,0 +1,16 @@ | |||
| |||
Microsoft Visual Studio Solution File, Format Version 12.00 | |||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ame-upgrade-preparation-tool", "ame-upgrade-preparation-tool\ame-upgrade-preparation-tool.csproj", "{DD855BAB-FA5B-458D-8F42-F2F5E7866D0E}" | |||
EndProject | |||
Global | |||
GlobalSection(SolutionConfigurationPlatforms) = preSolution | |||
Debug|Any CPU = Debug|Any CPU | |||
Release|Any CPU = Release|Any CPU | |||
EndGlobalSection | |||
GlobalSection(ProjectConfigurationPlatforms) = postSolution | |||
{DD855BAB-FA5B-458D-8F42-F2F5E7866D0E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||
{DD855BAB-FA5B-458D-8F42-F2F5E7866D0E}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||
{DD855BAB-FA5B-458D-8F42-F2F5E7866D0E}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||
{DD855BAB-FA5B-458D-8F42-F2F5E7866D0E}.Release|Any CPU.Build.0 = Release|Any CPU | |||
EndGlobalSection | |||
EndGlobal |