Script for automating a large assortment of AME related actions
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.

220 lines
9.7 KiB

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<bool>(ChangeUsername)),
new Menu.MenuItem("Change Password", new Func<bool>(ChangePassword)),
new Menu.MenuItem("Change Display Name", new Func<bool>(ChangeDisplayName)),
new Menu.MenuItem("Change Administrator Password", new Func<bool>(ChangeAdminPassword)),
Menu.MenuItem.Blank,
new Menu.MenuItem("Return to Menu", new Func<bool>(() => true)),
new Menu.MenuItem("Exit", new Func<bool>(Globals.Exit)),
},
SelectionForeground = ConsoleColor.Green
};
mainMenu.Write();
var result = (Func<bool>)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;
}
}
}