Skip to content

Commit d150b21

Browse files
authored
Restart UWP as user when started from Task Manager (#6530)
1 parent a053fec commit d150b21

File tree

3 files changed

+55
-1
lines changed

3 files changed

+55
-1
lines changed

Files.Launcher/Program.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,21 @@ private static bool HandleCommandLineArgs()
256256
{
257257
localSettings.Values.Remove("Arguments");
258258

259-
if (arguments == "TerminateUwp")
259+
if (arguments == "StartUwp")
260+
{
261+
var folder = localSettings.Values.Get("Folder", "");
262+
localSettings.Values.Remove("Folder");
263+
264+
using Process process = new Process();
265+
process.StartInfo.UseShellExecute = true;
266+
process.StartInfo.FileName = "files.exe";
267+
process.StartInfo.Arguments = folder;
268+
process.Start();
269+
270+
TerminateProcess((int)localSettings.Values["pid"]);
271+
return true;
272+
}
273+
else if (arguments == "TerminateUwp")
260274
{
261275
TerminateProcess((int)localSettings.Values["pid"]);
262276
return true;

Files/App.xaml.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,11 @@ protected override async void OnActivated(IActivatedEventArgs args)
342342
{
343343
var parsedArgs = eventArgs.Uri.Query.TrimStart('?').Split('=');
344344
var unescapedValue = Uri.UnescapeDataString(parsedArgs[1]);
345+
var folder = (StorageFolder)await FilesystemTasks.Wrap(() => StorageFolder.GetFolderFromPathAsync(unescapedValue).AsTask());
346+
if (folder != null && !string.IsNullOrEmpty(folder.Path))
347+
{
348+
unescapedValue = folder.Path; // Convert short name to long name (#6190)
349+
}
345350
switch (parsedArgs[0])
346351
{
347352
case "tab":

Files/Program.cs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using Files.Helpers;
44
using System;
55
using System.Linq;
6+
using System.Security.Principal;
67
using System.Threading.Tasks;
78
using Windows.ApplicationModel;
89
using Windows.ApplicationModel.Activation;
@@ -15,10 +16,24 @@ internal class Program
1516
{
1617
const string PrelaunchInstanceKey = "PrelaunchInstance";
1718

19+
private static bool IsAdministrator()
20+
{
21+
using var identity = WindowsIdentity.GetCurrent();
22+
var principal = new WindowsPrincipal(identity);
23+
return principal.IsInRole(WindowsBuiltInRole.Administrator);
24+
}
25+
1826
private static async Task Main()
1927
{
2028
var proc = System.Diagnostics.Process.GetCurrentProcess();
2129

30+
if (IsAdministrator())
31+
{
32+
// UWP can't start as admin, restart as normal user from FTP
33+
await SpawnUnelevatedUwpAppInstance(proc.Id);
34+
return;
35+
}
36+
2237
if (!ApplicationData.Current.LocalSettings.Values.Get("AlwaysOpenANewInstance", false))
2338
{
2439
IActivatedEventArgs activatedArgs = AppInstance.GetActivatedEventArgs();
@@ -128,6 +143,26 @@ public static async Task OpenShellCommandInExplorerAsync(string shellCommand, in
128143
await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync();
129144
}
130145

146+
public static async Task SpawnUnelevatedUwpAppInstance(int pid)
147+
{
148+
IActivatedEventArgs activatedArgs = AppInstance.GetActivatedEventArgs();
149+
if (activatedArgs is CommandLineActivatedEventArgs cmdLineArgs)
150+
{
151+
var parsedCommands = CommandLineParser.ParseUntrustedCommands(cmdLineArgs.Operation.Arguments);
152+
switch (parsedCommands.FirstOrDefault()?.Type)
153+
{
154+
case ParsedCommandType.ExplorerShellCommand:
155+
case ParsedCommandType.OpenDirectory:
156+
case ParsedCommandType.OpenPath:
157+
ApplicationData.Current.LocalSettings.Values["Folder"] = parsedCommands[0].Payload;
158+
break;
159+
}
160+
}
161+
ApplicationData.Current.LocalSettings.Values["Arguments"] = "StartUwp";
162+
ApplicationData.Current.LocalSettings.Values["pid"] = pid;
163+
await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync();
164+
}
165+
131166
public static async Task TerminateUwpAppInstance(int pid)
132167
{
133168
ApplicationData.Current.LocalSettings.Values["Arguments"] = "TerminateUwp";

0 commit comments

Comments
 (0)