Other day I was assisting a customer who had a unique need of binding a Certificate from within C# code using Powershell. A direct API call won't work due to some constraints, so Powershell was the other viable option. Customer also didn't want any Powershell window to pop-up, so we needed to code around it.
Here is the code sample:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Management.Automation; using System.Collections.ObjectModel; namespace ExecutePowershell { class Program { static void Main(string[] args) { ExecutePowershellClass pwrshell = new ExecutePowershellClass(); pwrshell.ExecuteCommand(); Console.ReadLine(); } } class ExecutePowershellClass { public void ExecuteCommand() { using (PowerShell myPowerShellInstance = PowerShell.Create()) { //powershell script to get version number and list of processes currently executing in the machine. string sScript= "$PSVersionTable.PSVersion;get-process"; //REPLACE THIS sScript WITH THE POWERSHELL //COMMAND BELOW. BASICALLY BUILD YOUR OWN STRING BASED ON YOUR NEED // use "AddScript" to add the contents of a script file to the end of the execution pipeline. myPowerShellInstance.AddScript(sScript); // invoke execution on the pipeline (collecting output) Collection<PSObject> PSOutput = myPowerShellInstance.Invoke(); // loop through each output object item foreach (PSObject outputItem in PSOutput) { if (outputItem != null) { Console.WriteLine(outputItem.ToString()); } } } } } }
Powershell COMMAND to bind a certificate # Import IIS web administration Module Import-Module WebAdministration New-SelfSignedCertificate -DnsName website.test.com -CertStoreLocation cert:LocalMachineMy $certificate = Get-ChildItem Cert:LocalMachineMy | Where-Object {$_.subject -like "*website.test.com*"} | Select-Object -ExpandProperty Thumbprint Write-Host $certificate Get-WebBinding -Port 443 -Name website.test.com | Remove-WebBinding Remove-Item -Path "IIS:SslBindings*!443!website.test.com" New-WebBinding -Name "Default Web Site" -IPAddress "*" -HostHeader "website.test.com" -Port 443 -Protocol https -SslFlags 0 get-item -Path "cert:localmachinemy$certificate" | new-item -path IIS:SslBindings.0.0.0!443!website.test.com -Value $certificate -Force
Note: You need to modify the hostname and binding accordingly.