Estoy creando una aplicación que detiene el sitio web predeterminado de IIS. Usé un script de PowerShell para detener el sitio web porque ese script se ejecuta desde mi sitio web.
Este es mi guion:
Import-Module C:\Windows\System32\WindowsPowerShell\v1.0\Modules\WebAdministration Stop-Website 'Default Web Site' my copy code Start-Website 'Default Web Site'
Y este es mi código C#:
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();
Me muestra el siguiente error
No se pudo recuperar la fábrica de clases COM para el componente con CLSID {688EEEE5-6A7E-422F-B2E1-6AF00DC944A6} debido al siguiente error: 80040154 Clase no registrada (Excepción de HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).
Debe verificar si la instancia de PowerShell en la que está ejecutando su código PS es de 32 bits o de 64 bits y hacer que su solución se cree para esa plataforma de destino. Puedes verificar esto usando:
if([IntPtr]::size -eq 8) { Write-Host 'x64' } else { Write-Host 'x86' }
Como se señaló en la sección de comentarios, si está ejecutando PowerShell de 64 bits, la creación de su solución para AnyCPU y la desactivación de "Preferir 32 bits" resuelve el problema.
Siguiendo con la respuesta de @Jenish Zinzuvadiya con respecto a PowerShell ejecutándose como x86/x64, en mi caso, el problema era que estaba iniciando PowerShell desde Visual Studio usando el complemento "Open Command Line", que estaba iniciando PowerShell como un proceso x86.
Lanzar PowerShell desde el menú Inicio lo hizo como un proceso x64 y eso resolvió el problema para mí.