Сколько мне крови выпил портал самообслуживания (Self-Service Portal) Service Manager прежде чем я его установил, но я его победил! Всё не заладилось с самого начала. Я изначально решил использовать HTTPS. Я открыл оснастку для запроса сертификата из корпоративного центра сертификации, заполнил все поля, добавил альтернативные DNS и установил его в локальное хранилище компьютера. Был установлен SharePoint 2010 Foundation SP1 и русский языковой пакет. А вот дальше начались приключения… При установке веб компонентов Silverlight и компонентов SharePoint у меня возникала ошибка:
custom action _RollBackPortalWebSite.11EE91AB_EABF_48A6_9973_4DCD73190AC6 unexpectedly closed the hInstall handle (type MSIHANDLE) provided to it. The custom action should be fixed to not close that handle.
В общем-то ошибка не говорит ни о чем. Копнув логи установки, я увидел следующее:
CreatePortalWebSite: Error: Unable to find Certificat 'E=support@domain.loc, SUPPORT.domain.loc, OU=IT Department, O=Company, L=Moscow, S=Russian Federation, C=RU' in personal store.,
Stack: at Microsoft.MOMv3.Setup.MOMv3ManagedCAs.CreateWebSite(Session session, String WebSiteName, Int32 iWebSitePort, String VdirPath, String CertificatName, String AppPool)
at Microsoft.MOMv3.Setup.MOMv3ManagedCAs.CreatePortalWebSite(Session session)
И дальше Rollback Action. Я решил – раз проблема с сертификатом, то поставлю в режиме HTTP, а на HTTPS поменяю уже после установки. Первый квест пройден, портал установился. Дальше я начал искать, а куда же установился мой портал? В итоге, как оказалось, инсталлятор сперва устанавливает компоненты Silverlight по 80 порту, затем сам портал уже по умолчанию устанавливается по порту на единицу выше предыдущего, т.е. 81… Совершенно не люблю предоставлять web сервисы, где конечным пользователям требуется вводить еще и номер порта. Ну да ладно, всё равно же решил ставить в режиме SSL :). Первым делом я полез в IIS и поменял Binding сайта Service Manager Portal, удалил HTTP и установил HTTPS со своим выписанным сертификатом.
Далее открыл SharePoint 2010 Central Administration, перешел в меню Alternate Access Mapping и заменил пути, попутно добавив альтернативный адрес для входа (если будете делать также, то не забудьте в DNS добавить CNAME :)).
Ну раз уж HTTPS, то HTTPS до конца! Квест еще не закончен :). Далее мне захотелось освободить 80 порт, чтобы в дальнейшем настроить перенаправление с 80 порта на 443, для этого мне нужно было переназначить порт с сайта SCSMWebContentServer. Также, как и в случае с предыдущим сайтом, я поменял Binding с 80 порта на HTTPS с портом 444… В общем-то этот сайт не имеет страниц для конечного пользователя, поэтому можно выбрать любой свободный порт. Всё, можно проверять портал и убедиться, что Silverlight компоненты не будут загружаться :), это и понятно. Обратно возвращаемся в оснастку IIS и меняем параметр SMPortal_WebContentServer_URL на новый адрес.
Также меняем настройку ContentHostAbsoluteUri на новый адрес внутри приложения ContentHost внутри сайта SCSMWebContentServer.
Вроде бы всё работает, вроде бы Silverlight компоненты открываются, но при открытии домашней страницы или попытке создать запрос на обслуживание появляется ошибка внизу страницы «Не удается подключиться к службе WCF портала Service Manager. Для получения дополнительных сведений обратитесь в службу поддержки или к ИТ-администратору.», пришлось обратиться к себе :).
Самое главное правило – «Смотри логи!». И так, что я вижу, Application Log сообщает следующее:
WebHost failed to process a request.
Sender Information: System.ServiceModel.ServiceHostingEnvironment+HostingManager/33860122
Exception: System.ServiceModel.ServiceActivationException: The service '/ServiceHost/Services/DataAccessService.svc' cannot be activated due to an exception during compilation. The exception message is: Could not find a base address that matches scheme http for the endpoint with binding CustomBinding. Registered base address schemes are [https].. ---> System.InvalidOperationException: Could not find a base address that matches scheme http for the endpoint with binding CustomBinding. Registered base address schemes are [https].
at System.ServiceModel.ServiceHostBase.MakeAbsoluteUri(Uri relativeOrAbsoluteUri, Binding binding, UriSchemeKeyedCollection baseAddresses)
at System.ServiceModel.Description.ConfigLoader.LoadServiceDescription(ServiceHostBase host, ServiceDescription description, ServiceElement serviceElement, Action`1 addBaseAddress)
at System.ServiceModel.ServiceHostBase.ApplyConfiguration()
at System.ServiceModel.ServiceHostBase.InitializeDescription(UriSchemeKeyedCollection baseAddresses)
at System.ServiceModel.ServiceHost..ctor(Type serviceType, Uri[] baseAddresses)
at System.ServiceModel.Activation.ServiceHostFactory.CreateServiceHost(Type serviceType, Uri[] baseAddresses)
at System.ServiceModel.Activation.ServiceHostFactory.CreateServiceHost(String constructorString, Uri[] baseAddresses)
at System.ServiceModel.ServiceHostingEnvironment.HostingManager.CreateService(String normalizedVirtualPath)
at System.ServiceModel.ServiceHostingEnvironment.HostingManager.ActivateService(String normalizedVirtualPath)
at System.ServiceModel.ServiceHostingEnvironment.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath)
--- End of inner exception stack trace ---
at System.ServiceModel.ServiceHostingEnvironment.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath)
at System.ServiceModel.ServiceHostingEnvironment.EnsureServiceAvailableFast(String relativeVirtualPath)
Process Name: w3wp
Process ID: 6088
Сообщение как бы намекает, что попытка обратиться по HTTP была неудачна. Конечно неудачна, я же удалил все HTTP привязки :). Всё что нужно сделать, — это подправить файл web.config. Для этого открываем в блокноте (с повышенными правами) файл «C:\inetpub\wwwroot\System Center Service Manager Portal\ServiceHost\web.config» (такой путь по-умолчанию) и меняем внутри тега services:
<service … behaviorConfiguration="DefaultHttpServiceBehavior">
на
<service … behaviorConfiguration="DefaultHttpsServiceBehavior">
и
<endpoint … bindingConfiguration="DefaultHttpBinding">
на
<endpoint … bindingConfiguration="DefaultHttpsBinding">
В итоге должно получиться следующее
<services>
<!--Data Access service-->
<service name="Microsoft.EnterpriseManagement.Presentation.DataAccess.Server.DataAccessService" behaviorConfiguration="DefaultHttpsServiceBehavior">
<!--Note:Recommended bindingConfiguration is DefaultHttpsBinding for production environment.
If bindingConfiguration=DefaultHttpsBinding then behaviorConfiguration should be DefaultHttpsServiceBehavior-->
<endpoint address="" binding="customBinding" contract="Microsoft.EnterpriseManagement.Presentation.DataAccess.Server.IDataAccessService" bindingConfiguration="DefaultHttpsBinding">
</endpoint>
</service>
</services>
ВСЁ. После этого танца с бубнами портал поднялся, квест был закончен!