32位系统上的Windows PowerShell Snap-In无法在IIS上运行?

6

我想编写一份PowerShell脚本来自动化我的IIS网站部署。我希望在我的Windows Server 2008 R2机器上以32位方式运行这些脚本:

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

每当我运行WebAdministration命令,比如这个命令:
Get-Website -Name "MYWebsite"

我收到了这样的错误信息:
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

切换到64位的PowerShell.exe版本可以解决这个问题,但这样做会让我无法使用Microsoft Team Foundation Server 2008 Power Tools PSSnapin,这对我来说是不可行的。您有什么想法可以克服这个问题吗?谢谢。

这是一个明确的答案,为我解决了问题 - https://dev59.com/bGw15IYBdhLWcg3wCnUn#6872000 - JsAndDotNet
5个回答

7

运行中:

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

实际上加载的是32位版本的PowerShell ;-)

显然这不是您想要的。运行system32中的版本以获取64位版本。是的,真的。

您可以像这样验证:

ps> [intptr]::size
4

如果它返回4,则为32位。64位的 Powershell 返回 8。
-Oisin

1
我认为他遇到的问题是他想要在WebAdmin模块中使用TFS Snapin(仅限32位),但该模块似乎只支持64位。 - Keith Hill

3

您可以尝试加载64位PowerShell,如Oisin所说,然后使用Start-Job -RunAs32执行脚本,加载TFS PowerTools snapin并根据需要执行TFS cmdlets。请确保输出在后台作业中运行的命令所需的信息。使用Wait-Job等待其完成,然后使用Receive-Job将32位侧的数据获取回主要的64位PowerShell会话中。

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

再次感谢您的指正,Keith。我已经编辑了我的问题以反映您的更正。我仍然不知道如何让IIS PSProvider和TFS Power Tools PSSnapin一起工作。有什么想法吗? - urig
我不知道有什么方法可以在同一个PowerShell会话中加载32位的snapin和64位的snapin。除了使用32位后台作业,如我的答案所述。 - Keith Hill

3

使用下面的命令打开powershell解决了我的问题:

%SystemRoot%\sysnative\WindowsPowerShell\v1.0\powershell.exe 

只需使用上述命令调用64位版本的PowerShell,并将脚本路径和参数传递给它。


1

对于未来遇到此问题的人,我想补充一点,您应该仔细检查如何启动powershell。我也遇到了同样的错误,但是无法弄清楚为什么所有的解决方案都是关于使用64位版本,而我认为我已经在使用。

事实证明,因为我正在使用第三方32位启动器运行powershell,所以powershell会回退到32位可执行文件,尽管它是从system32文件夹中启动的。感谢x0n提供的确认我使用的版本的方法,这使我找到了解决方案。


0

为了串联起来。"urig" 在另一个主题中回答了自己的问题: TFS Power Tools 2008 Powershell Snapin won't run in on 64-bit in Windows 2008 R2

"Microsoft 的 Cathy Kong 很好心地为我提供了解决此问题的方法。详细信息可以在 MSDN TFS PowerTools 论坛中找到:http://social.msdn.microsoft.com/Forums/en-US/tfspowertools/thread/a116799a-0476-4c42-aa3e-45d8ba23739e/?prof=required

解决方法如下,对我很有效:

请保存以下内容并将其保存为 *.reg 文件,然后导入到 Registry 中(只需双击 *.reg 文件,单击“确定”两次)

Windows Registry Editor 版本 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellSnapIns\Microsoft.TeamFoundation.PowerShell] "PowerShellVersion"="2.0" "Vendor"="Microsoft Corporation" "Description"="这是一个包含Team Foundation Server cmdlets的PowerShell插件。" "VendorIndirect"="Microsoft.TeamFoundation.PowerShell,Microsoft" "DescriptionIndirect"="Microsoft.TeamFoundation.PowerShell,这是一个包含Team Foundation Server cmdlets的PowerShell插件。" "Version"="10.0.0.0" "ApplicationBase"="C:\Program Files (x86)\Microsoft Team Foundation Server 2010 Power Tools" "AssemblyName"="Microsoft.TeamFoundation.PowerTools.PowerShell, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ModuleName"="C:\Program Files (x86)\Microsoft Team Foundation Server 2010 Power Tools\Microsoft.TeamFoundation.PowerTools.PowerShell.dll" "CustomPSSnapInType"="Microsoft.TeamFoundation.PowerTools.PowerShell.TFPSSnapIn"


不,另一个问题的答案在这里并不相关。一个是关于TFS PowerShell插件在x64下无法工作;而这个问题是关于IIS模块在WOW64下无法在x86下工作。容易混淆,但不是同一个问题。 - piers7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接