domingo, 25 de mayo de 2014

Sharepoint 2010–Se rompe (crash) cuando paso el mouse sobre el nombre de usuario

Después que actualicé a Office 2013, me empezó a salir un error al pasar el mouse sobre el icono de presencia del username (icono de Lync) que genera que el navegador haga un crash (Internet explorer has stopped working. A problem caused the program to stop working correctly. Windows will close the program and notify you if a solution is available.)

Cuando el IE hace un crash, casi siempre se debe a algún plugin o add-on que genera este problema. Investigando, me di cuenta que el add-on (o dll) que generaba este error era

NameCtrl Class

Esta dll es un control que permite que las páginas muestren la presencia de información de las personas. Revisando la versión, me di cuenta que es la versión 14.x.xxxx…… (estaba en el path de instalación de Office), pero esperen….. yo tengo la versión Office 2013 (versión 15),

image

image

Claramente era un problema de incompatibilidad de versión.

Para solucionarlo, hice lo siguiente.

  • deshabilite el add-on del IE
  • Ejecute la herramienta de reparación del office 2013.

 

Y después de reparar office 2013, verifico que se haya habilitado el add-on en el IE, en caso contrario lo activo.  Cada vez que  bajen updates de Windows, revisen este add-on, ya que algunos updates generan estos tipos de problemas, al ejecutar reparaciones automáticas.

Client Object–Silverlight

En una aplicación Silverlight que utilizaba client object para un evento en un calendario de Sharepoint, me lanzaba el error “Security Error”

image

Revisando los logs de network con IE, me di cuenta que me había olvidado de agregar el archivo clientaccesspolicy.xml en el root principal del web application

Recuerden que Silverlight tiene un mecanismo de seguridad para realizar llamadas externas a otros dominios de http y políticas de acceso. Para ello se usa el archivo "clientaccesspolicy.xml", el cual permite especificar reglas de acceso para HTTP/HTTPS y dominios permitidos.

Para ello ingreso al IIS, y selecciono el web application a donde quiere acceder la aplicación silverlight, y presiono Explore.

A continuación dejo el archivo clientaccesspolicy.xml.

<?xml version="1.0" encoding="utf-8" ?>
<access-policy>
    <cross-domain-access>
        <policy>         
          <allow-from http-request-headers="*">
            <domain uri="*"/>
          </allow-from>        
            <grant-to>
                <resource include-subpaths="true" path="/"/>
            </grant-to>
        </policy>
    </cross-domain-access>
</access-policy>

sábado, 19 de abril de 2014

Permiso: Replicate Directory Changes

Cuando realizamos una sincronización de perfiles de usuario del AD a Sharepoint, la cuenta de usuario que realiza la importación debe tener el permiso Replicate Directory Changes sobre el dominio sobre el cual queremos realizar la sincronización.

NetBiosDomainNamesEnabled

Para hacerlo podemos seguir el siguiente artículo:http://technet.microsoft.com/en-us/library/hh296982(v=office.15).aspx#RDCdomain

Este permiso permite que una cuenta consulte por cambios en el directorio.

Hay un caso especial donde se requerirá un permiso especial para poder importar correctamente la información. Veamos los dos casos posibles:

  1. El nombre NETBIOS de cualquier dominio con el que está realizando la sincronización es IGUAL a su nombre de dominio completo (FQDN)
  2. El el nombre NETBIOS de cualquier dominio con el que está realizando la sincronización es DIFERENTE de su nombre de dominio completo (FQDN)

Cómo podemos saber el NETBIOS de nuestro dominio? Una posibilidad es usar “Active Directory Users and Computers”, click derecho sobre el dominio y “Properties”.

También podems averiguarlo mediante nbtstat –n

Para el caso 1, necesitaremos el permiso Replicate Directory Changes sobre el dominio sobre el cual queremos realizar la sincronización.

Para el caso 2, necesitaremos un permiso especial más, además del seteado en el caso 1.

Por ej: suponemos que nuestro dominio sea

Domain netbios name: CONTOSO

FQDN of Domain: contoso.corp.com

El permisos que necesitaremos es el de Replicate Directory Changes sobre el container (CN) de configuration de nuestro dominio.(Procedimiento)

CN=Configuration, DC=corp,DC=com

clip_image007

En el segundo caso también deberemos setear la propiedad NetBiosDomainNamesEnabled en el User Profile de nuestra granja.

Ej:

  • Get-SPServiceApplication
    • Obtendremos el GUID del User Profile Service Application
  • $var = Get-SPServiceApplication –Identity GUID
    • El GUID es el obtenido del paso anterior Get-SPServiceApplication
  • $var.NetBiosDomainNamesEnabled = 1
    • En vez de 1 también podremos usar “True”
  • $var.update()
  • $var.NetBiosDomainNamesEnabled
    • Verifico si quedo correctamente seteado
  • Realizar un IISreset

Errores al abrir un archivo de office desde Sharepoint

Si al abrir un archivo office (de cualquier tipo de la suite) nos lanza alguno de los siguientes mensajes:

“The file is being downloaded instead of opening directly from SharePoint”

" 'Edit Document' requires a Windows SharePoint Services-compatible application.”

"The document could not be opened for editing. A Microsoft SharePoint Foundation compatible application could not be found to edit the document."

“To open this workbook, your computer must be running a supported version of Microsoft Office_application and a browser that supports opening files directly from the Office Web Apps”

Esto se debe a que se tiene más de una versión de Office instalada en la máquina. Podemos verificarlo revisando las versiones del add-on SharePoint OpenDocuments Class en el IE (Tools > Manage Add-ons).

image

Siempre debo tener un sólo add-on registrado (OWSSUPP.DLL), para ello debe remover la feature “Microsoft SharePoint Foundation Support” de la versión incorrecta.

image

A continuación debo reparar la versión de Office correcta, y reiniciar el sistema.

jueves, 17 de abril de 2014

Ocultar Site Assets del browser en Sharepoint 2013

Un usuario me pidió ocultar la librería Site Assets del acceso de usuarios.

image

Podemos ocultar la librería de dos maneras:

  • Vía powershell

$webSite = Get-SPWeb $WebUrl
$list = $webSite.Lists[$ListName]
$list.Hidden = $true
$list.Update()
$webSite.Dispose()

  • Vía Sharepoint Designer, seleccionando “Hide from browser”

image

No veo más la librería en el navegador

image

En el navegador podremos ingresar vía la url

/SiteAssets/Forms/AllItems.aspx

Configurar Feed RSS de una lista – Sharepoint 2013

Ingresar a Site Settings > Site Administration > RSS

image

verifica que esté marcado “Allow RSS feeds in this site collection” y “Allow RSS feeds in this site”

image

A continuación ingresa a List Settings / RSS settings

image

Configura el título, la imagen, las columnas que deseas mostrar y la cantidad de items a mostrar.

image

image

image

En el caso que necesitemos más fuentes RSS (Ej: otras columnas) podemos crear una vista, y a continuación editarla, cuando se edita se muestra el ícono de RSS.

image

Qué pasa si no somos administradores del site collection o no somos owners para cambiar la configuración de la lista,.

image

Podemos obtener el feed mediante la siguiente manera:

Ingresa a la configuración de la lista, y copiar la url, ej:http://urlwebsit/_layouts/15/listedit.aspx?List={8F11E429-E4D1-4459-A6CA-D3E942D70859}

Reemplazar el texto “listedit” por “listfeed”
http://urlwebsite/_layouts/listfeed.aspx?List={8F11E429%2DE4D1%2D4459%2DA6CA%2DD3E942D70859}

image

Al crear una tarea me lanza el siguiente mensaje “The content of this item will be sent as an e-mail message to the person or group assigned to the item.”

image

Este mensaje se debe a que está seteado la opción  “List Settings > Advanced Settings > Send e-mail when ownership is assigned? (Yes/No)”

image

También se puede deshabilitar por powershell

Add-PSSnapin Microsoft.SharePoint.Powershell 
$web = Get-SPWeb "http://urlWebSite"
$list = $web.Lists.TryGetList("Tasks") 
$list.EnableAssignToEmail = $false
$list.Update()

Deshabilitar el throttling para una lista o librería en particular

Suele pasar que tenemos que deshabilitar el throttle para una lista, pero no queremos deshabilitarlo para todo el web application, para ello podemos usar el siguiente comando:

$Site  =  Get-SPWeb -Identity <SiteURL>
$List  =  $Site.Lists["NombreLista"]
$List.EnableThrottling =  $false
$List.Update()
$List.IsThrottled

Agregar código html en columnas autocalculadas (Sharepoint 2010/2013)

Creo una columna autocalculada

image

Fórmula:

="<DIV style='background-color:red'>"&Title&"</DIV>"

Seteo que el tipo sea “Number”

image

Y ya tendremos nuestro html en las columnas.

image

IMPORTANTE: siempre usa el tipo de columna “Number” (currency también funciona), en caso contrario no te funcionará.

 

Columna calculada con el ID del item (Calculated column with ID of item)

Un pedido muy común es utilizar el ID del item en la fórmula de una columna calculada. Se puede utilizar entonces el ID? Si se puede utilizar (no soportado por MS) pero puede tener un comportamiento extraño su uso. Veamos un ejemplo.

image

Creo un item

image

Y veo que el ID no se concateno.

image

Ahora vamos de nuevo a la edición de la fórmula, no edito nada, sólo presiono OK y veamos los resultados.

image

Ahora el ID se concateno.

image

Que pasa si ahora edito el item?

image

image

El ID desapareció.

image

RESUMEN:

  • Sólo se concatena el ID cuando creo la columna autocalculada o la edito.
  • Se borra el ID cuando creo items o los edito
  • NO se debe usar la columna ID en una columna autocalculada

Que podemos utilizar para utilizar el ID en una columna (ya no puede ser de tipo autocalculada, debe ser de tipo “Single line of text”):

  • Workflows: es más fácil de implementar
  • Event handlers (ItemUpdating, ItemAdding): es más complejo de implementar
  • Client Object (set_item): dificultad media
  • Infopath (sigue vivito y coleando después de las últimas novedades de MS sobre infopath): también es fácil de implementar

Les explico un poco como se puede hacer con Sharepoint Designer.

Creamos de nuevo la columna pero de tipo Single line of text

image

Voy a Sharepoint Designer y creo un workflow

image

Elijo “Actualizar elemento de lista”

image

image

image

image

image

Selecciono que se dispare cuando se cree el workflow

image

y lo publico.

Agrego un item para probarlo.

image

Espero unos segundos una vez cargado,y actualizo la página.

image

Quedo el ID correctamente seteado.

Ahora queremos ocultar el campo I_Autocalculate del form de carga, porque al hacer autocalculado no debería estar.

Voy a la configuración avanzada de la lista, y marco “Allow Management of content types”

image

Selecciono el content type “Item”, y a continuación selecciono la columna “ID_Autocalculate”

image

Seteo la opción “Hidden”

image

Ahora cuando voy a agregar el item, ya no veo el campo

image

image

domingo, 30 de marzo de 2014

Obtener todos los sites collections de un web application mediante PowerShell

Get-SPWebApplication http://webapplicationURL  | Get-SPSite -Limit All | Get-SPWeb -Limit All | Select Title, URL |  export-csv –notypeinformation c:\temp\sitescollection.csv -encoding "utf8"

sábado, 29 de marzo de 2014

SPServices Error: One or more field types are not installed properly. Go to the list settings page to delete these fields

Cuando utilizo SPServices con la operación GetListItems, el objecto xData.responseXML nos retorna la respuesta con un mensaje dentro que dice: One or more field types are not installed properly. Go to the list settings page to delete these fields

  • Verifica que utilizaste los internal name y NO los display name. En CAML queries y response siempre se utiliza el internal name. Un ejemplo muy común, es renombrar la columna Title, y usamos el display name en el query CAML.

Una manera fácil de saber el internal name, es ingresar a

image

image

image

Recuerda utilizar nombres de columnas sin espacios, o caracteres extraños al crearlas. Después puedes renombrarlas.

Puedes usar el siguiente script para listar todos los internal names de una lista

$web = Get-SPWeb http://sharepointsite
$list = $web.Lists["ListaTotest"]
$list.fields | select Title, InternalName, TypeAsString | sort title | ft -AutoSize

  • Si la anterior solución no sirve, borra la columna y verifica que no haya otra lista o librería que utilice el mismo nombre, y vuelve a crear la columna.
  • Desactivar la features de SharePoint Server Publishing Infrastructure y volver a activarla, tén cuidado que pueden desaparecer elementos (Ej:menúes) al desactivar esta feature.

RefreshSitesInConfigurationDatabase

Este método sincroniza la base de contenido con la base de configuración de la granja con respecto a que sites collection existen en la base de contenido. La base de datos de configuración de la granja de SharePoint contiene una tabla llamada “SiteMap” que contiene la información de todas las colecciones de sitios (site collections) que existen. Esta tabla es utilizada, por ejemplo, a la hora de listar las colecciones de sitios en la Administración Central, al realizar operaciones PowerShell o de API contra un SPSite, o a la hora de acceder al contenido de las colecciones de sitios desde el navegador.

$db = Get-SPDatabase | where {$_.Name -eq "DatabaseName"}
$db.RefreshSitesInConfigurationDatabase()

Para que suele usarse:

  • Cuando se hace un attach de una base de contenidos (Mount-spcontentdatabase), y los sites collection de esa base no aparecen en el central administration
  • Log Shipping (Ej: cree un site collection en PRD, y cuando se haga el log shipping hacia el nodo standby farm, ese site collection no aparecerá en la base de configuración, la cual no está soportada para Log Shipping – Link. Lo cual habrá que actualizar la base de configuración del nodo standby farm para refleje el site collection.)
  • Hice un restore de un site collection, y el mismo no aparece en el central administration
  • Removi un site collection y sigue apareciendo en el central administration
  • Cuando trato de enumerar las features de un site collection o recorro los sites collection de un web application mediante powershell (Get-SPSite).

Ej:

$webapp = Get-SPWebApplication http://webapplication_url
$webapp.QueryFeatures("Site",$true);

domingo, 23 de marzo de 2014

Comparación rápida entre los 3 modelos de desarrollo de soluciones para Sharepoint 2013

Sharepoint 2013 App

Sandboxed Solution

Farm Solution

Donde se ejecuta el código?

Fuera de la granja

Dentro de la granja (SPUC-WorkerProcess.exe)

Dentro de la granja (w3wp.exe)

Escabilidad

Alta (basada en donde se deploya, IIS, Azure Web Site, etc)

Limitada

Dependiente de la granja

Quién puede instalarlas y removerlas?

Site Owners

Administradores del site collection

Administradores de la granja

Soportado en On-Premise?

Si

Si

Si

Soportado en Sharepoint Online?

 

Si (deprecado)

No

Compatible con Azure?

Si

No

No

Requiere una local farm para el desarrollo?

No

Si

Si

Extensión

.app (archivo zip)

.wsp (archivo cab)

.wsp (archivo cab)

Mejores Prácticas SQL Server para Sharepoint 2010/2013 (Best Practices SQL Server for Sharepoint 2010/2013)–Parte 3

Parte 1: Optimización de los servidores de SQL Server

Parte 2: Optimización de la instancia de SQL Server

Parte 3: Mantenimiento de SQL Server (acá estamos)

MANTENIMIENTO DE SQL SERVER

  • Verificar que no haya bases de contenido con tamaño >=200 GB. Se recomienda crear una nueva base de contenido y mover sites collection a esa base (Move-SPSite).
  • Verificar latencia de disco para las bases de datos: utilizar el siguiente ReadAndWriteLatency.

El script nos retornará la latencia de disco (Avg Read Transfer/ms, Avg Write Transfer/ms). Microsoft sugiere los siguientes thresholds:

Database data files:

· Target: <10ms

· Acceptable: 10-20ms

· Unacceptable: >20ms

Database log files:

· Target: <5ms

· Acceptable: 5-15ms

· Unacceptable: >15ms

EXECUTE dbo.DatabaseIntegrityCheck
@Databases = 'USER_DATABASES',
@CheckCommands = 'CHECKDB',
@PhysicalOnly = 'Y'

  • Monitorear semanalmente por Wait Events. Puedes utilizar el siguiente script: WaitStats. Dependiendo de los eventos externos por los cuales SQL espera, se realizará una acción. Ej: agregar más CPU, distribuir los I/O, etc.  Más información

  • Monitorear los growth de la tempDB. Deberían minimizarse al mínimo los growth de la tempDB. El siguiente script nos permite monitorear esos growth, y en el caso que haya muchos, deberíamos iniciar la tempDB con un tamaño mayor y tener tamaños más grande autogrowth: InitialSizeAndGrowth

  • El siguiente script es similar al anterior, pero monitorea las bases de usuario. AutogrowthRecent

Si el script nos retorna que hubo >=7 growth para una base de usuario, significa que no está seteado correctamente el tamaño del autogrow.

Recuerda habilitar el trace en el caso que se haya deshabilitado.

select name, value_in_use

from sys.configurations

where name='default trace enabled'

Si value_in_use no es 1, se deberá habilitar.

sp_configure 'default trace enabled', 1

go

reconfigure with override

go

  • Realizar desfragmentación de indices semalmente. Sharepoint tiene el store proc_UpdateStatistics, que realiza tareas de mantenimiento de indices. El problema de este store es que no se ejecuta para todas las bases de Sharepoint, sólo las de contendio. Se deberá ejecutar el siguiente script para evaluar la fragmentación de los índices:

Fragmentation Index.sql

Columna

Descripcion

avg_fragmentation_in_percent

El porcentaje de fragmentación lógica (páginas fuera de orden en el índice)

fragment_count

El número de fragmentos (páginas de hojas físicamente consecutivas)

avg_fragment_size_in_pages

Número promedio de páginas de un fragmento en un índice

Una vez verificado el estado de los índices, evaluar la siguiente tabla

avg_fragmentation_in_percent value

Sentencia correctiva

> 5% and < = 30%

ALTER INDEX REORGANIZE

> 30 %

ALTER INDEX REBUILD WITH (ONLINE= ON)

Para hacer un rebuild de los índices fragmentados, se deberá ejecutar el siguiente script (se utilizará el script de ola.hallengren.com):

1. Crear el procedimiento de desfragmentación de índices con el siguiente script

MaintenanceSolution.sql

2. Ejecutar el siguiente script

RebuildIndices.sql

El script anterior se puede crear un job para que se ejecute semanalmente (Sunday).

Ejecutar de nuevo el script FragmentationIndex.sql y ejecutar el siguiente script para verificar el estado de las estadísticas:

ReviewStatistics.sql

Si quieres utilizar el store de Sharepoint para desfragmentar los indices, puedes usar el siguiente script:

EXECUTE sp_msforeachdb
'USE [?];
IF DB_NAME() NOT IN(''master'',''msdb'',''tempdb'',''model'')
     begin
          print ''updating statistics in database  ==> '' + db_name()
          if exists (select 1 from sys.objects where name = ''proc_updatestatistics'')
             begin
                  print ''updating statistics via proc_updatestatistics''
                  exec proc_updatestatistics
             end
         else
             begin
                  print ''updating statistics via sp_updatestats''
                  exec sp_updatestats
             end
    end'

Más información en el siguiente link, link2.

  • NUNCA hacer shrinks de datafiles (hay casos especiales, tales como borrado de mucha información, o tamaño excesivo de la base de crawl: link). Se puede hacer shrink de los logs, pero es preferible setear a modo simple las bases y evitar tamaños grandes de logs. En vez de Shrink de logs, se podría crear una buena política de backups y evitar el shrink, ya que al hacer el backup de las bases automaticamente realiza un shrink de los logs.
  • En el caso excesivo de consumo de CPU y RAM en el crawl del Search, se puede utilizar Resource Governor. Link
  • Verifica semanalmente las best practices definidas en el punto 2 de esta serie de post (Ej: auto update statistics=false, autoshrink=false, fill factor=80, etc)
  • Instalar SQL Best Practices Analyser, y verificar mensualmente las mejores práctices (se actualiza de forma continua): http://www.microsoft.com/en-us/download/details.aspx?id=29302 (recuerda, no siempre las mejores prácticas de SQL Server aplican para Sharepoint)
  • Semanalmente desfragmentar los volumenes donde se encuentran los datafiles de SQL Server. Una excelente herramienta para evaluar la fragmentación de los datafiles es contig de SysInternals.contig -a "E:\Data\nombreBaseDatos.mdf". Recuerda de poner la base de datos a offline y ejecutar el proceso de desfragmentación, al finalizar ponla de nuevo en online a la base de datos.
  • Evaluar la base de datos que más memoria consume

MostMemoryXDatabase.sql

  • Monitorear los archivos lógicos (VLF).Lo indicado en tener ente 20 a 100 vlf`s.  Más información en el siguiente link

ListVLFCounts.sql

En el caso que quiera evaluar específicamente la tempdb, puede ejecutar el siguiente comando:

DBCC LOGINFO

Para reducir la cantidad de vlfs, puede consultar los siguientes links:

http://blogs.msdn.com/b/saponsqlserver/archive/2012/02/22/too-many-virtual-log-files-vlfs-can-cause-slow-database-recovery.aspx

  • Monitores útiles:

A continuación una lista de contadores a evaluar:

· Memory – Available MBytes

· Paging File – % Usage

· Physical Disk – Avg. Disk sec/Read

· Physical Disk – Avg. Disk sec/Write

· Physical Disk – Disk Reads/sec

· Physical Disk – Disk Writes/sec

· Processor – % Processor Time

· Processor – % Privileged Time

· Process: IO Read Bytes/sec

· Process: IO Read Bytes/sec

· Process (sqlservr.exe)

· SQLServer: Buffer Manager – Page life expectancy

· SQLServer: Buffer Manager – Lazy writes/sec

· SQLServer: General Statistics – User Connections

· SQLServer: Memory Manager – Memory Grants Pending

· SQLServer: SQL Statistics – Batch Requests/sec

· SQLServer: SQL Statistics – Compilations/sec

· SQLServer: SQL Statistics – Recompilations/sec

· System – Processor Queue Length

  • Instalar SQL Server 2012 Performance Dashboard Reports

Se deberá instalar SQL Server 2012 Performance Dashboard Reports, el cual permite generar reportes de problemas de performance de forma rápida. Algunos reportes incluyen lo siguiente:

· CPU bottlenecks (and what queries are consuming the most CPU)

· IO bottlenecks (and what queries are performing the most IO)

· Index recommendations generated by the query optimizer (missing indexes)

· Blocking

· Latch contention

http://www.microsoft.com/en-us/download/details.aspx?id=29063