Инструкция microsoft по развёртке веб-аппсов(приложений SharePoint): Configure an environment for apps for SharePoint (SharePoint 2013)

Задача:
Win 2012, Sharepoint Server 2013 (15.0.4420.1017)

Site Contents-> "Add an app"-> Sharepoint Store-> выкачивание приложения. Оно закачивается, появляется на стратовой странице помеченное зелёненькой "New", но при переходе  на неё, либо при попытке добавить на страницу в режиме редактирования — просит пароль, а потом выдаёт ошибку авторизации:

Enter username and password for http://apps-*******.myserverapps.comhttp://apps-caec2776378820.myserverapps.com

То же самое повторяется на нескольких других машинах.

Решение:
Выполнить "disable loopback" в консоли Sharepoint PS:

image

New-ItemProperty HKLM:\System\CurrentControlSet\Control\Lsa -Name "DisableLoopbackCheck" -value "1" -PropertyType dword

upd: Также может возникнуть ошибка обращения к веб-аппсу при включенном анонимном доступе. Тогда понадобиться выполнить ещё одну команду на powershell.

Пример ошибки:
Request failed. Error code: 500 Internal Server Error
Error text: {"error":{"code":"-2147024846, Microsoft.SharePoint.Client.ApiBlockedException","message":{"lang":"en-US","value":"The method \"GetItems\" of the type \"List\" with id \"{d89f0b18-614e-4b4a-bac0-fd6142b55448}\" is blocked by the administrator on the server."}}}

Решение:
$wa = Get-SPWebApplication -Identity "http://server"
$wa.ClientCallableSettings.AnonymousRestrictedTypes.Remove([Microsoft.SharePoint.SPList], "GetItems")
$wa.Update()

Это удаляет функцию GetItems из запрещённых для анонимных юзеров. Для возвращения функции в список – используется тот же тот же скрипт на powershell, но нужно заменить .Remove на .Add

Реклама

В случае если снепшотов у виртуальной машины на удалённом сервере слишком много, как например тут:

clip_image002

а доступа к консоли mmc нет, то можно воспользоваться библиотекой powershell для работы с виртуальными машинами Hyper-V. Ссылка на скачивание:

https://pshyperv.codeplex.com/

Чтобы избежать ошибок при инсталляции перед распаковкой необходимо щёлкнуть правой кнопкой и сделать файлу “Unblock”:

clip_image003

Также в моём случае понадобилось подправить две записи в файле menu.ps1, как указано. Возможно, в нормальной ситуации это не понадобится.

Далее можно удалить дерево снепшотов с удалённого сервера например таким скриптом RemoveSnapshotVM.ps1 (конечно у пользователя должны быть соответствующие права):

# HyperV.psd1

if (!(Get-Module -Name hyperv))

{

import-module hyperv

}

Set-ExecutionPolicy "RemoteSigned" -Scope Process -Confirm:$false

Set-ExecutionPolicy "RemoteSigned" -Scope CurrentUser -Confirm:$false

# Set-ExecutionPolicy unrestricted -force

Get-Vmsnapshot -VM VMname -Server Servername -Root | remove-vmsnapshot -tree

clip_image005

После этого количество снепшотов на сервере начнёт уменьшаться:

clip_image006

и затем они полностью удалятся:

clip_image007

Само собой для полного их удаления машины всё ещё нужно перевести в “Save State” либо выключить.

Problem:

2014-02-27_162938

Try to upgrade “manually” with psconfig:

C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\BIN>psconfig  -cmd upgrade -inplace b2b -force -cmd applicationcontent -install -cmd installfeatures

 

Error:

Performing configuration task 5 of 6
Upgrading SharePoint Products…

10.00%Failed to upgrade SharePoint Products.

An exception of type Microsoft.SharePoint.PostSetupConfiguration.PostSetupConfig
urationTaskException was thrown.  Additional exception information: The upgrade
command is invalid or a failure has been encountered.
Failed to upgrade SharePoint Products.

Solution:

When running

Performing configuration task 5 of 6..

Run this command from parallel cmd console:

net start SPTraceV4 & net start SPWriterV4 & net start SPAdminV4 & net start SPTimerV4 & net start OSearch14 & net start SPSearch4

Special Thanks to streamo

Если Excel Services позволяли открывать Excel файлы на просмотр, то для полноценного онлайн-редактирования нужен Office Web Apps

Собственно установка описана здесь, автор Steve Mann. В моём случае понадобилось дополнительно включить asp.net, в консоли cmd или ps это делается через команду

C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe –i

 

image

Ну и если машины не пингуются — выключаем файрволлы

netsh advfirewall set allprofiles state off

Также если вам нужен доступ извне, то разворачивайте ферму сразу на два адреса, например:

New-OfficeWebAppsFarm –InternalURL http://apps –ExternalURL http://apps.server.com –AllowHttp -EditingEnabled

Office Web Apps Server  — позволяет просматривать и редактировать документы в браузере, причём не только в IE. В 2013 версии ставится на отдельную машину.

При клике на документ он открывается в браузере. При первой загрузке появится заставка, возможно придётся немного подождать. После загрузки браузере откроется документ Office. Чтобы перейти в режим редактирования можно нажать кнопку Edit document-> “Edit in Web App” в левом верхнем углу:

image

Либо можно сразу открыть документ на редактирование, нажав на три точки(появится предпросмотр документа), и затем “Edit”:

image

Откроется документ и появится риббон(полоска  сверху) с инструментами для редактирования:

image

Возможность работы в клиентских приложениях офиса также остаётся, для этого нужно выбрать в левом верхнем выпадающем меню к примеру “Edit in Word”. Либо если уже в режиме онлайн-редактирования, то “Open in Word на верхней полоске:

image

Также доступен быстрый онлайн-просмотр в браузере, чтобы в него попасть нужно выбрать три точки и значок на рисунке ниже:

image

В интернетах есть несколько вариантов как к примеру обновить элемент без старта привязанных к нему событий, но они либо не очень работают, либо работают в определённых контекстах. Вот ниже способ, который работает при обращении к элементам даже из консольного приложения.

Это extension-класс для SPListItem. Основа это пост на stackoverflow , я лишь добавил от себя ещё пару функций для работы с файлами — добавление файла и функцию CopyTo, для «тихого» копирования файла.

using Microsoft.SharePoint;

public static class SPListItemExtensions
{
    /// <summary>
    /// Provides ability to update list item without firing event receiver.
    /// </summary>
    /// <param name="item">list item</param>
    /// <param name="doNotFireEvents">Disables firing event receiver while updating item.</param>
    public static void Update(this SPListItem item, bool doNotFireEvents)
    {
        SPItemEventReceiverHandling rh = new SPItemEventReceiverHandling();
        if (doNotFireEvents)
        {
            try
            {
                rh.DisableEventFiring();
                item.Update();
            }
            finally
            {
                rh.EnableEventFiring();
            }
        }
        else
        {
            item.Update();
        }
    }

    /// <summary>
    /// Provides ability to update list item without firing event receiver.
    /// </summary>
    public static void SystemUpdate(this SPListItem item, bool incrementListItemVersion, bool doNotFireEvents)
    {
        SPItemEventReceiverHandling rh = new SPItemEventReceiverHandling();
        if (doNotFireEvents)
        {
            try
            {
                rh.DisableEventFiring();
                item.SystemUpdate(incrementListItemVersion);
            }
            finally
            {
                rh.EnableEventFiring();
            }
        }
        else
        {
            item.SystemUpdate(incrementListItemVersion);
        }
    }

    /// <summary>
    /// Provides ability to copy file from list item without firing event receiver.
    /// </summary>
    public static void CopyTo(this SPFile file, string strNewUrl, bool bOverWrite, bool doNotFireEvents)
    {
        SPItemEventReceiverHandling rh = new SPItemEventReceiverHandling();
        if (doNotFireEvents)
        {
            try
            {
                rh.DisableEventFiring();
                file.CopyTo(strNewUrl, bOverWrite);
            }
            finally
            {
                rh.EnableEventFiring();
            }
        }
        else
        {
            file.CopyTo(strNewUrl, bOverWrite);
        }
    }


    /// <summary>
    /// Provides ability to update list item without firing event receiver.
    /// </summary>
    public static void SystemUpdate(this SPListItem item, bool doNotFireEvents)
    {
        SPItemEventReceiverHandling rh = new SPItemEventReceiverHandling();
        if (doNotFireEvents)
        {
            try
            {
                rh.DisableEventFiring();
                item.SystemUpdate();
            }
            finally
            {
                rh.EnableEventFiring();
            }
        }
        else
        {
            item.SystemUpdate();
        }
    }

    /// <summary>
    /// Provides ability to add file to sharepoint library without firing event receiver.
    /// </summary>
    public static SPFile AddFile(SPFileCollection spFileCollection, string destPathToFile, byte[] binFileData, bool overwrite, bool doNotFireEvents)
    {
        SPItemEventReceiverHandling rh = new SPItemEventReceiverHandling();
        if (doNotFireEvents)
        {
            try
            {
                rh.DisableEventFiring();
                SPFile addedFile = spFileCollection.Add(destPathToFile, binFileData, overwrite);
                return addedFile;
            }
            finally
            {
                rh.EnableEventFiring();
            }
        }
        else
        {
            SPFile addedFile = spFileCollection.Add(destPathToFile, binFileData, overwrite);
            return addedFile;
        }
    }

    private class SPItemEventReceiverHandling : SPItemEventReceiver
    {
        public SPItemEventReceiverHandling() { }

        new public void DisableEventFiring()
        {
#pragma warning disable 612,618
            base.DisableEventFiring();
#pragma warning restore 612,618
        }

        new public void EnableEventFiring()
        {
#pragma warning disable 612,618
            base.EnableEventFiring();
#pragma warning restore 612,618
        }
    }
}

Установка Sharepoint 2010 на Win2012 не заявлена и её поддержка обещана с SP2, которого на момент написания ещё нет.

Но поставить всё же можно, я использовал эту статью с technet-а(статья для Win 8 Beta, но способ сработал и для Win 2012).

Также там содержится ссылка на полезный ps скрипт, который автоматизирует установку и настройку предварительного софта:

clip_image001

В конце используется приложение другого французского программиста. Любопытно что для обхода проверок инсталлятора он создал аппликейшн, который надо бросить в system32 вместо оригинального ServerManagerCmd.exe. Он подменяет код возврата и установка производится на ура:

  1. namespace Hand.ServerManagerCmdEmul
  2. {
  3.   class Program
  4.   {
  5.     static void Main(string[] args)
  6.     {
  7.       System.Environment.ExitCode = 1003;
  8.     }
  9.   }
  10. }

* This source code was highlighted with Source Code Highlighter.

Если при операции Mount-SPContentDatabase возникает ошибка

100%

Mount-SPContentDatabase completed with errors

clip_image002

а в логе апгрейда(в папке C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\LOGS\) содержится нечто вроде

Exception: The CREATE UNIQUE INDEX statement terminated because a duplicate key was found for the object name ‘dbo.AllDocStreams’ and the index name ‘AllDocStreams_CI’. The duplicate key value is (71d46679-4432-4fbf-b6c3-2988c42d2858, c6398b61-8d07-4b04-978b-23dff256e6ac, 34).

то нобходимо подключиться к базе через SSMS, открыть нужную таблицу и удалить дублирующиеся записи. Применительно к вышеприведенному случаю нужно составить простой запрос, где значения в скобках будут соответсвовать SiteId, Id и InternalVersion соответственно:

select * from dbo.AllDocStreams  where Id='c6398b61-8d07-4b04-978b-23dff256e6ac'  and InternalVersion='34' * This source code was highlighted with Source Code Highlighter.

 

clip_image004

Как видно, запрос вернул 15 записей. В моём случае я просто удалил их все из базы

delete from dbo.AllDocStreams  where Id='c6398b61-8d07-4b04-978b-23dff256e6ac'  and SiteId='71d46679-4432-4fbf-b6c3-2988c42d2858'  and InternalVersion='34' * This source code was highlighted with Source Code Highlighter.

 

Так как по логу видно, что операция падает на этапе апгрейда, после удаления нужно запустить апгрейд еще раз:

"C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\BIN\PSCONFIG.EXE" -cmd upgrade -inplace b2b -force -cmd applicationcontent -install -cmd installfeatures

После этого апгрейд до 2010 версии в моем случае завершился успешно.

p.s.: также нужно позабититься о наличии места на диске, как минимум в два раза больше чем размер базы. Это связано с тем, что при апгрейде все данные файлов вместе с версиями перемещаются из AlldocVerions в AllDocStreams, подробнее тут

Несколько недель при попытке входа на форум WSS и Sharepoint Portal http://www.gotdotnet.ru/forums/5/ , выдается сообщение что логин неверен, также не работает авторизация по liveid.

вот тут человек описал метод авторизации на форуме

http://www.gotdotnet.ru/blogs/ordos/12745/

необходимо в Developer Additions или аналогичном инструменте разработчика в браузере заменить https://gotdotnet.ru/login на http://gotdotnet.ru/login и авторизация проходит

 

Solution: move code from webpart constructor to OnInit method of the Page.

Симптом: вы получаете такое сообщение при добавлении вебпарты на страницу на целевом сервере, причем на developer-машине все может работать.

При просмотре логов IIS  например через ULSViewer вы находите исключение и ничего подробнее

Error importing WebPart. Assembly  ***, Version=1.0.0.0, Culture=neutral, PublicKeyToken=***,

TypeName. ***.***

Обычно в интернете в таких случаях советуют изменить уровень безопасности в web.config, указать полное описание сборки в *.webpart описании вашей вебчасти или проверить нет ли read-only файлов в проекте.

Возможное решение:

В моем случае решение было найдено в одном из комментариев на stackoverflow. Причина может быть в конструкторе вашей вебчасти. В моем случае конструктор вебчасти получал SPContext:

  1.     public MyWebpart()
  2.     {
  3.       this.ExportMode = WebPartExportMode.All;
  4.       // получаем контекст
  5.       web = SPContext.Current.Web;
  6.     }

 

* This source code was highlighted with Source Code Highlighter.

 

При добавлении вебчасти WebPartImporter вызывает конструктор вебчасти и по какой-то причине не отрабатывает правильно. После переноса кода из конструктора в метод OnInit вебчасть стала добавляться.