Retrieving the COM class factory for component with CLSID {688EEEE5-6A7E-422F-B2E1-6AF00DC944A6} failed

Jenish Zinzuvadiya picture Jenish Zinzuvadiya · Jul 25, 2015 · Viewed 9.8k times · Source

I am creating application which stop the IIS Default Web Site. I used a PowerShell script to stop website because that script is executed form my website.

This is my script:

Import-Module C:\Windows\System32\WindowsPowerShell\v1.0\Modules\WebAdministration
Stop-Website 'Default Web Site'
my copy code
Start-Website 'Default Web Site'

And this is my C# code:

PowerShell _PowerShell = PowerShell.Create();

Runspace rs = RunspaceFactory.CreateRunspace();
rs.Open();

_PowerShell.Runspace = rs;
_PowerShell.AddScript(@"Set-ExecutionPolicy RemoteSigned -scope LocalMachine").Invoke();
_PowerShell.AddScript(@"E:\DE.TEST\Power_Shell\Scripts\StopIISDefaultSite.ps1").Invoke();

if (_PowerShell.HadErrors)
{
    Collection<ErrorRecord> errors = _PowerShell.Streams.Error.ReadAll();

    foreach (var item in errors)
    {
        Console.WriteLine(item.ToString());
    }
}

Console.ReadLine();

It shows the following error

Retrieving the COM class factory for component with CLSID {688EEEE5-6A7E-422F-B2E1-6AF00DC944A6} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

Answer

Jenish Zinzuvadiya picture Jenish Zinzuvadiya · Jul 27, 2015

You need to check whether the PowerShell instance you are running your PS code under is 32-bit or 64-bit and make your solution build for that target platform. You can check this using:

if([IntPtr]::size -eq 8) { Write-Host 'x64' } else { Write-Host 'x86' }

Source

As pointed out in the comments setion, if you are running PowerShell 64-bit, building your solution for AnyCPU and unchecking "Prefer 32-bit" solves the issue.