Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Windows PowerShell Snap-In for IIS fails on 32-bit?

I'm trying to write a PowerShell script that will automate my IIS website deployments. I'm trying to run the scripts on my Windows Server 2008 R2 machine, under 32-bit in:

C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe

Whenever I run a WebAdministration command such as this:

Get-Website -Name "MYWebsite"

I get an error like this:

Get-Website : Retrieving the COM class factory for component with CLSID {688EEE
E5-6A7E-422F-B2E1-6AF00DC944A6} failed due to the following error: 80040154.
At line:1 char:12
+ Get-Website <<<<  -Name "MyWebsite"
    + CategoryInfo          : NotSpecified: (:) [Get-Website], COMException
    + FullyQualifiedErrorId : System.Runtime.InteropServices.COMException,Micr
   osoft.IIs.PowerShell.Provider.GetWebsiteCommand

Switching to the 64-bit version of PowerShell.exe resolves this issue but makes it impossible for me to also use the Microsoft Team Foundation Server 2008 Power Tools PSSnapin, which is a no-go for me.

Any idea how I can overcome this? Thanks in advance.

like image 753
urig Avatar asked Dec 17 '22 22:12

urig


2 Answers

Running:

C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe 

actually loads the 32 bit version of powershell ;-)

This obviously not what you want. Run the version in system32 to get the 64bit version. Yes, really.

You can verify this like:

ps> [intptr]::size
4

If it returns 4, it's 32 bit. 64 bit powershell will return 8.

-Oisin

like image 200
x0n Avatar answered Dec 19 '22 11:12

x0n


One thing you might try is to load up a 64-bit PowerShell as Oisin says and then use Start-Job -RunAs32 to execute script that loads the TFS PowerTools snapin and executes the TFS cmdlets as necessary. Be sure to output an required info from the commands that run in the background job. Use Wait-Job to wait for it to complete then use Receive-Job to get the data from the 32-bit side back into your main 64-bit PowerShell session e.g.

PS> [IntPtr]::Size
8
PS> $job = Start-Job { [intptr]::size } -RunAs32
PS> Wait-Job $job

Id              Name      State      HasMoreData     Location     Command
--              ----      -----      -----------     --------     -------
3               Job3      Completed  True            localhost    [intptr]::size


PS> Receive-Job $job
4
like image 26
Keith Hill Avatar answered Dec 19 '22 11:12

Keith Hill