diff --git a/Flow.Launcher/MainWindow.xaml b/Flow.Launcher/MainWindow.xaml index fcc3af5c502..83cc016bbbd 100644 --- a/Flow.Launcher/MainWindow.xaml +++ b/Flow.Launcher/MainWindow.xaml @@ -46,6 +46,7 @@ + diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs index 09315d9ddf6..7e12fea135c 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs @@ -1,8 +1,10 @@ using Flow.Launcher.Infrastructure; using Flow.Launcher.Plugin.SharedCommands; using System; +using System.Diagnostics; using System.IO; using System.Linq; +using System.Threading.Tasks; using System.Windows; namespace Flow.Launcher.Plugin.Explorer.Search @@ -127,7 +129,26 @@ internal static Result CreateFileResult(string filePath, Query query, int score { try { - if (c.SpecialKeyState.CtrlPressed) + if (File.Exists(filePath) && c.SpecialKeyState.CtrlPressed && c.SpecialKeyState.ShiftPressed) + { + Task.Run(() => + { + try + { + Process.Start(new ProcessStartInfo + { + FileName = filePath, + UseShellExecute = true, + Verb = "runas", + }); + } + catch (Exception e) + { + MessageBox.Show(e.Message, "Could not start " + filePath); + } + }); + } + else if (c.SpecialKeyState.CtrlPressed) { FilesFolders.OpenContainingFolder(filePath); } diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/plugin.json b/Plugins/Flow.Launcher.Plugin.Explorer/plugin.json index 43f5867fda9..88bee905b98 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/plugin.json +++ b/Plugins/Flow.Launcher.Plugin.Explorer/plugin.json @@ -9,7 +9,7 @@ "Name": "Explorer", "Description": "Search and manage files and folders. Explorer utilises Windows Index Search", "Author": "Jeremy Wu", - "Version": "1.8.5", + "Version": "1.9.0", "Language": "csharp", "Website": "https://github.com/Flow-Launcher/Flow.Launcher", "ExecuteFileName": "Flow.Launcher.Plugin.Explorer.dll", diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml index e00534367d4..770bb69ccd8 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml @@ -53,5 +53,6 @@ Success Successfully disabled this program from displaying in your query + This app is not intended to be run as administrator \ No newline at end of file diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/zh-tw.xaml index 550630482ff..eb339649f87 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/zh-tw.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/zh-tw.xaml @@ -33,4 +33,5 @@ 程式 在 Flow Launcher 中搜尋程式 + diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs index 869172de776..917ebe7ad46 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs +++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs @@ -267,6 +267,7 @@ public class Application : IProgram public string Location => Package.Location; public bool Enabled { get; set; } + public bool CanRunElevated { get; set; } public string LogoUri { get; set; } public string LogoPath { get; set; } @@ -320,7 +321,29 @@ public Result Result(string query, IPublicAPI api) ContextData = this, Action = e => { - Launch(api); + var elevated = ( + e.SpecialKeyState.CtrlPressed && + e.SpecialKeyState.ShiftPressed && + !e.SpecialKeyState.AltPressed && + !e.SpecialKeyState.WinPressed + ); + + if (elevated && CanRunElevated) + { + LaunchElevated(); + } + else + { + Launch(api); + + if (elevated) + { + var title = "Plugin: Program"; + var message = api.GetTranslation("flowlauncher_plugin_program_run_as_administrator_not_supported_message"); + api.ShowMsg(title, message, string.Empty); + } + } + return true; } }; @@ -354,6 +377,21 @@ public List ContextMenus(IPublicAPI api) IcoPath = "Images/folder.png" } }; + + if (CanRunElevated) + { + contextMenus.Add(new Result + { + Title = api.GetTranslation("flowlauncher_plugin_program_run_as_administrator"), + Action = _ => + { + LaunchElevated(); + return true; + }, + IcoPath = "Images/cmd.png" + }); + } + return contextMenus; } @@ -377,6 +415,20 @@ await Task.Run(() => }); } + private async void LaunchElevated() + { + string command = "shell:AppsFolder\\" + UniqueIdentifier; + command = Environment.ExpandEnvironmentVariables(command.Trim()); + + var info = new ProcessStartInfo(command) + { + UseShellExecute = true, + Verb = "runas", + }; + + Main.StartProcess(Process.Start, info); + } + public Application(AppxPackageHelper.IAppxManifestApplication manifestApp, UWP package) { // This is done because we cannot use the keyword 'out' along with a property @@ -403,6 +455,28 @@ public Application(AppxPackageHelper.IAppxManifestApplication manifestApp, UWP p LogoPath = LogoPathFromUri(LogoUri); Enabled = true; + CanRunElevated = CanApplicationRunElevated(); + } + + private bool CanApplicationRunElevated() + { + if (EntryPoint == "Windows.FullTrustApplication") + { + return true; + } + + var manifest = Package.Location + "\\AppxManifest.xml"; + if (File.Exists(manifest)) + { + var file = File.ReadAllText(manifest); + + if (file.Contains("TrustLevel=\"mediumIL\"", StringComparison.OrdinalIgnoreCase)) + { + return true; + } + } + + return false; } internal string ResourceFromPri(string packageFullName, string packageName, string rawReferenceValue) diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs index 931cfacc16d..9d753085652 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs +++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs @@ -102,16 +102,24 @@ public Result Result(string query, IPublicAPI api) Score = matchResult.Score, TitleHighlightData = matchResult.MatchData, ContextData = this, - Action = _ => + Action = c => { + var runAsAdmin = ( + c.SpecialKeyState.CtrlPressed && + c.SpecialKeyState.ShiftPressed && + !c.SpecialKeyState.AltPressed && + !c.SpecialKeyState.WinPressed + ); + var info = new ProcessStartInfo { FileName = LnkResolvedPath ?? FullPath, WorkingDirectory = ParentDirectory, - UseShellExecute = true + UseShellExecute = true, + Verb = runAsAdmin ? "runas" : null }; - Main.StartProcess(Process.Start, info); + Task.Run(() => Main.StartProcess(Process.Start, info)); return true; } diff --git a/Plugins/Flow.Launcher.Plugin.Program/plugin.json b/Plugins/Flow.Launcher.Plugin.Program/plugin.json index a37075b0c77..424aa04f54f 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/plugin.json +++ b/Plugins/Flow.Launcher.Plugin.Program/plugin.json @@ -4,7 +4,7 @@ "Name": "Program", "Description": "Search programs in Flow.Launcher", "Author": "qianlifeng", - "Version": "1.5.4", + "Version": "1.6.0", "Language": "csharp", "Website": "https://github.com/Flow-Launcher/Flow.Launcher", "ExecuteFileName": "Flow.Launcher.Plugin.Program.dll", diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs index 58f8538f0f2..0a934ab32e0 100644 --- a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs +++ b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs @@ -73,7 +73,14 @@ public List Query(Query query) IcoPath = Image, Action = c => { - Execute(Process.Start, PrepareProcessStartInfo(m, c.SpecialKeyState.CtrlPressed)); + var runAsAdministrator = ( + c.SpecialKeyState.CtrlPressed && + c.SpecialKeyState.ShiftPressed && + !c.SpecialKeyState.AltPressed && + !c.SpecialKeyState.WinPressed + ); + + Execute(Process.Start, PrepareProcessStartInfo(m, runAsAdministrator)); return true; } })); @@ -106,7 +113,14 @@ private List GetHistoryCmds(string cmd, Result result) IcoPath = Image, Action = c => { - Execute(Process.Start, PrepareProcessStartInfo(m.Key)); + var runAsAdministrator = ( + c.SpecialKeyState.CtrlPressed && + c.SpecialKeyState.ShiftPressed && + !c.SpecialKeyState.AltPressed && + !c.SpecialKeyState.WinPressed + ); + + Execute(Process.Start, PrepareProcessStartInfo(m.Key, runAsAdministrator)); return true; } }; @@ -129,7 +143,14 @@ private Result GetCurrentCmd(string cmd) IcoPath = Image, Action = c => { - Execute(Process.Start, PrepareProcessStartInfo(cmd)); + var runAsAdministrator = ( + c.SpecialKeyState.CtrlPressed && + c.SpecialKeyState.ShiftPressed && + !c.SpecialKeyState.AltPressed && + !c.SpecialKeyState.WinPressed + ); + + Execute(Process.Start, PrepareProcessStartInfo(cmd, runAsAdministrator)); return true; } }; @@ -147,7 +168,14 @@ private List ResultsFromlHistory() IcoPath = Image, Action = c => { - Execute(Process.Start, PrepareProcessStartInfo(m.Key)); + var runAsAdministrator = ( + c.SpecialKeyState.CtrlPressed && + c.SpecialKeyState.ShiftPressed && + !c.SpecialKeyState.AltPressed && + !c.SpecialKeyState.WinPressed + ); + + Execute(Process.Start, PrepareProcessStartInfo(m.Key, runAsAdministrator)); return true; } }); diff --git a/Plugins/Flow.Launcher.Plugin.Shell/plugin.json b/Plugins/Flow.Launcher.Plugin.Shell/plugin.json index bccba4590a3..cb02f66079f 100644 --- a/Plugins/Flow.Launcher.Plugin.Shell/plugin.json +++ b/Plugins/Flow.Launcher.Plugin.Shell/plugin.json @@ -4,7 +4,7 @@ "Name": "Shell", "Description": "Provide executing commands from Flow Launcher", "Author": "qianlifeng", - "Version": "1.4.3", + "Version": "1.4.4", "Language": "csharp", "Website": "https://github.com/Flow-Launcher/Flow.Launcher", "ExecuteFileName": "Flow.Launcher.Plugin.Shell.dll",