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; } } } }