sábado, 13 de septiembre de 2014

ISO8601 en Sharepoint

Sharepoint internalmente almacena las fechas para list items como UTC dates (ISO 8601 DateTime format):

yyyy-MM-ddTHH:mm:ssZ
De esta manera podriamos hacer nuestras consultas CAML:

<Where>
  <Gt>
    <FieldRef Name='Created' />
    <Value Type='DateTime' IncludeTimeValue='TRUE' StorageTZ='TRUE'>
      2014-09-13T13:30:26Z
    </Value>
  </Gt>
</Where>

Cómo podemos convertir las variables de DateTime en este formato?
En Server Object Model podemos usar el método: SPUtility.CreateISO8601DateTimeFromSystemDateTime(date)
En Cliente Object podemos usar el método ToString("yyyy-MM-ddTHH:mm:ssZ")
Por ejemplo: DateTime.Today.ToString("yyyy-MM-ddTHH:mm:ssZ");
En Javascript podemos usar el siguiente método:

var isoDate = function( d ) {
    //defaults to new date
    d = d || new Date();


    function pad( n ) {
        return n < 10 ? '0' + n : n;
    }


    return d.getUTCFullYear() + '-' +
        pad( d.getUTCMonth() +1 ) + '-' +
        pad( d.getUTCDate() ) + 'T' +
        pad( d.getUTCHours() ) +':' +
        pad( d.getUTCMinutes() )+':' +
        pad( d.getUTCSeconds() )+'Z'
    ;
};

Algunas funciones útiles relacionadas al usuario mediante SPServices

Les dejo algunas funciones útiles que uso diaramente de SPServices: http://spservices.codeplex.com/

Obtener el mail del usuario desde la sigla del mismo

function GetMailfromSigla(PPValue)
{
    var mail = "";
    $().SPServices({
         operation: "GetUserInfo",
         userLoginName: PPValue,
         async:false,
         completefunc: function (xData, Status) {
             $(xData.responseXML).find("User").each(function() {
                    mail = $(this).attr("Email");
             });
           }
    });
   
    return mail;
}

La podriamos usar en conjunción con:

var thisUserAccount = $().SPServices.SPGetCurrentUser({
        fieldName: "UserName",
        debug: false
});

Obtener el display name de un usuario mediante un mail

function getNameFromEmail(strEmail) {
    var usuarioValido = "";

    $().SPServices({
        operation: 'GetUserLoginFromEmail',           
        emailXml: "<Users><User Email='" + strEmail + "'/></Users>",
        async: false,
        completefunc: function (xData, Status) {
             $(xData.responseXML).find("User").each(function() {
                 usuarioValido = $(this).attr("DisplayName");                
             });
        }
    });
   
    return usuarioValido;
}

Obtener el Nombre de usuario (login) mediante el mail

function getUserLoginFromEmail(strEmail) {
var usuarioValido = "";

    $().SPServices({
        operation: 'GetUserLoginFromEmail',           
        emailXml: "<Users><User Email='" + strEmail + "'/></Users>",
        async: false,
        completefunc: function (xData, Status) {
             $(xData.responseXML).find("User").each(function() {
                 usuarioValido = $(this).attr("Login");                
             });
        }
    });
   
    return usuarioValido;
}

Probar la performance de nuestro storage mediante SQLIO y powershell

La idea ejecutar un par de pruebas de stress sobre nuestro storage para evaluar la performance del mismo. En Sharepoint el cuello de botella suele ser nuestro SQL Server, mediante este script podremos probar si nuestro storage soporta la carga de IOPS requerida para que Sharepoint funcione correctamente.

Current enviroment:

  • Azure IaaS A6, Datacenter Sur de Brasil
  • Disco C (perpetuo, no se ve afectado por reinicios de la VM)
  • Disco D (temporario, Azure mantiene una partición D para workload temporario, ej: logs de Base de datos)

Primero descargamos el siguiente script y sqlio

http://gallery.technet.microsoft.com/scriptcenter/Storage-IO-Performance-d628bad9

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

Lo dejamos en una carpeta temporal del C, ej. C:\Temp

Editamos el archivo de powershel

image

Y cambiamos los parámetros.

image

Algunas cosas a tener en cuenta:

  • Trata de tener la cantidad de threads menor o igual a la cantidad de vCPU (threads <= vCPU). Yo por ejemplo tenía 8 cores, y le setee 1 a 4 threads.
  • SQL Server en general escribe sequencial, pero la idea es hacer un stress de nuestro storage, así que deja los dos.
  • El tamaño de los bloques de I/O dependerá de si se usa Eager Writes o Lazy Writer, pero has una prueba con los tres valores (8,64 y 256 KB).

Una vez que se ejecuta nos mostrará un archivo html con toda la información (IOPS, latencia, etc)

image

image

Estos datos podemos pasarlo a un excel y ver una comparativa de performance de nuestro storage.

Ej: promedio de IOPS y latencia de todas las combinaciones

image

image

En general Sharepoint requiere que tengamos tiempos de latencia promedio de :

Datafiles: <= 15ms

Logs: <= 5 ms

Obviamente depende del tipo de base que manejemos y del tamaño. Ej: las bases de search son las bases que más IOPS requieren, o bases de datos relacionadas a record center podriamos tener una latencia entre 20ms a 10 ms.

image

Les dejo un link a post que realicé hace un tiempo sobre las mejores prácticas de SQL Server para Sharepoint.

http://todosharepoint.blogspot.com.ar/2014/03/mejores-practicas-sql-server-para.html

Les dejo el link para descargar todos los archivos:

http://1drv.ms/1qMe0fa

 

Algunos links interesantes para entender estos resultados:

http://www.brentozar.com/archive/2008/09/finding-your-san-bottlenecks-with-sqlio/

http://blogs.technet.com/b/josebda/archive/2013/03/28/sqlio-powershell-and-storage-performance-measuring-iops-throughput-and-latency-for-both-local-disks-and-smb-file-shares.aspx

http://blogs.msdn.com/b/sqlmeditation/archive/2013/04/04/choosing-what-sqlio-tests-to-run-and-automating-sqlio-testing-somewhat.aspx

http://blogs.technet.com/b/sqlpfeil/archive/2012/12/04/working-with-sqlio-and-analyzing-it-s-output.aspx

http://technet.microsoft.com/en-us/library/cc966412.aspx

http://technet.microsoft.com/en-us/library/ff758657%28v=office.15%29.aspx

Paginado mediante jslink en Sharepoint 2013 (Paging jslink)

En este ejemplo lo que voy a mostrar es cómo realizar un paginado mediante jslink.

Current enviroment:

  • Enabled Minimal Download Strategy
  • Sharepoint 2013 - 15.0.4551.1511

Tengo la siguiente lista de items y lo que voy a hacer es paginar cada 5 items

image

Creo una página, agrego el web part de la lista y limito la cantidad de items que puedo mostrar.

image

Lo que genera la siguiente vista.

image

Pero que pasa si agregamos código jslink al web part? Por ejemplo el siguiente jslink (no genera override de ninguna funcionalidad)

(function () {

    var itemCtx = {};
    itemCtx.Templates = {};
    itemCtx.BaseViewID = 1;
    itemCtx.ListTemplateType = 100;   
   
    SPClientTemplates.TemplateManager.RegisterTemplateOverrides(itemCtx);

})();

lo subo a http://urldelsite/_catalogs/masterpage/ con el contenttype Javascript Display Template

image

En el web part que había agregado anteriormente, le seteo el archivo jslink.

~sitecollection/_catalogs/masterpage/csrpagging.js

Presten atención al tilde (~)

image`

Vemos que sigue funcionando el pagging.

image

Que pasa si agregamos el siguiente código.

(function () {

    var itemCtx = {};
    itemCtx.Templates = {};

    itemCtx.Templates.Header = "<table>";
   
    itemCtx.BaseViewID = 1;
    itemCtx.ListTemplateType = 100;   
   itemCtx.Templates.Footer = "</table>"

    SPClientTemplates.TemplateManager.RegisterTemplateOverrides(itemCtx);

})();

Como se ve en la siguiente imagen, ya no aparece el header ni el footer del web part.

image

Entonces cómo hacemos para agregar el paginado mediante jslink y darle más funcionalidad al footer.


(function () {

    var itemCtx = {};
    itemCtx.Templates = {};

    itemCtx.Templates.Header = "<table>";
   
    itemCtx.BaseViewID = 1;
    itemCtx.ListTemplateType = 100;   
    itemCtx.Templates.Footer = pagingControl;

    SPClientTemplates.TemplateManager.RegisterTemplateOverrides(itemCtx);

})();

function pagingControl(ctx)
{       
        var footerHtml = '<table class="ms-bottompaging"><tr><td>';
        var next = ctx.ListData.NextHref;  
        var prev = ctx.ListData.PrevHref;
  
        if ((next != undefined) && (prev != undefined ))
        {
            footerHtml += "<a class='ms-commandLink ms-promlink-button ms-promlink-button-enabled' href='javascript:void(0);' onclick=\"RefreshPageTo(event, &quot;" + prev + "&quot;);return false;\"><span class='ms-promlink-button-image'><img class='ms-promlink-button-left' src='/_layouts/15/images/spcommon.png?rev=23'/></span></a>";
            footerHtml += "<a class='ms-commandLink ms-promlink-button ms-promlink-button-enabled' href='javascript:void(0);' onclick=\"RefreshPageTo(event, &quot;" + next + "&quot;);return false;\"><span class='ms-promlink-button-image'><img class='ms-promlink-button-right' src='/_layouts/15/images/spcommon.png?rev=23'/></span></a>";
            footerHtml += "</td></tr></table>";           
            footerHtml += "<HR style='margin-left:-20px' COLOR='green' WIDTH='106%'>";
            return footerHtml;       
        }
        else
        {
            if (next != undefined)
            {
                footerHtml += "<a class='ms-commandLink ms-promlink-button ms-promlink-button-enabled' href='javascript:void(0);' onclick=\"RefreshPageTo(event, &quot;" + next + "&quot;);return false;\"><span class='ms-promlink-button-image'><img class='ms-promlink-button-right' src='/_layouts/15/images/spcommon.png?rev=23'/></span></a>";
                footerHtml += "</td></tr></table>";
                footerHtml += "<HR style='margin-left:-20px' COLOR='green' WIDTH='106%'>";
                return footerHtml;       

            }
            else
            {
                if (prev != undefined)
                {
                    footerHtml += "<a class='ms-commandLink ms-promlink-button ms-promlink-button-enabled' href='javascript:void(0);' onclick=\"RefreshPageTo(event, &quot;" + prev + "&quot;);return false;\"><span class='ms-promlink-button-image'><img class='ms-promlink-button-left' src='/_layouts/15/images/spcommon.png?rev=23'/></span></a>";
                    footerHtml += "</td></tr></table>";
                    footerHtml += "<HR style='margin-left:-20px' COLOR='green' WIDTH='106%'>";
                    return footerHtml;       
                }
                else
                    return "<HR style='margin-left:-20px' COLOR='green' WIDTH='106%'>";
            }       
        }
       
}

image image

image

image

En el caso que quisieramos agregar la información de la cantidad de items, podriamos reemplazar la función pagingControl por la siguiente.


function pagingControl(ctx)
{      
       var firstRow = ctx.ListData.FirstRow;
        var lastRow  = ctx.ListData.LastRow;
        var footerHtml = '<table class="ms-bottompaging"><tr><td>';
        var next = ctx.ListData.NextHref;  
        var prev = ctx.ListData.PrevHref;
  
        if ((next != undefined) && (prev != undefined ))
        {
            footerHtml += "<a class='ms-commandLink ms-promlink-button ms-promlink-button-enabled' href='javascript:void(0);' onclick=\"RefreshPageTo(event, &quot;" + prev + "&quot;);return false;\"><span class='ms-promlink-button-image'><img class='ms-promlink-button-left' src='/_layouts/15/images/spcommon.png?rev=23'/></span></a>";
            footerHtml += "<a class='ms-commandLink ms-promlink-button ms-promlink-button-enabled' href='javascript:void(0);' onclick=\"RefreshPageTo(event, &quot;" + next + "&quot;);return false;\"><span class='ms-promlink-button-image'><img class='ms-promlink-button-right' src='/_layouts/15/images/spcommon.png?rev=23'/></span></a>&nbsp" + firstRow  + " de " +  lastRow;
            footerHtml += "</td></tr></table>";           
            footerHtml += "<HR style='margin-left:-20px' COLOR='green' WIDTH='106%'>";
            return footerHtml;       
        }
        else
        {
            if (next != undefined)
            {
                footerHtml += "<a class='ms-commandLink ms-promlink-button ms-promlink-button-enabled' href='javascript:void(0);' onclick=\"RefreshPageTo(event, &quot;" + next + "&quot;);return false;\"><span class='ms-promlink-button-image'><img class='ms-promlink-button-right' src='/_layouts/15/images/spcommon.png?rev=23'/></span></a>&nbsp" + firstRow  + " de " +  lastRow;
                footerHtml += "</td></tr></table>";
                footerHtml += "<HR style='margin-left:-20px' COLOR='green' WIDTH='106%'>";
                return footerHtml;       

            }
            else
            {
                if (prev != undefined)
                {
                    footerHtml += "<a class='ms-commandLink ms-promlink-button ms-promlink-button-enabled' href='javascript:void(0);' onclick=\"RefreshPageTo(event, &quot;" + prev + "&quot;);return false;\"><span class='ms-promlink-button-image'><img class='ms-promlink-button-left' src='/_layouts/15/images/spcommon.png?rev=23'/></span></a>&nbsp" + firstRow  + " de " +  lastRow;
                    footerHtml += "</td></tr></table>";
                    footerHtml += "<HR style='margin-left:-20px' COLOR='green' WIDTH='106%'>";
                    return footerHtml;       
                }
                else
                    return "<HR style='margin-left:-20px' COLOR='green' WIDTH='106%'>";
            }       
        }
       
}

Lo cual permite mostrar la cantidad de items que se ve en la vista (Ej: 6 de 10)

image

Cómo pueden ver en el código se hace uso de una función llamada RefreshPageTo, que está definida en el archivo INPLVIEW.js,

Ingreso al archivo debug, así es más fácil para ver la función

/_layouts/15/inplview.debug.js

image

Les dejo el código js en el siguiente link: http://1drv.ms/1wjDBN5

Podrán encontrar más post sobre jslink en el siguiente tag: http://todosharepoint.blogspot.com.ar/search/label/JSLink

domingo, 7 de septiembre de 2014

Enviar un mail desde javascript en Sharepoint 2013 on-premise mediante jquery

Sharepoint 2013 tiene una API llamada /_api/SP.Utilities.Utility.SendEmail que permite llamarla desde cualquier aplicativo, ya que es un servicio REST. Ej: desde un workflow en Sharepoint Designer 2013, aplicación web (java/php/etc).

Reemplaza las secciones en rojo. Es importante que el TO tiene que ser un usuario de AD, porque de otra manera fallará el envio. La prueba se realizó sobre un Sharepoint 2013 con el acumulativo de junio.


    var urlTemplate = siteurl + "/_api/SP.Utilities.Utility.SendEmail";
    var siteurl = _spPageContextInfo.webServerRelativeUrl;
    var urlTemplate = siteurl + "/_api/SP.Utilities.Utility.SendEmail";
    $.ajax({
       contentType: 'application/json',
       url: urlTemplate,
       type: "POST",
       data: JSON.stringify({
           'properties': {
               '__metadata': { 'type': 'SP.Utilities.EmailProperties' },
               'From': "mail@mail.com",
               'To': { 'results': ["DOMINIO\\usuarioAD"] },
               'Body': "Acá va el código del body",
               'Subject': "Prueba desde javascript"
           }
       }
     ),
       headers: {
           "Accept": "application/json;odata=verbose",
           "content-type": "application/json;odata=verbose",
           "X-RequestDigest": $("#__REQUESTDIGEST").val()
       },
       success: function (data) {
          alert("Se envió el mail correctamente");
       },
       error: function (err) {
           alert(err.responseText);
           debugger;
       }
    });

Cree una página y agregué un script edito, que linkea a la librería de jquery y agregué el código de arriba. Al publicar la página me aparece lo siguiente.

image

Si reviso mi outlook, veo lo siguiente.

image

image

En el caso que quieras enviar a un grupo, revisa el siguiente KB:

http://support.microsoft.com/kb/2839070/es

Cambiar el formato a dd/mm/yyyy a un campo date time en un formulario de Infopath

image

Con la siguiente fórmula la convierto al formato deseado:

concat(substring(CampoFecha, 9, 2), "-", substring(CampoFecha, 6, 2), "-", substring(CampoFecha, 1, 4))

image

viernes, 5 de septiembre de 2014

“The following url is not valid” al publicar un form realizado con Infopath 2013 sobre Sharepoint 2013

Al tratar de publicar un formulario desde Infopath 2013, me lanzaba el error:

“The following url is not valid: …”

Para solucionarlo tuve que crear un root site collection ( http://url_webapplication/ ) en el web application donde se publicaría el infopath.

sábado, 30 de agosto de 2014

Variable CTX–Sharepoint 2013

La variable ctx es llamada variable de contexto, esta variable no está disponible en cada contexto de Sharepoint, por lo cual ten cuidado donde la usas. Por ejemplo: es muy usada en display templates de Search (link). En las páginas de forms de las listas/librerías (New, Edit y Display forms) y layouts (ej: site settings) NO suele estar definida esta variable. En las home page/wiki pages suele estar disponible. En las vistas de las listas también suele estar disponible.LO cual cómo les decía revisen donde la pueden usar. En el App Model tampoco está disponible obviamente.

Es una propiedad de read-only solamente, es decir sólo puedo leer la información de la misma. Para verla, abrimos la developer tools del IE (F12) y en la consola escribimos ctx

image

image

image

image

Con respecto a las funciones podemos tener las siguientes:

image

Voy a comentar las más importantes propiedades o funciones.

Por ejemplo si yo estoy en una vista de la lista podemos ver las propiedades.

Si en las propiedades avanzadas de la lista, marco/desmarco algunas propiedades, veo las propiedades avanzadas de la variable

image

Variable ContentTypesEnabled –> true

image

image

image

AllowCreateFolder –> undefined

image

image

AllowGridMode  --> false

image

image

EnabledMinorVersions –> true

Si yo selecciono dos items, me aparecerá la información en la propiedad “CurrentSelectItems”

image

También podemos obtener las urls de los forms de new/edit/display

image

image

Podemos ver la cantidad de items de la página de la vista (TotalListItems), el GUID de la View (propiedad view) y el nombre de la vista (ViewTitle). La propiedad verEnabled hace referencia si está habilitado el versionado (1) o no (0).

image

Después tenemos las propiedades listName  (guid de la lista), listTemplate (101 es una librería), listTitle (nombre de la libreria) y listUrlDir (url relativa de la librería)

image

Otra propiedad importante es ListSchema, la cual tiene todo el esquema propio de la libreria:

DefaultItemOpen = 1 –> es cuando seteas Open in the browser en las propiedades avanzadas de la librería

image

Después tenes todas propiedades propias del sitio: HttpRoot, CurrentLanguage, CurrentUICultureName, etc. Otras propiedades importantes son CurrentUserId (es el ID de la User Information List) y CurrentUserIsSiteAdmin.

image

Hay un montón de propiedades más, pero para finalizar voy a hacer uso de la propiedad ListData

image

La cual permite recorrer todas las filas de la view actual, y procesar los campos.

Por ejemplo. ctx.ListData.Row[0]

image

si yo escribo lo siguiente: alert(ctx.ListData.Row[0].FileLeafRef)

image

Una propiedad muy útil es : PermMask, que define que permisos tiene el usuario actual sobre ese item específico (row

image

FullMask = 0x7FFFFFFFFFFFFFFF (Grant all permissions). En este link tienen una lista de mask de permisos.

netsh–Una manera simple de hacer network trace sin instalar nada en nuestros ambientes de Sharepoint

A partir de Windows 7/2008R2 vino una tool llamada netsh para realizar traces de nuestras placas de red (entre otras cosas de este comando).

http://technet.microsoft.com/en-us/library/dd878517%28v=ws.10%29.aspx

Aplica a: Windows Server 2012|2012 R2, Windows 8|8.1, Windows Server 2008R2, Windows 7

Probado sobre: Sharepoint 2013 SP1, CU agosto, Windows Server 2012, Azure VM (A6 instance)

Algunas ventajas de este comando:

  • No instalo nada en mis servers, ya viene incluido dentro de mi SO
  • Permite tracing persistentes, esto es, incluso con reboots, el trace sigue funcionando
  • Nos permite enfocar el trace en un escenario específico (Ej: dns, lan, dhcp, etc)
  • Los paquetes generados del trace (ETL) pueden ser abiertos por Wireshark, Network Monitor o Message Analyzer
  • Podemos ver reportes rápidos del trace (.cab)

Primero vemos que escenarios (conjunto de providers de trace) tenemos:

netsh trace show scenarios

image

Si nos interesa algún escenarios específico, podemos ejecutar

netsh trace show scenario lan

image

Pueden tener más providers con este comando: netsh trace show providers >c:\providers.txt

Revisando este archivo, veo que hay providers de Sharepoint

{0119F589-72D7-4EC3-ADF5-1F082061E832}    Microsoft-SharePoint Products-Web Content Management
{137DEDCF-DAEC-4E65-A6BC-02212AECD32F}    Microsoft-SharePoint Products-Office Automation Services
{1C415899-58B3-4BFC-9236-105E7FD38719}    Microsoft-SharePoint Products-SharePoint Foundation Search
{252BB337-A7F5-413F-9B03-F36FA4F18EF8}    Microsoft-SharePoint Products-Business Connectivity Services
{278E40D0-FDAA-4EB4-AB6B-9E0AD6BDBE79}    Microsoft-SharePoint Products-Excel Services Application
{38BB51E9-CF75-40CA-92CC-49E22F935F65}    Microsoft-SharePoint Products-Visio Graphics Service
{4CB0A010-80C2-4CDF-BB9D-8B7E923FAC8F}    Microsoft-SharePoint Products-Access Services 2010
{4F33CA13-30A4-4AF2-AEB7-DE59AA6C2563}    Microsoft-SharePoint Products-Services Infrastructure
{5311B1CA-DDE7-408B-A097-F7A1BF5BB170}    Microsoft-SharePoint Products-Access Services
{6FB10E7F-F8EF-44A7-9678-25744648F92C}    Microsoft-SharePoint Products-Document Conversions
{6FB7E0CD-52E7-47DD-997A-241563931FC2}    Microsoft-SharePoint Products-SharePoint Foundation
{73541538-24DA-4282-AE1C-3A6321C23FB8}    Microsoft-SharePoint Products-Secure Store Service
{8B3DDD3D-2B09-4669-BF81-E2D6921FEEEA}    Microsoft-SharePoint Products-SharePoint Portal Server
{A3499A35-DB34-421A-94FC-4D76522BEAB3}    Microsoft-SharePoint Products-InfoPath Forms Services
{A7CD5295-CBBA-4DCA-8B67-D5BE061B6FAE}    Microsoft-SharePoint Products-PerformancePoint Service
{B9499A35-DB34-421A-94FC-5A8DBBBC4228}    Microsoft-SharePoint Products-Education
{BAFFAE3D-E80A-4219-B41F-5760B7CEC473}    Microsoft-SharePoint Products-Shared
{C33B4F2A-64E9-4B39-BD72-F0C2F27A619A}    Microsoft-SharePoint Products-SharePoint Server
{C544CCCA-DCAA-416D-B91B-E639B8B28589}    Microsoft-SharePoint Products-Word Automation Services
{C8263AFE-83A5-448C-878C-1E5F5D1C4252}    Microsoft-SharePoint Products-SharePoint Server Search
{C8A9829C-C62B-46CD-AACF-95788DE23730}    Microsoft-SharePoint Products-SharePoint Translation Services
{D191778A-DFE4-11DE-A777-F8AD55D89593}    SharePoint Express
{E0E675CD-EA07-450D-9841-786EAC9A9812}    Microsoft-SharePoint Products-eApproval
{F78D66EC-09A9-42A2-AC7A-5EE2062DE7E4}    Microsoft-SharePoint Products-Document Management Server

Si yo quisiera ver un provider específico, ejecuto lo siguiente:

netsh trace show provider name="Microsoft-SharePoint Products-SharePoint Portal Server"

image

Estos providers nos permite enforcarnos en un trace espcífico, ej: search de Sharepoint

Ej: netsh trace start persistent=yes capture=yes tracefile=c:\temp\nettrace-search.etl" provider="Microsoft-SharePoint Products-SharePoint Server Search"

En este post, no me voy a enfocar en un escenario específico, sólo haré un trace de todo el tráfico del servidor de Sharepoint

Para ello ejecuto el siguiente comando:

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

recuerda revisar que tengas espacio suficiente en el directorio. Por default usará 250 MB.

Acá tenés todos los parámetros del comando: http://technet.microsoft.com/en-us/library/dd878517%28v=ws.10%29.aspx#bkmk_traceStart

http://msdn.microsoft.com/en-us/library/windows/desktop/dd569142%28v=vs.85%29.aspx

Considera en principio los siguientes: level, maxSize

image

image

Ahora navego un poco el sitio de Sharepoint, y después de 10 minutos ejecuto el siguiente comando para detenerlo.

netsh trace stop

image

Veo que se generaron los dos archivos

image

Si yo ingreso al archivo .cab, veo un montón de archivos.

image

Si abro el archivo report.html (selecciona todos los files –> extract), nos muestra un montón de información del trace

image

Si selecciono un item, por ejemplo “DNS Information” veo más info

image

Los que nos importa es ver el archivo .etl con alguna tool de red. Exporta tu archivo .etl a tu máquina, y abre el archivo con Wireshark, Message Analyzer o Network Monitor

Por ejemplo mediante Message Analyzer (Browse)

image

Después selecciono Analysis Grid/Sequence Match

image

Veo el diagnóstico de los paquetes de red

image

Ej: veo 3 segmentos perdidos

Si cambio la vista “Analysis Grid”

image

Veo todos los paquetes del trace

image

Si yo aplico un filtro (tcp.port==80)

image

Si yo le aplico otro filtro (add destination to filter)

image

y aplico el filtro (cambia or por and)

image

Veo lo que me interesaba, filtrar los paquetes relacionados a mi sitio de Sharepoint

image

Cómo pueden ver tengo un montón de paquetes con status 401

image

Si yo me enfoco en un message number (648), veo que hubo dos paquetes en esta operación

image

Message Number 648: mi solicitud al Sharepoint montado sobre Azure

image

Algunos parámetros útiles del message number:

Method: Get

Host: chrissp2013dev.cloudpapp.net

Referer Url y User-Agent

image

Message Number 649: la respuesta del servidor de Sharepoint

image

Algunos parámetros útiles del message number:

StatusCode: 401 (unauthorized)

MicrosoftSharePointTeamServices: 15.0.0.4551 (es la versión de Sharepoint que está corriendo sobre Azure IaaS)

request-id o SPRequestGuid: 9094b39c-ee71-007a-0000-011f7b37ee10 (es el GUID asociado en los ULS logs)

Si yo reviso los logs mediante ULS Viewer, veo la solicutud

image

SPIisLatency: 0 (es el queue time del IIS antes de pasarle la solicitud a Sharepoint)image
SPRequestDuration: 3 (es el tiempo que tardo Sharepoint en procesar la solicitud )

La misma información la pueden procesar con Wireshark o Network Monitor.

Para mayor información sobre netsh, consulta este post, muy buen repaso por todos los componentes del trace: http://chentiangemalc.wordpress.com/2012/02/22/netsh-traceuse-it/