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:
Roy
2020-10-21 20:49:55 +02:00
committed by GitHub
parent 8d9e85f4f5
commit 29ed39c7ae
6 changed files with 47 additions and 29 deletions

View File

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

View File

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

View File

@@ -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);

View File

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

View File

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

View File

@@ -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