sábado, 21 de febrero de 2015

Tips de Troubleshooting para People Picker de Sharepoint

Voy a mostrar algunos tips útiles para verificar el funcionamiento correcto del People Picker de Sharepoint.

Entorno (montado sobre Azure):

  • AD: Windows Server 2012
  • 1 Granja (1 WFE, 1 App Server, 1 SQL Server)
  • Sharepoint 2013 SP 1, CU de febrero 2015

El people picker de Sharepoint es el responsible de consultar el AD en búsqueda de usuarios (accounts) y grupos, se usa para dar permisos a los sitios de Sharepoint.

imageimage

En este link podrás ver todas las configuraciones posibles del People Picker.

En este link y en este podrás ver la secuencia que se realizar cuando haces un “check name” en el people picker. En 50 pasos ves cómo funciona el people picker.

Algunos pasos resumidos:

  • Cuando haces una consulta en el people picker, el WFE consulta via una DNS Query al Global Catalog Service (se llama “LDAP Global Catalog Search Request”)
  • En esta query, se pregunta por usuarios y grupos que tengan un string de búsqueda (wildcard search).
  • Cuando se busca en el AD, se busca por los siguientes atributos

# User objects: 'name', 'displayName', 'cn', 'sn', 'SamAccountName', 'mail', 'proxyAddresses'

# Group objects: 'name', 'displayName', 'cn', or 'SamAccountName' attributes.

Ahora mostremos algunos tips útiles para hacer throu

1-Evaluar la conectividad desde el WFE hacia el Global catalog.

Supongamos que estamos en el dominio “contoso.com”.

image

Supongamos que estamos buscando todas las cuentas que tengan “sp” en el display name o en el atributo “SamAccountName”. Sharepoint cómo les comenté buscará en varios atributos del container de usuarios y grupos de AD (user Objects y groups Objects)

Supongamos que también buscamos por un grupo específico (Ej: que tengan en el display name “Domain”). En amarillo las líneas más importantes.

El siguiente query (descargar) nos permite evaluar la conexión contra nuestro el AD, buscando un usuario y un grupo (usando wildcards). La funcionalidad es parecida a cómo busca Sharepoint.


function SearchUsers($cn) {   
   $strFilter = "(&(objectClass=User)(cn=$cn))" 
   $objDomain =New-Object System.DirectoryServices.DirectoryEntry("LDAP://CONTOSO")
   $ds = New-Object System.DirectoryServices.DirectorySearcher 
   $ds.SearchRoot = $objDomain 
   $ds.PageSize = 1000 
   $ds.PropertiesToLoad.Add("displayName") 
   $ds.PropertiesToLoad.Add("name") 
   $ds.PropertiesToLoad.Add("cn") 
   $ds.PropertiesToLoad.Add("sn") 
   $ds.PropertiesToLoad.Add("SamAccountName") 
   $ds.PropertiesToLoad.Add("mail") 
   $ds.PropertiesToLoad.Add("proxyAddresses") 
   $ds.Filter = $strFilter 
   $ds.SearchScope = "Subtree"   
   Write-Host " >> Buscando usuarios: " $cn 
   $colResults = $ds.Findall()
   foreach ($usrTmp in $colResults)
    {
      Write-Host $usrTmp.Properties["name"]
    }

function SearchGroup($cn) {   
   $strFilter = "(&(objectClass=group)(cn=$cn))" 
   $objDomain =New-Object System.DirectoryServices.DirectoryEntry("LDAP://CONTOSO")
   $ds = New-Object System.DirectoryServices.DirectorySearcher 
   $ds.SearchRoot = $objDomain 
   $ds.PageSize = 1000 
   $ds.PropertiesToLoad.Add("displayName") 
   $ds.PropertiesToLoad.Add("name") 
   $ds.PropertiesToLoad.Add("cn") 
   $ds.PropertiesToLoad.Add("sn") 
   $ds.PropertiesToLoad.Add("SamAccountName") 
   $ds.Filter = $strFilter 
   $ds.SearchScope = "Subtree"    
   Write-Host " >> Buscando grupos: " $cn 
   $colResults = $ds.Findall()
   foreach ($usrTmp in $colResults)
    {
      Write-Host $usrTmp.Properties["name"]
    }
}

$startDTM = (Get-Date)
SearchUsers("*sp*") 
$endDTM = (Get-Date)
"La consulta tardo: $(($endDTM-$startDTM).totalseconds) segundos"

$startDTM = (Get-Date)
 SearchGroup("*domain*") 
$endDTM = (Get-Date)
"La consulta tardo: $(($endDTM-$startDTM).totalseconds) segundos"
 

Cuando lo ejecuto me retorna lo siguiente.

image

image

Es cómo si hubiera hecho esto.

image

image

Este script nos permite evaluar la performance de búsqueda de perfiles y grupos contra nuestro Global Catalog. Cómo pueden ver los tiempos son muy buenos.

2-Evaluar la conectividad mediante Message Analyzer

Ejecuto lo siguiente en la línea de comandos (run as a administrator)

netsh trace start persistent=yes capture=yes tracefile=C:\nettrace-sharepoint.etl

image

Después realizo algunas querys desde el People Picker, ej: sp_

image

Después detengo el trace.

netsh trace stop

image

Abro el Message Analyzer cómo administrador (run as a administrator)

Selecciono New Session / Files

image

Agrego el archivo del trace

image

En la sección de filtros agrego lo siguiente: contains "displayName"

image

En los mensajes veo que las query al AD, en el sumary dice:

Search Operation Search For RootDSE

Cuando entro a un mensaje, por ejemplo 1003

image

Hago click en el atributo LDAP.

En filter dice lo siguiente

(((objectCategory == person) && ((SubstringFilter{Type=anr,SubStrings=[Sp_]}) || (SubstringFilter{Type=SamAccountName,SubStrings=[Sp_]}))) || ((objectCategory == group) && (MatchingRuleAssertion{MatchingRule=1.2.840.113556.1.4.803 (LDAP_MATCHING_RULE_BIT_AND),Type=groupType,MatchValue=2147483648,DnAttributes=False}) && ((SubstringFilter{Type=anr,SubStrings=[Sp_]}) || (SubstringFilter{Type=SamAccountName,SubStrings=[Sp_]}))))

Pero si entro en más detalle, en la parte de Filter, veo que tiene dos contenidos (objectCategory==person y objectCategory==group). Es decir en la misma query, consulta por usuarios y grupos que coincidan con “sp_”

image

Los atributos que cargo en la query son

image

Si filtro solamente el mensaje 1003 vero que el tiempo que tardo en hacer la consulta fue de 0.0024204 ms

image

Y necesitó 4 paquetes para obtener los resultados

image

El AD (10.0.0.4) le retorno 3 paquetes, si ven en el summary, ven que dice LDAP Message, Search Result Entry, MessageID: 43

image

Si ves el field data, podes ver que aparece (SP_farm y SP_setup) lo mismo que buscaste por Sharepoint

image

image

Algunos links útiles:

http://thesharepointfarm.com/2014/01/people-picker-troubleshooting-tips/

domingo, 15 de febrero de 2015

Troubleshooting problemas de performance de SQL Server para Sharepoint–Parte 2

Seguimos con la serie de post sobre la performance de SQL Server para Sharepoint

Parte 1 

En este post estaré hablando sobre VLFs (Virtual Log Files). Los transaction logs de una base de datos están compuestos de uno o más archivos físicos. Por cada base de datos, SQL Server sólo escribe un transactional log físico a la vez.  Internalmente los archivos físicos que SQL Server usa para los Transaction Log son estructurados conocidos cómo Virtual Log Files (VLFs). SQL Server no debe tener un número excesivo de Virtual Log Files (VLFs) denntro de los Transaction Log. 

Algunos problemas de tener un número grande de VLFs:

  • Restore´s o startup´s muy lentos.
  • Insert, delete, updates muy lentos
  • Locking excesivos
  • Puede hacer lento el mirroring en ambiente de alta disponibilidad
  • Backups muy lentos

Se puede ver la cantidad de VLFs para una base, mediante el siguiente comando: DBCC LOGINFO

En general un número excesivo de small´s autogrow generan muchos VLFs.

Para Sharepoint se recomienda tener entre 50 a 100 VLFs por base de datos. Un número chico (ej: 10) NO es recomendado o un número grande (Ej: 1000) tammpoco es recomendado

Bajen el siguiente script para ver la cantidad de VLFs por base de datos.

https://onedrive.live.com/redir?resid=137CB2CC363CB937%211519

image

Cómo podemos reducir los VLFs? Ejecutando el siguiente script

USE <Nombre_BaseDatos> --Setear el nombre de la base antes de ejecutarlo

DECLARE @file_name sysname,
@file_size int,
@file_growth int,
@shrink_command nvarchar(max),
@alter_command nvarchar(max)

SELECT @file_name = name,
@file_size = (size / 128)
FROM sys.database_files
WHERE type_desc = 'log'

SELECT @shrink_command = 'DBCC SHRINKFILE (N''' + @file_name + ''' , 0, TRUNCATEONLY)'
PRINT @shrink_command
EXEC sp_executesql @shrink_command

SELECT @shrink_command = 'DBCC SHRINKFILE (N''' + @file_name + ''' , 0)'
PRINT @shrink_command
EXEC sp_executesql @shrink_command

SELECT @alter_command = 'ALTER DATABASE [' + db_name() + '] MODIFY FILE (NAME = N''' + @file_name + ''', SIZE = ' + CAST(@file_size AS nvarchar) + 'MB)'
PRINT @alter_command
EXEC sp_executesql @alter_command

Ej: cuando lo ejecuté sobre WSS_Content, después los VLFs quedaron así.

image

VLF lecciones aprendidas:

  • Evitar el autogrow automático en el caso que puedas. Pre-sizing tanto los datafiles como los log files
  • Setear autogrow razonables (en el caso que requieras autogrow). El tamaño depende obviamente de tu ambiente. Entre 1GB a 3GB suele ser algo común. Para base de datos con alto crecimiento deberías tener un capacity planning adecuado

image

  • Verificar mensualmente los VLFs y has un regrowing para reducir el número total de VLFs
  • Nunca hagas un shrink de los datos o log files de forma regular. Shrinking debe ser algo extremadamente raro en respuesta de algo específico.

Tema adicional: fragmentación de los datafiles.

Cómo podemos ver la fragmentación de los datafiles? Con el programa Contig de SysInternals.https://technet.microsoft.com/en-us/sysinternals/bb897428

Ej: veamos la fragmentación de la base WSS_Content. Dejamos el .exe en el mismo path del datafile

image

Abrimos una línea de comando con permisos de administrador y ejecutamos lo siguiente.

contig -a WSS_Content.mdf

image

Cómo pueden ver tiene 119 fragmentos, no son muchos (se recomienda desfragmentar cuando se tiene más de 500 fragmentos)

Para desfragmentar hago lo siguiente.

Pongo la base en modo offline

ALTER DATABASE WSS_Content SET OFFLINE
GO

ejecuto lo siguiente

contig WSS_Content.mdf

image

Después ejecuto

ALTER DATABASE WSS_Content SET ONLINE
GO

Claramente tendrás corte de servicio, por eso es muy importante configurar correctamente el growth de los datafiles al crear la base de datos. Si tarda mucho las bases en ponerse offline, lee el siguiente artículo. http://blog.degree.no/2013/03/long-wait-time-when-taking-sql-server-database-offline/

Referencias recomendadas:

https://www.youtube.com/watch?v=lcmYeE-cqQo

http://www.sqlskills.com/blogs/kimberly/post/8-Steps-to-better-Transaction-Log-throughput.aspx

http://www.sqlskills.com/blogs/kimberly/transaction-log-vlfs-too-many-or-too-few/

http://www.mssqltips.com/sqlservertip/3008/solving-sql-server-database-physical-file-fragmentation/

sábado, 7 de febrero de 2015

SPForm (Sharepoint Forms Designer): demo de la solución–Parte 2

En la parte 1, estuve revisando la solución y la funcionalidad básicas que ofrecía. En esta parte estaré viendo algunas funcionalidades más avanzadas.

Voy a agregar un formulario en una página. Primero exporto un formulario

image

Una vez guardado el archivo Document_Edit.xfds

Creo una página

image

Cuando voy a la parte de Insert, veo un nuevo botón, “New Form”

image

Selecciono el archivo Document_Edit.xfds que exporteimage

Una vez guardado, me queda el formulario embebido dentro de la página (Tiró un error de rendering)

image

También se permité editar por formulario

image

También nos permite agregar visibilidad dependiendo de la seguridad a la que pertenece el usuario

image

image

http://spform.com/documentation/groups

http://spform.com/documentation/groups/operators

http://spform.com/documentation/groups/functions

http://spform.com/documentation/groups/values

Ahora voy a agregar algo de javasscript

image

image

image

Ahora seteo el campo fecha con 7 días a partir de hoy

image

image

image

image

Tienes muchisimas más opciones para ver

http://spform.com/documentation/js/manager

http://spform.com/documentation/js/field

Lo malo:

  • Requiere tener Silverligth instalado para poder usar el diseñador.
  • Llamar a web services o servicios REST externos para integrarlo con la solución (ej: en una variable json). Hay que agregar código javascript para realizar esta funcionalidad. De todas maneras es común utilizar SPServices o el REST de Sharepoint para traer los datos.

Lo bueno:

  • Muy fácil de customizar formularios
  • Facilidad de agregar css y javascript
  • Muy user friendly
  • Framework excelente
  • Muy buen soporte
  • Montado sobre jquery
  • Muy performante

Les recomiendo el siguiente blog para ver todas las funcionalidades que ofrece SPForm: http://formsdesigner.blogspot.com.ar/

http://spform.com/documentation

SPForm (Sharepoint Forms Designer): demo de la solución–Parte 1

Con la deprecación de Infopath para Sharepoint (http://blogs.office.com/2014/01/31/update-on-infopath-and-sharepoint-forms/), hay que buscar alternativas. Una de ellas es SPForm: http://spform.com/download

image

Ejecuto el setup como administrador, y con un usuario que sea administrador de la farm

image

image

Selecciono donde instalar la feature

image

image

Verifico que se haya habilitado la feature a a nivel de site collection

image

Ahora en las listas y librerías me aparece un nuevo botón en la ribbon

image

Requiere tener silverlight instalado

image

Arrastro una tabla

image

Arrastro las columnas y agrego dos tabs

image

image

Lo deploy para los tres formularios de la libreria

image

Formulario View Item

image

Formulario Edit Item

image

New Item

image

Ahora volvemos a editar los forms, presiono Buttons

image

Me agrega una sección de botones

image

También puedo agregar Rich Text

image

image

Supongamos que ahora quiero agregar los botones de Save y Close en otra ubicación

image

image

Cuando lo deployo queda así

image

Cuando presionamos “General”, podemos ocultar la ribbon

image

Cuando lo deployas puedes ver como queda

image

No ves la ribbon, y se muestra la toolbar en la parte superior.

Ahora pruebo la funcionalidad de lnk Sketch

image

Cuando lo deployo, me permite agregar una firma electrónica.

image

Ahora pruebo la funcionalidad de Related Items

image

Tengo que editar que lista voy a utilizar para traer los items relacionados, incluso me permite filtrar por vista o por un campo del formulario padre.

image image

Supongamos que tenemos esta lista

image

Agrego una columna “Categoria” en la librería

image

image

Cuando lo deployo, los items relacionados lo veo así

image

Ahora pruebo el control de acordion

image

image

Cada componente tiene bastante propiedades para editar

image

Incluso JSLink, una funcionalidad muy útil para Sharepoint 2013.

Hay propiedades para poner read only un campo, editar su visibilidad, tamaño, estilo de css o class de css, la orientación del control (al lado o debajo del title)

En la segunda parte estaré viendo la parte del framework, y la posibilidad de agregar javascript