mirror of
https://github.com/microsoft/PowerToys.git
synced 2025-12-16 11:48:06 +01:00
Enable starting apps with command line arguments when run as admin is selected (#6923)
* Enable Run as Admin Arguments * Use a seperate function for both methods which were generating ProcessStartInfo fixes missing LnkResolvedPath missing in contextmenu (E.g. Shortcuts / PWA's). * Update tests * Move ProgramArguments to Result class Co-authored-by: Roy <royvou@hotmailcom>
This commit is contained in:
@@ -439,7 +439,7 @@ namespace Microsoft.Plugin.Program.UnitTests.Programs
|
|||||||
var mock = new Mock<IPublicAPI>();
|
var mock = new Mock<IPublicAPI>();
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
List<ContextMenuResult> contextMenuResults = _pinnedWebpage.ContextMenus(mock.Object);
|
List<ContextMenuResult> contextMenuResults = _pinnedWebpage.ContextMenus(string.Empty, mock.Object);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.AreEqual(3, contextMenuResults.Count);
|
Assert.AreEqual(3, contextMenuResults.Count);
|
||||||
@@ -455,7 +455,7 @@ namespace Microsoft.Plugin.Program.UnitTests.Programs
|
|||||||
var mock = new Mock<IPublicAPI>();
|
var mock = new Mock<IPublicAPI>();
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
List<ContextMenuResult> contextMenuResults = _dummyInternetShortcutApp.ContextMenus(mock.Object);
|
List<ContextMenuResult> contextMenuResults = _dummyInternetShortcutApp.ContextMenus(string.Empty, mock.Object);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.AreEqual(2, contextMenuResults.Count);
|
Assert.AreEqual(2, contextMenuResults.Count);
|
||||||
@@ -470,7 +470,7 @@ namespace Microsoft.Plugin.Program.UnitTests.Programs
|
|||||||
var mock = new Mock<IPublicAPI>();
|
var mock = new Mock<IPublicAPI>();
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
List<ContextMenuResult> contextMenuResults = _chrome.ContextMenus(mock.Object);
|
List<ContextMenuResult> contextMenuResults = _chrome.ContextMenus(string.Empty, mock.Object);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.AreEqual(3, contextMenuResults.Count);
|
Assert.AreEqual(3, contextMenuResults.Count);
|
||||||
@@ -486,7 +486,7 @@ namespace Microsoft.Plugin.Program.UnitTests.Programs
|
|||||||
var mock = new Mock<IPublicAPI>();
|
var mock = new Mock<IPublicAPI>();
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
List<ContextMenuResult> contextMenuResults = _cmdRunCommand.ContextMenus(mock.Object);
|
List<ContextMenuResult> contextMenuResults = _cmdRunCommand.ContextMenus(string.Empty, mock.Object);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.AreEqual(3, contextMenuResults.Count);
|
Assert.AreEqual(3, contextMenuResults.Count);
|
||||||
@@ -502,7 +502,7 @@ namespace Microsoft.Plugin.Program.UnitTests.Programs
|
|||||||
var mock = new Mock<IPublicAPI>();
|
var mock = new Mock<IPublicAPI>();
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
List<ContextMenuResult> contextMenuResults = _dummyAppRefApp.ContextMenus(mock.Object);
|
List<ContextMenuResult> contextMenuResults = _dummyAppRefApp.ContextMenus(string.Empty, mock.Object);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.AreEqual(3, contextMenuResults.Count);
|
Assert.AreEqual(3, contextMenuResults.Count);
|
||||||
@@ -518,7 +518,7 @@ namespace Microsoft.Plugin.Program.UnitTests.Programs
|
|||||||
var mock = new Mock<IPublicAPI>();
|
var mock = new Mock<IPublicAPI>();
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
List<ContextMenuResult> contextMenuResults = _dummyShortcutApp.ContextMenus(mock.Object);
|
List<ContextMenuResult> contextMenuResults = _dummyShortcutApp.ContextMenus(string.Empty, mock.Object);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.AreEqual(3, contextMenuResults.Count);
|
Assert.AreEqual(3, contextMenuResults.Count);
|
||||||
@@ -534,7 +534,7 @@ namespace Microsoft.Plugin.Program.UnitTests.Programs
|
|||||||
var mock = new Mock<IPublicAPI>();
|
var mock = new Mock<IPublicAPI>();
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
List<ContextMenuResult> contextMenuResults = _dummyFolderApp.ContextMenus(mock.Object);
|
List<ContextMenuResult> contextMenuResults = _dummyFolderApp.ContextMenus(string.Empty, mock.Object);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.AreEqual(2, contextMenuResults.Count);
|
Assert.AreEqual(2, contextMenuResults.Count);
|
||||||
@@ -549,7 +549,7 @@ namespace Microsoft.Plugin.Program.UnitTests.Programs
|
|||||||
var mock = new Mock<IPublicAPI>();
|
var mock = new Mock<IPublicAPI>();
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
List<ContextMenuResult> contextMenuResults = _dummyGenericFileApp.ContextMenus(mock.Object);
|
List<ContextMenuResult> contextMenuResults = _dummyGenericFileApp.ContextMenus(string.Empty, mock.Object);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.AreEqual(2, contextMenuResults.Count);
|
Assert.AreEqual(2, contextMenuResults.Count);
|
||||||
@@ -586,5 +586,20 @@ namespace Microsoft.Plugin.Program.UnitTests.Programs
|
|||||||
// Act
|
// Act
|
||||||
return Win32Program.GetAppTypeFromPath(path);
|
return Win32Program.GetAppTypeFromPath(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[TestCase(null)]
|
||||||
|
[TestCase("")]
|
||||||
|
[TestCase("ping 1.1.1.1")]
|
||||||
|
public void EmptyArgumentsShouldNotThrow(string argument)
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var mock = new Mock<IPublicAPI>();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
List<ContextMenuResult> contextMenuResults = _dummyInternetShortcutApp.ContextMenus(argument, mock.Object);
|
||||||
|
|
||||||
|
// Assert (Should always return if the above does not throw any exception)
|
||||||
|
Assert.True(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -156,9 +156,9 @@ namespace Microsoft.Plugin.Program
|
|||||||
}
|
}
|
||||||
|
|
||||||
var menuOptions = new List<ContextMenuResult>();
|
var menuOptions = new List<ContextMenuResult>();
|
||||||
if (selectedResult.ContextData is Programs.IProgram program)
|
if (selectedResult.ContextData is IProgram program)
|
||||||
{
|
{
|
||||||
menuOptions = program.ContextMenus(_context.API);
|
menuOptions = program.ContextMenus(selectedResult.ProgramArguments, _context.API);
|
||||||
}
|
}
|
||||||
|
|
||||||
return menuOptions;
|
return menuOptions;
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ namespace Microsoft.Plugin.Program.Programs
|
|||||||
{
|
{
|
||||||
public interface IProgram
|
public interface IProgram
|
||||||
{
|
{
|
||||||
List<ContextMenuResult> ContextMenus(IPublicAPI api);
|
List<ContextMenuResult> ContextMenus(string queryArguments, IPublicAPI api);
|
||||||
|
|
||||||
Result Result(string query, string queryArguments, IPublicAPI api);
|
Result Result(string query, string queryArguments, IPublicAPI api);
|
||||||
|
|
||||||
|
|||||||
@@ -98,6 +98,7 @@ namespace Microsoft.Plugin.Program.Programs
|
|||||||
Icon = Logo,
|
Icon = Logo,
|
||||||
Score = score,
|
Score = score,
|
||||||
ContextData = this,
|
ContextData = this,
|
||||||
|
ProgramArguments = queryArguments,
|
||||||
Action = e =>
|
Action = e =>
|
||||||
{
|
{
|
||||||
Launch(api, queryArguments);
|
Launch(api, queryArguments);
|
||||||
@@ -117,7 +118,7 @@ namespace Microsoft.Plugin.Program.Programs
|
|||||||
}
|
}
|
||||||
|
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessage("Design", "CA1031:Do not catch general exception types", Justification = "Intentially keeping the process alive.")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessage("Design", "CA1031:Do not catch general exception types", Justification = "Intentially keeping the process alive.")]
|
||||||
public List<ContextMenuResult> ContextMenus(IPublicAPI api)
|
public List<ContextMenuResult> ContextMenus(string queryArguments, IPublicAPI api)
|
||||||
{
|
{
|
||||||
if (api == null)
|
if (api == null)
|
||||||
{
|
{
|
||||||
@@ -144,7 +145,7 @@ namespace Microsoft.Plugin.Program.Programs
|
|||||||
|
|
||||||
var info = ShellCommand.SetProcessStartInfo(command, verb: "runas");
|
var info = ShellCommand.SetProcessStartInfo(command, verb: "runas");
|
||||||
info.UseShellExecute = true;
|
info.UseShellExecute = true;
|
||||||
|
info.Arguments = queryArguments;
|
||||||
Process.Start(info);
|
Process.Start(info);
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -220,15 +220,10 @@ namespace Microsoft.Plugin.Program.Programs
|
|||||||
IcoPath = IcoPath,
|
IcoPath = IcoPath,
|
||||||
Score = score,
|
Score = score,
|
||||||
ContextData = this,
|
ContextData = this,
|
||||||
|
ProgramArguments = queryArguments,
|
||||||
Action = e =>
|
Action = e =>
|
||||||
{
|
{
|
||||||
var info = new ProcessStartInfo
|
var info = GetProcessStartInfo(queryArguments);
|
||||||
{
|
|
||||||
FileName = LnkResolvedPath ?? FullPath,
|
|
||||||
WorkingDirectory = ParentDirectory,
|
|
||||||
UseShellExecute = true,
|
|
||||||
Arguments = queryArguments,
|
|
||||||
};
|
|
||||||
|
|
||||||
Main.StartProcess(Process.Start, info);
|
Main.StartProcess(Process.Start, info);
|
||||||
|
|
||||||
@@ -248,7 +243,7 @@ namespace Microsoft.Plugin.Program.Programs
|
|||||||
}
|
}
|
||||||
|
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessage("Design", "CA1031:Do not catch general exception types", Justification = "Intentially keeping the process alive.")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessage("Design", "CA1031:Do not catch general exception types", Justification = "Intentially keeping the process alive.")]
|
||||||
public List<ContextMenuResult> ContextMenus(IPublicAPI api)
|
public List<ContextMenuResult> ContextMenus(string queryArguments, IPublicAPI api)
|
||||||
{
|
{
|
||||||
if (api == null)
|
if (api == null)
|
||||||
{
|
{
|
||||||
@@ -269,14 +264,7 @@ namespace Microsoft.Plugin.Program.Programs
|
|||||||
AcceleratorModifiers = ModifierKeys.Control | ModifierKeys.Shift,
|
AcceleratorModifiers = ModifierKeys.Control | ModifierKeys.Shift,
|
||||||
Action = _ =>
|
Action = _ =>
|
||||||
{
|
{
|
||||||
var info = new ProcessStartInfo
|
var info = GetProcessStartInfo(queryArguments, true);
|
||||||
{
|
|
||||||
FileName = FullPath,
|
|
||||||
WorkingDirectory = ParentDirectory,
|
|
||||||
Verb = "runas",
|
|
||||||
UseShellExecute = true,
|
|
||||||
};
|
|
||||||
|
|
||||||
Task.Run(() => Main.StartProcess(Process.Start, info));
|
Task.Run(() => Main.StartProcess(Process.Start, info));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -327,6 +315,18 @@ namespace Microsoft.Plugin.Program.Programs
|
|||||||
return contextMenus;
|
return contextMenus;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ProcessStartInfo GetProcessStartInfo(string programArguments, bool runAsAdmin = false)
|
||||||
|
{
|
||||||
|
return new ProcessStartInfo
|
||||||
|
{
|
||||||
|
FileName = LnkResolvedPath ?? FullPath,
|
||||||
|
WorkingDirectory = ParentDirectory,
|
||||||
|
UseShellExecute = true,
|
||||||
|
Arguments = programArguments,
|
||||||
|
Verb = runAsAdmin ? "runas" : string.Empty,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
{
|
{
|
||||||
return ExecutableName;
|
return ExecutableName;
|
||||||
|
|||||||
@@ -36,6 +36,8 @@ namespace Wox.Plugin
|
|||||||
|
|
||||||
public string FontFamily { get; set; }
|
public string FontFamily { get; set; }
|
||||||
|
|
||||||
|
public string ProgramArguments { get; set; }
|
||||||
|
|
||||||
public Visibility ToolTipVisibility { get; set; } = Visibility.Collapsed;
|
public Visibility ToolTipVisibility { get; set; } = Visibility.Collapsed;
|
||||||
|
|
||||||
public ToolTipData ToolTipData
|
public ToolTipData ToolTipData
|
||||||
|
|||||||
Reference in New Issue
Block a user