Оснастка Windows PowerShell для IIS не работает на 32-разрядной версии?

Я пытаюсь написать сценарий 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 Power Foundation Server 2008 Power Tools PSSnapin, что для меня бесполезно.

Есть идеи, как мне это преодолеть? Заранее спасибо.

5 ответов

Решение

Просто чтобы соединить точки. "urig" ответил на свой собственный вопрос в другой теме: TFS Power Tools 2008 Powershell Snapin не будет работать в 64-битной среде в Windows 2008 R2

"Кэти Конг из Microsoft любезно предоставила мне решение этой проблемы. Полную информацию можно найти здесь на форуме MSDN TFS PowerTools: http://social.msdn.microsoft.com/Forums/en-US/tfspowertools/thread/a116799a-0476-4c42-aa3e-45d8ba23739e/?prof=required

Исправление выглядит следующим образом и хорошо работает для меня:

Пожалуйста, сохраните следующее содержимое и сохраните его как *.reg файл и импортируйте в реестр (просто дважды щелкните файл *.reg, дважды нажмите OK)

Редактор реестра Windows, версия 5.00

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 1 \ PowerShellSnapIns \ Microsoft.TeamFoundation.PowerShell] "PowerShellVersion" = "2.0" "Vendor" = "Microsoft Corporation" "Description" = "Это оснастка PowerShell, в состав которой входит команда Командлеты Foundation Server." "VendorIndirect"="Microsoft.TeamFoundation.PowerShell,Microsoft" "DescriptionIndirect"="Microsoft.TeamFoundation.PowerShell. Это оснастка PowerShell, включающая командлеты Team Foundation Server." "Version"="10.0.0.0" "ApplicationBase"="C:\Program Files (x86)\ Электроинструменты Microsoft Team Foundation Server 2010" "AssemblyName"="Microsoft.TeamFoundation.PowerTools.PowerShell, Version=10.0.0.0, Культура = нейтральная, PublicKeyToken=b03f5f7f11d50a3a" "ModuleName"="C:\Program Files (x86)\ Электроинструменты Microsoft Team Foundation Server 2010 \ \Microsoft.TeamFoundation.PowerTools.PowerShell.dll" "CustomPSSnapInType"="Microsoft.TeamFoundation.PoweroTToTT.PowerShell.TFPSSnapIn"

Бег:

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

фактически загружает 32-битную версию powershell;-)

Это явно не то, что вы хотите. Запустите версию в system32, чтобы получить 64-битную версию. Да, действительно.

Вы можете проверить это как:

ps> [intptr]::size
4

Если он возвращает 4, это 32 бит. 64-битный PowerShell вернется 8.

-Oisin

Открытие powershell с помощью следующей команды решило мою проблему:

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

Просто запустите 64-разрядную версию powershell с помощью приведенной выше команды и передайте путь сценария с аргументами.

Одна вещь, которую вы можете попробовать, это загрузить 64-битную PowerShell, как говорит Ойсин, и затем использовать Start-Job -RunAs32, чтобы выполнить скрипт, который загружает оснастку TFS PowerTools и при необходимости выполняет командлеты TFS. Обязательно выведите необходимую информацию из команд, которые выполняются в фоновом режиме. Используйте 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

Для тех, кто найдет это в будущем, я хотел бы добавить, что вы должны дважды проверить, как вы запускаете PowerShell. Я получал ту же ошибку и не мог понять, почему все решения были связаны с использованием 64-битной версии, когда я думал, что уже был.

Оказывается, поскольку я запускал powershell с 32-разрядным модулем запуска стороннего производителя, powershell возвращался к 32-разрядному исполняемому файлу, несмотря на то, что он запускался из папки system32. Спасибо x0n за метод подтверждения версии, которую я использовал, так как это привело меня к моему решению.

Другие вопросы по тегам