Monday, October 5, 2015

SharePoint 2010. При попытке открыть документ на SharePoint 2010 нет кнопки Открыть


Эта ситуация подробно описана в этой статье Missing the open button when opening PDF files from SharePoint 2010.
В кратце, эту проблему можно решить так:
  1. Open Central Administration
  2. Application Management
  3. Manage Web Applications
  4. Select the webapplication to change
  5. Click General Settings in the ribbon
  6. Scroll down to Browser File Handling and select Permissive
  7. Click on the OK button

SharePoint 2010. Как увеличить максимальный объем для шаблона списка, сайта в SharePoint

​При сохранении списка, сайта или библиотеки в SharePoint как шаблона можно увидеть ошибку, что превышен максимальный размер.
Чтобы увеличить максимальный размер для шаблона, выполняем на сервере SharePoint команду:
stsadm -o setproperty -propertyname max-template-document-size -propertyvalue N

где N - размер в байтах.

SharePoint 2010. Если на странице SharePoint 2010 не появляются вертикальные полосы прокрутки

​Вкратце, проблема из-за того, что Microsoft отключает стандартный скроллинг на странице и реализует скроллинг на SharePoint 2010 с помощью своих CSS стилей и JavaScript скриптов. Это сделано для того, чтобы Ribbon bar всегда был сверху при прокрутке страницы.
Из-за этого иногда скроллинг ломается, ели делать свои кастомизации на SharePoint 2010.
Мне помог метод из статьи SharePoint 2010 Scrolling

SharePoint 2010. Clicking the icon in Type column is highlighting the item instead of launching the document

Проблема: при просмотре документов в библиотеке приклике на иконку в колонке Тип (значок связи с документом) документ выделяется, но не открывается.
Решение.
Подробности можно почитать здесь:
Вкратце решение:
  • Создаем текстовый файл с именем fldtypes_docicon.xsl и содержимым:

    <xsl:stylesheet xmlns:x="http://www.w3.org/2001/XMLSchema" xmlns:d="http://schemas.microsoft.com/sharepoint/dsp" version="1.0" exclude-result-prefixes="xsl msxsl ddwrt" xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime" xmlns:asp="http://schemas.microsoft.com/ASPNET/20" xmlns:__designer="http://schemas.microsoft.com/WebParts/v2/DataView/designer" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:SharePoint="Microsoft.SharePoint.WebControls" xmlns:ddwrt2="urn:frontpage:internal" ddwrt:oob="true">
        <xsl:output method="html" indent="no"/>
     
      <xsl:template ddwrt:dvt_mode="body" match ="FieldRef[@Name='DocIcon']" mode="Computed_DocIcon_body">
        <xsl:param name="thisNode" select="."/>
        <xsl:param name="folderUrlAdditionalQueryString" select="''"/>
        <xsl:choose>
          <xsl:when test="$thisNode/@FSObjType='1'">
            <xsl:variable name="alttext">
              <xsl:choose>
                <xsl:when test="starts-with($thisNode/@ContentTypeId, &quot;0x0120D5&quot;)">
                  <xsl:value-of select="$thisNode/../@itemname_documentset"/>: <xsl:value-of select="$thisNode/@FileLeafRef"/>
                </xsl:when>
                <xsl:otherwise>
                  <xsl:value-of select="$thisNode/../@listformtitle_folder"/>: <xsl:value-of select="$thisNode/@FileLeafRef"/>
                </xsl:otherwise>
              </xsl:choose>
            </xsl:variable>
            <xsl:variable name="mapico" select="$thisNode/@HTML_x0020_File_x0020_Type.File_x0020_Type.mapico"/>
            <xsl:variable name="folderIconPath">
              <xsl:call-template name="GetFolderIconSourcePath">
                <xsl:with-param name="thisNode" select="$thisNode"/>
              </xsl:call-template>
            </xsl:variable>
            <!-- This is a folder -->
            <xsl:choose>
              <xsl:when test="$RecursiveView='1'">
                <img border="0" alt="{$alttext}" src="{$folderIconPath}" />
                <xsl:choose>
                  <xsl:when test="$thisNode/@IconOverlay != ''">
                    <img src="/_layouts/images/{$thisNode/@IconOverlay.mapoly}" class="ms-vb-icon-overlay" alt="" title="" />
                  </xsl:when>
                </xsl:choose>
              </xsl:when>
              <xsl:otherwise>
                <xsl:variable name="FolderCTID">
                  <xsl:value-of select="$PagePathFinal" />RootFolder=<xsl:value-of select="$thisNode/@FileRef.urlencode" /><xsl:value-of select="$ShowWebPart"/>&amp;FolderCTID=<xsl:value-of select="$thisNode/@ContentTypeId" />&amp;View=<xsl:value-of select="$View"/><xsl:value-of select="$folderUrlAdditionalQueryString"/>
                </xsl:variable>
                <a href="{$FolderCTID}" onmousedown ="VerifyFolderHref(this, event, '{$thisNode/@File_x0020_Type.url}','{$thisNode/@File_x0020_Type.progid}','{$XmlDefinition/List/@DefaultItemOpen}', '{$thisNode/@HTML_x0020_File_x0020_Type.File_x0020_Type.mapcon}', '{$thisNode/@HTML_x0020_File_x0020_Type}', '{$thisNode/@serverurl.progid}')"
                   onclick="return HandleFolder(this,event,&quot;{$PagePathFinal}RootFolder=&quot; + escapeProperly(&quot;{$thisNode/@FileRef}&quot;) + '{$ShowWebPart}&amp;FolderCTID={$thisNode/@ContentTypeId}&amp;View={$View}{$folderUrlAdditionalQueryString}','TRUE','FALSE','{$thisNode/@File_x0020_Type.url}','{$thisNode/@File_x0020_Type.progid}','{$XmlDefinition/List/@DefaultItemOpen}','{$thisNode/@HTML_x0020_File_x0020_Type.File_x0020_Type.mapcon}','{$thisNode/@HTML_x0020_File_x0020_Type}','{$thisNode/@serverurl.progid}','{$thisNode/@CheckoutUser.id}','{$Userid}','{$XmlDefinition/List/@ForceCheckout}','{$thisNode/@IsCheckedoutToLocal}','{$thisNode/@PermMask}');">
                  <img border="0" alt="{$alttext}" title="{$alttext}" src="{$folderIconPath}" />
                  <xsl:choose>
                    <xsl:when test="$thisNode/@IconOverlay != ''">
                      <img src="/_layouts/images/{$thisNode/@IconOverlay.mapoly}" class="ms-vb-icon-overlay" alt="" title="" />
                    </xsl:when>
                  </xsl:choose>
                </a>
              </xsl:otherwise>
            </xsl:choose>
          </xsl:when>
          <xsl:otherwise>
            <xsl:choose>
              <xsl:when test="$IsDocLib">
                <a onfocus="OnLink(this)" href="{$thisNode/@FileRef}" onmousedown="return VerifyHref(this,event,'{$XmlDefinition/List/@DefaultItemOpen}','{$thisNode/@HTML_x0020_File_x0020_Type.File_x0020_Type.mapcon}','{$thisNode/@serverurl.progid}')"
       onclick="return DispEx(this,event,'TRUE','FALSE','{$thisNode/@File_x0020_Type.url}','{$thisNode/@File_x0020_Type.progid}','{$XmlDefinition/List/@DefaultItemOpen}','{$thisNode/@HTML_x0020_File_x0020_Type.File_x0020_Type.mapcon}','{$thisNode/@HTML_x0020_File_x0020_Type}','{$thisNode/@serverurl.progid}','{$thisNode/@CheckoutUser.id}','{$Userid}','{$XmlDefinition/List/@ForceCheckout}','{$thisNode/@IsCheckedoutToLocal}','{$thisNode/@PermMask}')">
                  <xsl:choose>
                    <xsl:when test="not ($thisNode/@IconOverlay) or $thisNode/@IconOverlay =''">
                        <xsl:choose>
                            <xsl:when test="not ($thisNode/@CheckoutUser.id) or $thisNode/@CheckoutUser.id =''">
                                <img border="0" alt="{$thisNode/@FileLeafRef}" title="{$thisNode/@FileLeafRef}" src="/_layouts/images/{$thisNode/@HTML_x0020_File_x0020_Type.File_x0020_Type.mapico}"/>
                            </xsl:when>
                            <xsl:otherwise>
                                <xsl:variable name="alttext"><xsl:value-of select="$thisNode/@FileLeafRef"/><xsl:text disable-output-escaping="yes" ddwrt:nbsp-preserve="yes">&#10;</xsl:text><xsl:value-of select="$thisNode/../@managecheckedoutfiles_header_checkedoutby"/>: <xsl:value-of select="$thisNode/@CheckoutUser.title"/></xsl:variable>
                                <img border="0" alt="{$alttext}" title="{$alttext}" src="/_layouts/images/{$thisNode/@HTML_x0020_File_x0020_Type.File_x0020_Type.mapico}" />
                                <img src="/_layouts/images/checkoutoverlay.gif" class="ms-vb-icon-overlay" alt="{$alttext}" title="{$alttext}" />                           
                            </xsl:otherwise>
                        </xsl:choose>                 
                    </xsl:when>
                    <xsl:otherwise >
                        <img border="0" alt="{$thisNode/@FileLeafRef}" title="{$thisNode/@FileLeafRef}" src="/_layouts/images/{$thisNode/@IconOverlay.mapico}" />
                      <img src="/_layouts/images/{$thisNode/@IconOverlay.mapoly}" class="ms-vb-icon-overlay" alt="" title="" />
                    </xsl:otherwise>
                  </xsl:choose>
                </a>
              </xsl:when>
              <xsl:otherwise>
                <img border="0" src="/_layouts/images/{$thisNode/@HTML_x0020_File_x0020_Type.File_x0020_Type.mapico}">
                  <xsl:attribute name="alt">
                    <xsl:value-of select="$thisNode/@Title"/>
                  </xsl:attribute>
                  <xsl:attribute name="title">
                    <xsl:value-of select="$thisNode/@Title"/>
                  </xsl:attribute>
                </img>
              </xsl:otherwise>
            </xsl:choose>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:template>
     
    </xsl:stylesheet>
  • Сохранить файл и скопировать его на SharePoint сервер в папку c:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\template\layouts\XSL
  • Выполнить ресет IIS'а командой iisreset

SharePoint 2010. MSIE постоянно спрашивает логин и пароль при заходе на сайт SharePoint 2010

Проблема: при заходе на сайт SharePoint 2010 MSIE постоянно спрашивает логин/пароль. Добавление сайта в список надежных узлов, принудительное добавление сайта в зону "Местная интрасеть", выставление опции "Автоматически входить в сеть с текущим именем пользователя и паролем" не помогает.
Решение:
  • Заходим на сервер SharePoint в оснастку IIS Manager.
  • Там находим нужный SharePoint сайт и заходим в опции Authentication.
  • Кликаем на "Windows Authentication" -> "Advanced Settings..."
  • Включаем опцию "Enable Kernel-mode authentication"
  • Проверяем
Примечание:
Если в SharePoint 2010 Central Administration изменить настроки Authentication Provider'a Defalut, то нужно еще раз зайти в IIS Manager и снова выставить эту опцию.

MS SQL Server. Ошибка OLE DB provider SQLNCLI11 for linked server unable to begin a distributed transaction

Проблема:
Есть два SQL сервера. На одном из них (local) настроен Linked Server на другой сервер (remote). На local сервере создали триггер для таблицы. И в этом триггере есть запрос через Linked Server на remote SQL сервер. При попытке вызова триггера выдается ошибка "The operation could not be performed because OLE DB provider "SQLNCLI11" for linked server "<linked_server>" was unable to begin a distributed transaction."
Решение:
Необходимо на обоих SQL серверах настроить службу Distributed Transaction Coordinator. Инструкция по настройке и рекомендуемые параметры для Windows Server 2008 описаны в статье Microsoft Technet Enable Network DTC Access

MS SQL Server. Настройка Windows аутетификации для linked серверов


  1. Для примера возьмем ситуацию. Есть такая схема: <клиентский ПК> - <SQL Server 1> - <SQL Server 2>
    SQL Server 2 - это linked сервер для SQL Server 1
    Нужно настроить Windows аутентификацию между SQL Server 1 и SQL Server 2.
  2. Обязательные условия:
    • службы SQL Server-а должны быть запущены от имени доменной учетной записи
    • учетные записи, которые будут работать с linked сервером должны быть зарегистрированы на обоих SQL серверах и им должны быть выданы соответствующие права
  3. Тестовая конфигурация выглядит так:
    SQL Server 1: hostname - sqlsrv1.domain.com   service account - domain\srv_sqlsrv1
    SQL Server 2: hostname - sqlsrv2.domain.com   service account - domain\srv_sqlsrv2
  4. Заходим на контролер домена и проверяем есть ли SPN записи для учетных записей srv_sqlsrv1 и srv_sqlsrv2
    setspn -L  domain\srv_sqlsrv1
    setspn -L  domain\srv_sqlsrv2
  5. Должны быть созданы SPN записи для службы MSSQLSvc. Если их нет, создаем для обоих серверов:
    setspn -A MSSQLSvc/sqlsrv1.domain.com domain\srv_sqlsrv1
    setspn -A MSSQLSvc/sqlsrv1.domain.com:1433 domain\srv_sqlsrv1
    setspn -A MSSQLSvc/sqlsrv2.domain.com domain\srv_sqlsrv2
    setspn -A MSSQLSvc/sqlsrv2.domain.com:1433 domain\srv_sqlsrv2
  6. Заходим в консоль Active Directory Users and Computers и находим учетные записи обоих сервров и их сервисных учетных записей. Для них необходимо:
    • проверить, что опция "Account is sensitive and cannot be delegated" на вкладке Account отключена для обоих сервисных учетных записей
    • установить опцию "Trust this user for delegation to any service (Kerberos only)" на вкладке Delegation для сервисных учетных записей
    • установить опцию "Trust this computer for delegation to any service (Kerberos only)" на вкладке Delegation для учетных записей серверов
  7. Теперь можно создавать и настраивать linked сервер.
    • Вариант 1.
      В свойсвах linked сервера на вкладке Security кликаем Add и выбираем логин на SQL сервере, который будет подключаться к удаленному SQL серверу. И устанавливаем птичку Impersonate.
    • Вариант 2.
      В свойсвах linked сервера на вкладке Security внизу выбиравем вариант "Be made using the login's current security context". Теперь все обращения к удаленному SQL серверу будут автоматически выполняться от имени доменного пользователя, который иницировал запрос.