using System; using System.Collections.Generic; using System.DirectoryServices; using System.DirectoryServices.AccountManagement; using Ameliorated.ConsoleUtils; using System.Linq; using System.Security; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; namespace amecs.Actions { public static class UserPass { public static bool ShowMenu() { var mainMenu = new Ameliorated.ConsoleUtils.Menu() { Choices = { new Menu.MenuItem("Change Username", new Func(ChangeUsername)), new Menu.MenuItem("Change Password", new Func(ChangePassword)), new Menu.MenuItem("Change Display Name", new Func(ChangeDisplayName)), new Menu.MenuItem("Change Administrator Password", new Func(ChangeAdminPassword)), Menu.MenuItem.Blank, new Menu.MenuItem("Return to Menu", new Func(() => true)), new Menu.MenuItem("Exit", new Func(Globals.Exit)), }, SelectionForeground = ConsoleColor.Green }; mainMenu.Write(); var result = (Func)mainMenu.Load(); return result.Invoke(); } public static bool ChangeUsername() { try { while (true) { var username = new InputPrompt() { Text = "Enter new username, or press escape to quit: " }.Start(); if (username == null) return true; if (String.IsNullOrEmpty(username) || !Regex.Match(username, @"^\w[\w\.\- ]{0,19}$").Success) { ConsoleTUI.OpenFrame.WriteLine("Username is invalid."); Console.WriteLine(); continue; } if (Globals.Username.Equals(username)) { ConsoleTUI.OpenFrame.WriteLine("Username matches the current username."); Console.WriteLine(); continue; } try { ConsoleTUI.OpenFrame.WriteCentered("\r\nSetting new username"); using (new ConsoleUtils.LoadingIndicator(true)) { DirectoryEntry entry = (DirectoryEntry)Globals.User.GetUnderlyingObject(); entry.Rename(username); entry.CommitChanges(); PrincipalContext context = new PrincipalContext(ContextType.Machine); PrincipalSearcher userPrincipalSearcher = new PrincipalSearcher(new UserPrincipal(context)); Globals.User = userPrincipalSearcher.FindAll().FirstOrDefault(x => (x is UserPrincipal) && x.Sid.Value == Globals.UserSID) as UserPrincipal; break; } } catch (System.Runtime.InteropServices.COMException e) { if (e.ErrorCode != -2147022694) throw e; ConsoleTUI.OpenFrame.WriteLine("Username is invalid."); Console.WriteLine(); } } } catch (Exception e) { Console.WriteLine(); ConsoleTUI.OpenFrame.Close("Error: " + e.Message.TrimEnd('\n').TrimEnd('\r'), ConsoleColor.Red, Console.BackgroundColor, new ChoicePrompt() {AnyKey = true, Text = "Press any key to return to the Menu: "}); return false; } Console.WriteLine(); if ((int?)ConsoleTUI.OpenFrame.Close("Username changed successfully", ConsoleColor.Green, Console.BackgroundColor, new ChoicePrompt() { TextForeground = ConsoleColor.Yellow, Text = "Logoff to apply changes? (Y/N): " }) == 0) amecs.RestartWindows(true); return true; } public static bool ChangePassword() { try { while (true) { var password = new InputPrompt() { MaskInput = true, Text = "Enter new password, or press escape to quit: " }.Start(); if (password == null) return true; ConsoleTUI.OpenFrame.WriteCentered("\r\nSetting new password"); try { using (new ConsoleUtils.LoadingIndicator(true)) { if (String.IsNullOrEmpty(password)) { Globals.User.SetPassword(""); } else { Globals.User.SetPassword(password); } Thread.Sleep(800); break; } } catch (PasswordException e) { ConsoleTUI.OpenFrame.WriteLine("Could not set password: " + e.Message); Console.WriteLine(); } } } catch (Exception e) { Console.WriteLine(); ConsoleTUI.OpenFrame.Close("Error: " + e.Message.TrimEnd('\n').TrimEnd('\r'), ConsoleColor.Red, Console.BackgroundColor, new ChoicePrompt() {AnyKey = true, Text = "Press any key to return to the Menu: "}); return false; } Console.WriteLine(); ConsoleTUI.OpenFrame.Close("Password changed successfully", ConsoleColor.Green, Console.BackgroundColor, new ChoicePrompt() {AnyKey = true, Text = "Press any key to return to the Menu: "}); return true; } public static bool ChangeAdminPassword() { try { PrincipalContext context = new PrincipalContext(ContextType.Machine); PrincipalSearcher userPrincipalSearcher = new PrincipalSearcher(new UserPrincipal(context)); var administrator = userPrincipalSearcher.FindAll().FirstOrDefault(x => (x is UserPrincipal) && x.Name == "Administrator") as UserPrincipal; while (true) { var password = new InputPrompt() { MaskInput = true, Text = "Enter new Administrator password,\r\nor press escape to quit: " }.Start(); if (password == null) return true; ConsoleTUI.OpenFrame.WriteCentered("\r\nSetting new password"); try { using (new ConsoleUtils.LoadingIndicator(true)) { if (String.IsNullOrEmpty(password)) { administrator.SetPassword(""); } else { administrator.SetPassword(password); } Thread.Sleep(1000); break; } } catch (PasswordException e) { ConsoleTUI.OpenFrame.WriteLine("Could not set password: " + e.Message); Console.WriteLine(); } } } catch (Exception e) { Console.WriteLine(); ConsoleTUI.OpenFrame.Close("Error: " + e.Message.TrimEnd('\n').TrimEnd('\r'), ConsoleColor.Red, Console.BackgroundColor, new ChoicePrompt() {AnyKey = true, Text = "Press any key to return to the Menu: "}); return false; } Console.WriteLine(); ConsoleTUI.OpenFrame.Close("Administrator password changed successfully", ConsoleColor.Green, Console.BackgroundColor, new ChoicePrompt() {AnyKey = true, Text = "Press any key to return to the Menu: "}); return true; } public static bool ChangeDisplayName() { try { var name = new InputPrompt() { Text = "Enter new display name, or press escape to quit: " }.Start(); if (name == null) return true; ConsoleTUI.OpenFrame.WriteCentered("\r\nSetting new display name"); using (new ConsoleUtils.LoadingIndicator(true)) { Globals.User.DisplayName = name; Globals.User.Save(); Thread.Sleep(800); } } catch (Exception e) { Console.WriteLine(); ConsoleTUI.OpenFrame.Close("Error: " + e.Message.TrimEnd('\n').TrimEnd('\r'), ConsoleColor.Red, Console.BackgroundColor, new ChoicePrompt() {AnyKey = true, Text = "Press any key to return to the Menu: "}); return false; } Console.WriteLine(); ConsoleTUI.OpenFrame.Close("Display name changed successfully", ConsoleColor.Green, Console.BackgroundColor, new ChoicePrompt() {AnyKey = true, Text = "Press any key to return to the Menu: "}); return true; } } }