diff --git a/tools/Utilities/src/Strings/en-us/Resources.resw b/tools/Utilities/src/Strings/en-us/Resources.resw
index 750d5e7f02..1e6af7af3f 100644
--- a/tools/Utilities/src/Strings/en-us/Resources.resw
+++ b/tools/Utilities/src/Strings/en-us/Resources.resw
@@ -118,19 +118,22 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
- A quick utility for managing environment variables.
+ Create and manage environment variables.
Environment Variables Editor
- Quick and simple utility for managing hosts file.
- ;Locked={"hosts"}
+ Add, filter or remove Hosts file entries.
+ ;Locked={"Hosts"}
Hosts File Editor
;Locked={"Hosts"}
+
+ Launch
+
Utilities
Utilities
@@ -142,9 +145,15 @@
Project Ironsides
- A quick little utility to visualize and edit complex Windows Registry files.
+ Edit and visualize Windows Registry files.
Registry Preview
+
+ Launch as administrator
+
+
+ Launch as administrator
+
\ No newline at end of file
diff --git a/tools/Utilities/src/ViewModels/UtilitiesMainPageViewModel.cs b/tools/Utilities/src/ViewModels/UtilitiesMainPageViewModel.cs
index 65f9285c56..4bdc6f3f06 100644
--- a/tools/Utilities/src/ViewModels/UtilitiesMainPageViewModel.cs
+++ b/tools/Utilities/src/ViewModels/UtilitiesMainPageViewModel.cs
@@ -25,22 +25,25 @@ public UtilitiesMainPageViewModel(IExperimentationService experimentationService
{
Title = stringResource.GetLocalized("HostsFileEditorUtilityTitle"),
Description = stringResource.GetLocalized("HostsFileEditorUtilityDesc"),
- NavigateUri = "https://aka.ms/PowerToysOverview_HostsFileEditor",
+ NavigateUri = "https://go.microsoft.com/fwlink/?Linkid=2271355",
ImageSource = Path.Combine(AppContext.BaseDirectory, "Assets\\HostsUILib", "Hosts.ico"),
+ SupportsLaunchAsAdmin = Microsoft.UI.Xaml.Visibility.Visible,
},
new(Path.Combine(appExAliasAbsFolderPath, "DevHome.RegistryPreviewApp.exe"))
{
Title = stringResource.GetLocalized("RegistryPreviewUtilityTitle"),
Description = stringResource.GetLocalized("RegistryPreviewUtilityDesc"),
- NavigateUri = "https://aka.ms/PowerToysOverview_RegistryPreview",
+ NavigateUri = "https://go.microsoft.com/fwlink/?Linkid=2270966",
ImageSource = Path.Combine(AppContext.BaseDirectory, "Assets\\RegistryPreview", "RegistryPreview.ico"),
+ SupportsLaunchAsAdmin = Microsoft.UI.Xaml.Visibility.Collapsed,
},
new(Path.Combine(appExAliasAbsFolderPath, "DevHome.EnvironmentVariablesApp.exe"))
{
Title = stringResource.GetLocalized("EnvVariablesEditorUtilityTitle"),
Description = stringResource.GetLocalized("EnvVariablesEditorUtilityDesc"),
- NavigateUri = "https://aka.ms/PowerToysOverview_EnvironmentVariables",
+ NavigateUri = "https://go.microsoft.com/fwlink/?Linkid=2270894",
ImageSource = Path.Combine(AppContext.BaseDirectory, "Assets\\EnvironmentVariables", "EnvironmentVariables.ico"),
+ SupportsLaunchAsAdmin = Microsoft.UI.Xaml.Visibility.Visible,
},
new(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), $"Microsoft\\WindowsApps\\{Package.Current.Id.FamilyName}\\devhome.pi.exe"), experimentationService, "ProjectIronsidesExperiment")
{
diff --git a/tools/Utilities/src/ViewModels/UtilityViewModel.cs b/tools/Utilities/src/ViewModels/UtilityViewModel.cs
index 09ecf37bbd..9f547e9ea5 100644
--- a/tools/Utilities/src/ViewModels/UtilityViewModel.cs
+++ b/tools/Utilities/src/ViewModels/UtilityViewModel.cs
@@ -5,22 +5,24 @@
using System.ComponentModel;
using System.Diagnostics;
using System.Windows.Input;
+using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using DevHome.Common.Services;
using DevHome.Telemetry;
using DevHome.Utilities.TelemetryEvents;
+using Microsoft.UI.Xaml;
using Serilog;
namespace DevHome.Utilities.ViewModels;
-public class UtilityViewModel : INotifyPropertyChanged
+public partial class UtilityViewModel : ObservableObject
{
#nullable enable
private readonly ILogger _log = Log.ForContext("SourceContext", nameof(UtilityViewModel));
private readonly IExperimentationService? experimentationService;
private readonly string? experimentalFeature;
- private readonly string exeName;
+ private readonly string _exeName;
#nullable disable
public bool Visible
@@ -48,48 +50,33 @@ public bool Visible
public ICommand LaunchCommand { get; set; }
- public ICommand LaunchAsAdminCommand { get; set; }
+ public Visibility SupportsLaunchAsAdmin { get; set; }
- public event PropertyChangedEventHandler PropertyChanged;
-
- protected virtual void OnPropertyChanged(string propertyName)
- {
- PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
- }
+ [ObservableProperty]
+ private bool _launchAsAdmin;
#nullable enable
public UtilityViewModel(string exeName, IExperimentationService? experimentationService = null, string? experimentalFeature = null)
{
- this.exeName = exeName;
+ this._exeName = exeName;
this.experimentationService = experimentationService;
this.experimentalFeature = experimentalFeature;
LaunchCommand = new RelayCommand(Launch);
- LaunchAsAdminCommand = new RelayCommand(LaunchAsAdmin);
- _log.Information("UtilityViewModel created for Title: {Title}, exe: {ExeName}", Title, exeName);
+ _log.Information($"UtilityViewModel created for Title: {Title}, exe: {exeName}");
}
#nullable disable
private void Launch()
{
- LaunchInternal(false);
- }
-
- private void LaunchAsAdmin()
- {
- LaunchInternal(true);
- }
-
- private void LaunchInternal(bool runAsAdmin)
- {
- _log.Information("Launching {ExeName}, as admin: {RunAsAdmin}", exeName, runAsAdmin);
+ _log.Information($"Launching {_exeName}, as admin: {LaunchAsAdmin}");
// We need to start the process with ShellExecute to run elevated
var processStartInfo = new ProcessStartInfo
{
- FileName = exeName,
+ FileName = _exeName,
UseShellExecute = true,
- Verb = runAsAdmin ? "runas" : "open",
+ Verb = LaunchAsAdmin ? "runas" : "open",
};
try
@@ -97,15 +84,15 @@ private void LaunchInternal(bool runAsAdmin)
var process = Process.Start(processStartInfo);
if (process is null)
{
- _log.Error("Failed to start process {ExeName}", exeName);
+ _log.Error($"Failed to start process {_exeName}");
throw new InvalidOperationException("Failed to start process");
}
}
catch (Exception ex)
{
- _log.Error(ex, "Failed to start process {ExeName}", exeName);
+ _log.Error(ex, $"Failed to start process {_exeName}");
}
- TelemetryFactory.Get().Log("Utilities_UtilitiesLaunchEvent", LogLevel.Critical, new UtilitiesLaunchEvent(Title, runAsAdmin), null);
+ TelemetryFactory.Get().Log("Utilities_UtilitiesLaunchEvent", LogLevel.Critical, new UtilitiesLaunchEvent(Title, LaunchAsAdmin), null);
}
}
diff --git a/tools/Utilities/src/Views/UtilityView.xaml b/tools/Utilities/src/Views/UtilityView.xaml
index 8602f18bef..d1e5c90dcd 100644
--- a/tools/Utilities/src/Views/UtilityView.xaml
+++ b/tools/Utilities/src/Views/UtilityView.xaml
@@ -22,13 +22,15 @@
+
@@ -58,29 +60,22 @@
-
+
+