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.

124 lines
5.5 KiB

using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Security;
using System.Threading;
using System.Windows.Forms;
using Ameliorated.ConsoleUtils;
using System.Drawing;
using System.Security.AccessControl;
using System.Security.Principal;
namespace amecs.Actions
{
public class Profile
{
public static bool ChangeImage()
{
ConsoleTUI.OpenFrame.WriteCenteredLine("Select an image");
Thread.Sleep(1000);
var dialog = new System.Windows.Forms.OpenFileDialog();
dialog.Filter = "Image Files (*.jpg; *.jpeg; *.png; *.bmp; *.jfif)| *.jpg; *.jpeg; *.png; *.bmp; *.jfif"; // Filter files by extension
dialog.Multiselect = false;
dialog.InitialDirectory = Globals.UserFolder;
NativeWindow window = new NativeWindow();
window.AssignHandle(Process.GetCurrentProcess().MainWindowHandle);
if (dialog.ShowDialog(window) == DialogResult.OK)
{
string file;
try
{
file = dialog.FileName;
}
catch (SecurityException e)
{
Console.WriteLine();
ConsoleTUI.OpenFrame.Close("Security error: " + e.Message, ConsoleColor.Red, Console.BackgroundColor, new ChoicePrompt() {AnyKey = true, Text = "Press any key to return to the Menu: "});
return false;
}
ConsoleTUI.OpenFrame.WriteCentered("\r\nSetting profile image");
using (new ConsoleUtils.LoadingIndicator(true))
{
var pfpDir = Path.Combine(Environment.ExpandEnvironmentVariables("%PUBLIC%\\AccountPictures"), Globals.UserSID);
if (Directory.Exists(pfpDir))
{
try
{
Directory.Delete(pfpDir, true);
} catch (Exception e)
{
var logdi = new DirectoryInfo(pfpDir) { Attributes = FileAttributes.Normal };
try
{
NSudo.GetOwnershipPrivilege();
var logdirsec = logdi.GetAccessControl();
logdirsec.SetOwner(WindowsIdentity.GetCurrent().User);
logdi.SetAccessControl(logdirsec);
logdirsec = new DirectorySecurity();
logdirsec.AddAccessRule(new FileSystemAccessRule(WindowsIdentity.GetCurrent().User, FileSystemRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.NoPropagateInherit, AccessControlType.Allow));
logdi.SetAccessControl(logdirsec);
} catch (Exception exception)
{
}
foreach (var info in logdi.GetFileSystemInfos("*", SearchOption.AllDirectories))
{
info.Attributes = FileAttributes.Normal;
}
Directory.Delete(pfpDir, true);
}
}
Directory.CreateDirectory(pfpDir);
var image = Image.FromFile(file);
var pfpKey = @"HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AccountPicture\Users\" + Globals.UserSID;
new Reg.Key() { KeyName = pfpKey, Operation = RegistryOperation.Delete }.Apply();
foreach (var res in new [] { 32, 40, 48, 64, 96, 192, 208, 240, 424, 448, 1080 })
{
var bitmap = new Bitmap(res, res);
var graph = Graphics.FromImage(bitmap);
graph.DrawImage(image, 0, 0, res, res);
var saveLoc = Path.Combine(pfpDir, $"{res}x{res}.png");
bitmap.Save(saveLoc);
new Reg.Value() { KeyName = pfpKey, ValueName = "Image" + res, Type = Reg.RegistryValueType.REG_SZ, Data = saveLoc }.Apply();
}
new Reg.Value() { KeyName = pfpKey, ValueName = "UserPicturePath", Type = Reg.RegistryValueType.REG_SZ, Data = Path.Combine(pfpDir, $"448x448.png") }.Apply();
try
{
Process proc = new Process();
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
proc.StartInfo.FileName = "gpupdate.exe";
proc.StartInfo.Arguments = "/force";
proc.Start();
proc.WaitForExit(20000);
} catch { }
}
Console.WriteLine();
ConsoleTUI.OpenFrame.Close("Profile image changed successfully", ConsoleColor.Green, Console.BackgroundColor, new ChoicePrompt() {AnyKey = true, Text = "Press any key to return to the Menu: "});
return true;
}
else
{
Console.WriteLine();
ConsoleTUI.OpenFrame.Close("You must select an image.", new ChoicePrompt() {AnyKey = true, Text = "Press any key to return to the Menu: "});
return true;
}
}
}
}