Creación de aplicaciones Windows Phone 7 con

Anuncio
Creación de aplicaciones Windows Phone 7 con
Productos de SharePoint 2010 y Unified Access
Gateway
Este documento se proporciona «tal cual». Es posible que la información y los puntos de vista reflejados en
este documento, incluidas la dirección URL y otras referencias a sitios web de Internet, cambien sin previo
aviso. El usuario asume el riesgo de su uso.
Algunos ejemplos descritos en este documento se proporcionan únicamente con fines ilustrativos y son
ficticios. No se pretende indicar ni debe deducirse ninguna asociación ni conexión real.
Este documento no proporciona ningún derecho legal sobre la propiedad intelectual e industrial de ningún
producto de Microsoft. Este documento puede copiarse y usarse para fines internos y de referencia. Este
documento puede modificarse para fines internos de referencia.
Microsoft, SharePoint , Silverlight, Visual Studio y Windows Phone 7 son marcas registradas o marcas
comerciales de Microsoft Corporation en Estados Unidos y/o en otros países.
© 2011 Microsoft Corporation. Todos los derechos reservados.

Creación de aplicaciones Windows Phone 7 con
Productos de SharePoint 2010 y Unified Access
Gateway
Dave Pae
Microsoft Corporation
Todd Baginski
Aptillon, Inc.
Matthew McDermott
Aptillon, Inc.
Ben Ari
Microsoft Corporation
Marzo de 2011
Se aplica a: Microsoft® SharePoint® Server 2010, Microsoft SharePoint Foundation
2010, Microsoft Forefront Unified Access Gateway, Windows Phone 7™
Resumen:
Estas notas del producto incluyen escenarios empresariales para el desarrollo de aplicaciones
móviles que usan las características de los Productos de SharePoint 2010 para colaboración y se
autentican a través de Microsoft Forefront Unified Access Gateway (UAG). En la parte principal
de estas notas del producto se ofrece una introducción a los conceptos y código necesarios para
acceder a los datos de lista de SharePoint de forma segura desde Windows Phone 7. En el
apéndice se describe de forma detallada el proceso de instalación y configuración de una
instancia de programador de UAG para probar y desarrollar aplicaciones móviles con Productos
de SharePoint 2010.
2
Contenido
Contents ...........................................................................................................................................................3
Overview and Goals ............................................................................................................................................5
Architecture.......................................................................................................................................................6
SharePoint 2010 Products Intranet .................................................................................................................6
UAG ...........................................................................................................................................................6
Intranet Collaboration Scenario ............................................................................................................................6
Business Value of Collaboration .....................................................................................................................7
The Application ............................................................................................................................................7
Security .......................................................................................................................................................... 12
Credential Storage ..................................................................................................................................... 12
Authentication ........................................................................................................................................... 12
SharePoint Services .......................................................................................................................................... 13
Consuming Services ................................................................................................................................... 13
Accessing SharePoint List Data by Using the OData Client Library .................................................................... 13
Activity Feed RSS....................................................................................................................................... 22
User Profile Service - Colleagues .................................................................................................................. 24
User Profile Service - User Profile Data ......................................................................................................... 27
Testing ........................................................................................................................................................... 30
Testing the Application on the Emulator ........................................................................................................ 30
Testing the Application on a Device .............................................................................................................. 30
Marketplace Considerations ............................................................................................................................... 30
Conclusion....................................................................................................................................................... 34
Appendix – Installation and Configuration of UAG for SharePoint 2010 Products ....................................................... 35
1. Create a SharePoint Server Virtual Machine and a UAG Virtual Machine. ........................................................ 35
2. Set Up Hyper-V Host Machine Virtual Networks .......................................................................................... 36
3. Set Up Hyper-V Virtual Machine Networks ................................................................................................. 38
4. Prepare the UAG Server Virtual Machine for UAG Installation ....................................................................... 41
5. Snapshot the UAG Server Virtual Machine ................................................................................................. 42
6. Install the UAG Server ............................................................................................................................ 42
7. Snapshot the UAG Server Virtual Machine ................................................................................................. 48
8. Initial UAG Server Configuration and Activation .......................................................................................... 48
9. Create the HTTP Trunk to Publish the SharePoint Site ................................................................................. 64
10. Create the SharePoint Application ........................................................................................................... 74
11. Configure the SharePoint Application ...................................................................................................... 84
12. Activate the Configuration ..................................................................................................................... 86
13. Configure and Verify SharePoint Alternate Access Mappings ....................................................................... 88
3
14. Add Hosts File Entries to the Development Environment ............................................................................ 88
15. Test the Configuration ........................................................................................................................... 89
16. Test the Newsfeed RSS ......................................................................................................................... 94
Resources ....................................................................................................................................................... 97
Forefront Unified Access Gateway on TechNet................................................................................................ 97
Closer to the Edge Blog .............................................................................................................................. 97
Silverlight Web Services Team Blog .............................................................................................................. 97
About the Authors ............................................................................................................................................ 97
Todd Baginski, MVP .................................................................................................................................... 97
Matthew McDermott, MVP ........................................................................................................................... 97
Ben Ari ..................................................................................................................................................... 98
4
Información general y objetivos
A medida que las organizaciones crecen, cambian e intentan mantenerse al día con la tecnología, es posible
que sus empleados se sientan desconectados de la comunidad corporativa. Los Productos de Microsoft®
SharePoint 2010 son compatibles con muchas características que hacen posible el compromiso y la
colaboración de los empleados, desde listas y bibliotecas que almacenan y administran documentos e
información, a perfiles de usuario centralizados que permiten a los empleados describirse a sí mismos y
describir el rol que desempeñan en la organización, y etiquetas y notas que facilitan la obtención de
información dentro y fuera del firewall. Windows Phone 7™ es la versión más reciente de dispositivos
móviles que respalda el punto de vista de Microsoft sobre un lugar de trabajo móvil. Windows Phone se
presenta con muchas características que admiten «Office en la nube», incluidas aplicaciones que pueden
abrir y leer documentos de Microsoft Office. La experiencia de desarrollo de Windows Phone 7 está diseñada
para el programador de .NET que ya cuenta con sólidos conocimientos sobre el desarrollo de .NET y
Microsoft Silverlight®. En estas notas del producto se intenta salvar la distancia entre el programador de
Windows Phone y el programador de SharePoint que desean crear aplicaciones empresariales que puedan
usar las prestaciones de los Productos de SharePoint 2010 desde Windows Phone.
Nota En estas notas del producto, Productos de SharePoint 2010 hace referencia a Microsoft
SharePoint® Server 2010 y Microsoft SharePoint Foundation 2010, a menos que se indique de otro modo.
En los ejemplos y escenarios se usa SharePoint Server 2010.
El objetivo de este documento es aclarar los siguientes escenarios de desarrollo:





¿Cómo se debe preparar la conexión a los Productos de SharePoint 2010 desde las aplicaciones de Windows
Phone 7?
¿Cómo se establece conexión con SharePoint a través de Unified Access Gateway?
¿Cómo se lleva a cabo la conexión, autenticación y consumo de servicios web de SharePoint?
¿Cómo se crean y actualizan los elementos de lista de SharePoint?
¿Cómo se consumen los canales RSS proporcionados por SharePoint?
5
Arquitectura
En el escenario ilustrado en estas notas del producto, Contoso permite que sus
empleados se conecten a los Productos de SharePoint 2010 a través de Forefront
Unified Access Gateway (UAG). UAG convierte el nombre de host externo
configurado en el teléfono en el nombre de host interno configurado en
SharePoint y agrega una capa de seguridad y autenticación que las organizaciones
necesitan para proteger y controlar sus propiedades web corporativas.
Intranet de Productos de
SharePoint 2010
La intranet de Contoso es una implementación empresarial de Productos de
SharePoint 2010. El sitio se configura mediante una Aplicación de servicio de
perfiles de usuario y una Aplicación de servicio de búsqueda. La aplicación móvil
usará el servicio web del Servicio de perfiles de usuario para permitir que los
empleados vean la información del perfil de usuario en sus teléfonos móviles.
Para obtener más información sobre la configuración de la Aplicación de
servicio de perfiles de usuario, vea Administración del servicio de perfiles de
usuario (SharePoint Server 2010) (http://technet.microsoft.com/es-es/library/ee721050.aspx).
UAG
Publicar un sitio de SharePoint a través de un servidor de UAG en un entorno de desarrollo implica configurar
redes en el equipo host Hyper-V, el servidor que ejecuta SharePoint Server 2010 y el servidor de UAG,
además de instalar y configurar el servidor de UAG.
En el apéndice se describe cómo configurar estas redes e instalar y configurar un servidor de UAG para
publicar un sitio de SharePoint para el desarrollo de Windows Phone 7. Estos pasos son adecuados para un
entorno de desarrollo u otro tipo de entorno que no sea de producción. Vea la publicación Guía de la
solución de publicación SharePoint (http://go.microsoft.com/fwlink/?LinkID=206256) en TechNet cuando
implemente un entorno de este tipo en un entorno de producción.
Escenario de colaboración en la Intranet
Contoso cuenta con muchas personas con talento que trabajan en distintas áreas de producción, incluidas las
áreas farmacéutica y electrónica. El equipo de dirección de Contoso tiene una visión para la integración de
personas y software de modo que el lugar de trabajo sea más productivo y esté más conectado desde la
perspectiva del empleado. Contoso desea que todos puedan disfrutar de la interacción con los datos para
que el personal esté satisfecho y sea productivo. Contoso cuenta con una sólida base de partida gracias a la
implementación de Productos de SharePoint 2010. SharePoint se considera la aplicación de empresa
principal que consolida los datos de usuario y las actividades. Contoso desea ir más allá y ofrecer una
solución de movilidad a sus asociados. Con este fin, Contoso desea desarrollar una aplicación móvil que
6
permita a los usuarios visualizar sus actividades desde SharePoint, realizar un seguimiento de sus
compañeros y actualizar listas hospedadas en la intranet de SharePoint.
Valor de la colaboración para la empresa
Aunque para algunas compañías resulta un reto correlacionar directamente el valor empresarial con las
características de colaboración de los Productos de SharePoint 2010, Contoso ha encontrado una relación
directa entre conectar las personas entre sí y crear un sentido de comunidad con SharePoint. Cuanto más
conectados se sientan los empleados con sus amigos en el trabajo, más probable es que sean felices en su
trabajo. Esta felicidad y satisfacción en el trabajo dan lugar a una mayor permanencia de los empleados (y una
mayor facilidad en la contratación de nuevos empleados). Una mayor permanencia de los empleados supone
una reducción de los costos de contratación y mejores resultados de la empresa.
La aplicación
A través de su aplicación móvil, Contoso desea replicar muchas de las características que la característica
Mis sitios de SharePoint ofrece en un explorador web. El flujo de la aplicación consistirá en una página
panorámica con cuadros de lista para Personas visitadas recientemente, Mi suministro de noticias, Mis
actividades y Mis compañeros. Desde cualquier punto en que un usuario seleccione la imagen de otro
usuario, el perfil de usuario que seleccione se abrirá en una página nueva. Los resultados de la búsqueda se
presentarán en un cuadro de lista y, al seleccionar un usuario, se visualizará su perfil. Estos componentes se
ilustran en la figura 1.
Figura 1: Funcionalidad social de SharePoint que Contoso desea usar en su aplicación Windows Phone 7
Lista de tareas personales
Cada sitio personal tiene una lista de tareas que el empleado puede mantener para realizar un seguimiento
del progreso personal en las asignaciones. La aplicación se conectará a la lista de tareas del sitio personal y
permitirá al empleado crear, actualizar y eliminar tareas.
7
Mi suministro de noticias
Mi suministro de noticias (figura 2) en Mi sitio de SharePoint es el lugar en el que los usuarios obtienen las
noticias más recientes de la empresa. Mi suministro de noticias es extensible, por lo que las organizaciones
como Contoso pueden agregar canales adicionales para eventos de actividad de otros sistemas.
Figura 2: Mi suministro de noticias en un sitio de SharePoint tal como se visualiza en un explorador web
Mis compañeros
Esta lista de compañeros mantenida por un usuario («personas a las que sigo») es un recurso muy valioso
(figura 3). Contoso desea duplicar esta lista en la experiencia móvil.
8
Figura 3: Mi compañeros en un sitio de SharePoint tal como se visualiza en un explorador web
9
La aplicación Windows Phone usará el control panorámico para visualizar la información, incluidos los
últimos perfiles a los que se ha accedido, en un panel continuo (figura 4).
Figura 4: Control panorámico que muestra la vista holística de la aplicación de Windows Phone 7
Tarjeta de perfil
Al seleccionar un usuario, se visualizarán los detalles de su perfil (figura 5). La tarjeta de perfil también
mostrará información acerca del usuario en la vista móvil.
10
Figura 5: Detalles acerca de un usuario en un sitio de SharePoint tal como se visualizan en un explorador web
Figura 6: Detalles acerca de un usuario en un sitio de SharePoint tal como se visualizan en la aplicación de
Windows Phone 7
11
Seguridad
El programador de Windows Phone debe tener en cuenta la seguridad tanto para los datos durante el
tránsito como para los datos en reposo. El almacenamiento seguro de credenciales se logra con el uso de
almacenamiento cifrado y aislado. Para obtener más información sobre las capacidades de seguridad del
teléfono, vea Seguridad para Windows Phone (http://go.microsoft.com/fwlink/?LinkId=215977) en MSDN.
Almacenamiento de credenciales
Windows Phone 7 admite los siguientes algoritmos criptográficos:






AES
HMACSHA1
HMACSHA256
Rfc2898DeriveBytes
SHA1
SHA256
Es muy importante que el programador de una aplicación móvil que almacene credenciales en el teléfono
tenga en cuenta la seguridad de las credenciales almacenadas en caso de pérdida del dispositivo o si este se
encuentra en situación de riesgo.
Autenticación
Windows Phone 7 no admite la autenticación NTLM. Las solicitudes de servicios web desde el teléfono a
través de UAG deben crear el encabezado de autenticación correcto; para ello, deben recuperar las
credenciales del usuario del almacenamiento cifrado y luego adjuntar las credenciales al encabezado del
objeto HttpWebRequest. Las solicitudes web deben realizarse a través de HTTPS y los encabezados de
autenticación deben pasarse como se muestra en el siguiente ejemplo.
upsRequest.Headers["Authorization"] = "Basic " +
Convert.ToBase64String(
Encoding.UTF8.GetBytes(AppSettings.Username + ":" + AppSettings.Password)) +
System.Environment.NewLine;
Cuando se usa una referencia de servicio WCF, el encabezado puede agregarse al cliente SOAP accediendo a
OperationContextScope, como en el siguiente ejemplo.
using (OperationContextScope scope =
new OperationContextScope(ups.InnerChannel))
{
//Crear la propiedad de mensaje de solicitud
HttpRequestMessageProperty request = new HttpRequestMessageProperty();
//Crear el encabezado de autenticación y de agente móvil
request.Headers[System.Net.HttpRequestHeader.Authorization] =
12
"Basic " +
Convert.ToBase64String(Encoding.UTF8.GetBytes(AppSettings.Username + ":" +
AppSettings.Password)) + System.Environment.NewLine;
request.Headers[System.Net.HttpRequestHeader.UserAgent] =
"Microsoft Office Mobile";
//Agregar los encabezados a la solicitud
OperationContext.Current.OutgoingMessageProperties.Add(
HttpRequestMessageProperty.Name, request);
//Llamar al método
ups.GetUserColleaguesAsync(account);
}
Servicios de SharePoint
Consumo de servicios
La aplicación consumirá varios servicios de SharePoint para cumplir los requisitos empresariales, como se
resume en la siguiente tabla.
Requisito
URL del servicio
Método
Leer y actualizar
datos de lista
http://sharepoint/_vti_bin/listdata.svc
Biblioteca de cliente
OData
Visualizar suministro
de noticias de
usuario
http://mysitehost/_layouts/activityfeed.aspx?consolidate
d=true
Consumir la fuente RSS
proporcionada
Visualizar
compañeros del
usuario
http://mysitehost/_vti_bin/userprofileservice.asmx
GetUserColleagues
Visualizar perfil de
usuario
http://mysitehost/_vti_bin/userprofileservice.asmx
GetUserProfileByName
Acceso a datos de lista de SharePoint mediante
la biblioteca de cliente OData
Publicar una colección de sitios de SharePoint a través de un servidor de UAG permite la integración entre las
aplicaciones de Windows Phone 7 y las API REST de SharePoint. Gracias a OData Client Library for Windows
Phone 7 Series CTP (http://go.microsoft.com/fwlink/?LinkId=215984), los dispositivos con Windows Phone 7
13
pueden consumir fuentes OData. Las API REST de SharePoint pueden llamarse mediante la biblioteca de
cliente OData para proporcionar operaciones de creación, lectura, actualización y eliminación (CRUD) en
datos de lista de SharePoint. Esto ofrece la capacidad de integrar dispositivos con Windows Phone 7 con
aplicaciones de colaboración creadas en la plataforma SharePoint. El siguiente código de ejemplo muestra
cómo usar la biblioteca de cliente OData y las API REST de SharePoint para llevar a cabo operaciones CRUD
en los datos de lista de SharePoint.
Dado que no es posible agregar referencias de servicio para las API REST de SharePoint a una aplicación de
Windows Phone 7, debe generar manualmente una clase proxy y agregarla como referencia al proyecto en
Microsoft Visual Studio®. Para generar la clase proxy, se usa DataSvcUtil.exe
(http://go.microsoft.com/fwlink/?LinkID=215987). En este escenario, la clase proxy se denomina
ContosoIntranetDataContext. En los ejemplos de código siguientes se hace un uso extensivo de esta clase.
El método LoadTask muestra cómo cargar tareas desde una lista de tareas de SharePoint. En este método, la
clase ContosoIntranetDataContext usa la configuración de IsolatedStorage para determinar el sitio de
SharePoint con el que se debe establecer conexión. El controlador de eventos SendingRequest se asigna a la
instancia de ContosoIntranetDataContext. Este controlador de eventos se activa cuando la clase
ContosoIntranetDataContext invoca una solicitud para las API REST de SharePoint. requestUri define la
operación REST y el método BeginExecute envía la solicitud. El método BeginExecute también registra el
método de devolución de llamada asíncrona que se activa cuando se completa la consulta.
private void LoadTasks()
{
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
if (allTasks == null)
{
allTasks = new ObservableCollection<Task>();
}
ObservableCollection<TasksItem> tasks = new
ObservableCollection<TasksItem>();
//Recuperar la configuración del almacenamiento aislado
SettingsModel settings =
(IsolatedStorageSettings.ApplicationSettings["Settings"]
as SettingsModel);
//Configurar el contexto ODATA para que apunte al sitio de SharePoint
context = new ContosoIntranetDataContext(
new Uri(settings.ServerUri + "/_vti_bin/listdata.svc"));
//Registrar el controlador de eventos usado para la autenticación ante UAG
14
context.SendingRequest += new EventHandler<SendingRequestEventArgs>(
context_SendingRequest);
//Establecer el URI para consultar la lista de tareas
//Se usa expansión para recuperar los valores de la columna de búsqueda
Uri requestUri = new Uri(context.BaseUri.OriginalString +
"/Tasks()?$expand=AssignedTo,CreatedBy,ModifiedBy");
//Iniciar la llamada asíncrona para consultar SharePoint
context.BeginExecute<TasksItem>(requestUri, QueryCallback, null);
});
}
El controlador de eventos SendingRequest se activa cuando se envía la consulta OData a los productos de
SharePoint 2010. El código de este controlador de eventos es importante: sin este código, un servidor de
UAG no pude identificar correctamente un dispositivo con Windows Phone 7 e interactuar correctamente
para autenticar un usuario. El encabezado User-Agent hace que un servidor de UAG responda con un
mensaje HTTP 401 en lugar de un mensaje 302. El encabezado Authorization incluye las credenciales cifradas
para el usuario que accede a la fuente OData. El servidor de UAG usa las credenciales cifradas para
autenticar el usuario.
private void context_SendingRequest(object sender, SendingRequestEventArgs e)
{
e.RequestHeaders["User-Agent"] = "Microsoft Office Mobile";
e.RequestHeaders["Authorization"] = "Basic " + Convert.ToBase64String(
Encoding.UTF8.GetBytes(App.Credential.Name + ":" +
App.Credential.Password)) + System.Environment.NewLine;
}
Una vez que se ha completado la consulta para el servidor que ejecuta SharePoint Server, se activa el método
QueryCallback. Este método analiza los resultados que devuelve la consulta y los agrega al objeto
ObservableCollection enlazado a los elementos de la interfaz de usuario de la aplicación del teléfono.
private void QueryCallback(IAsyncResult asyncResult)
{
IEnumerable<TasksItem> results;
allTaskItems = new ObservableCollection<TasksItem>();
15
results = context.EndExecute<TasksItem>(asyncResult).ToList()
as IEnumerable<TasksItem>;
ObservableCollection<Task> returnedTasks =
new ObservableCollection<Task>();
foreach (TasksItem tasksItem in results)
{
//Código omitido por razones de concisión: recuperar metadatos acerca de la
tarea…
//Crear la tarea nueva y establecer sus propiedades
Task task = new Task()
{
Title = tasksItem.Title,
Priority = taskPriority,
TaskStatus = taskStatus,
Body = tasksItem.Description,
Author =
authorUser.Name,
Editor =
editorUser.Name,
AssignedTo = assignedToUser.Name,
StartDate = DateTime.Parse(tasksItem.StartDate.ToString()),
Modified = DateTime.Parse(tasksItem.Modified.ToString()),
Created = DateTime.Parse(tasksItem.Created.ToString()),
DueDate = DateTime.Parse(tasksItem.DueDate.ToString()),
UIVersion = 1,
Last_x0020_Modified =
DateTime.Parse(tasksItem.Modified.ToString()),
Created_x0020_Date =
DateTime.Parse(tasksItem.Created.ToString()),
PercentComplete = (int)finalPercentComplete,
ListID = tasksItem.Id
};
//Agregar cada tarea al objeto ObservableCollection enlazado a los elementos
de la interfaz de usuario.
returnedTasks.Add(task);
16
allTaskItems.Add(tasksItem);
}
allTasks = returnedTasks;
//Métodos de devolución de llamada de la interfaz de usuario omitidos por
razones de concisión
}
El método SaveTask crea tareas nuevas y actualiza tareas existentes. El siguiente código muestra cómo usar
la biblioteca de cliente OData para crear tareas nuevas o para actualizar tareas existentes en una lista de
tareas de SharePoint desde un dispositivo con Windows Phone 7. La clase TasksItem representa una tarea
en una lista de tareas. Se crea una instancia de TasksItem y sus propiedades se establecen en los valores con
el formato usado para crear o editar tareas. A continuación, la instancia de TasksItem se compara con las
tareas que ya se han cargado en el teléfono para ver si la tarea ya existe. Esta comprobación determina si se
usa la biblioteca de cliente OData para crear una tarea nueva en la lista de tareas de SharePoint o para
actualizar una tarea existente. El método BeginSaveChanges invoca la operación apropiada y registra el
método de devolución de llamada saveChangesCallBack.
public void SaveTask(Task task, Action<Task> callback)
{
taskToSave = task;
#region Create/update new task object
saveTaskCallback = callback;
//Recuperar la configuración del almacenamiento aislado
SettingsModel settings =
(IsolatedStorageSettings.ApplicationSettings["Settings"]
as SettingsModel);
//Configurar el contexto ODATA para que apunte al sitio de SharePoint apropiado
context = new ContosoIntranetDataContext(
new Uri(settings.ServerUri + "/_vti_bin/listdata.svc"));
//Registrar el controlador de eventos usado para la autenticación ante UAG
context.SendingRequest +=
new EventHandler<SendingRequestEventArgs>(context_SendingRequest);
TasksItem tasksItem = new TasksItem();
17
tasksItem.Title = task.Title;
tasksItem.Description = task.Body;
tasksItem.AssignedToId = assignedToUserID;
tasksItem.PriorityValue = task.Priority.DisplayString;
tasksItem.StartDate = task.StartDate;
tasksItem.DueDate = task.DueDate;
//Establecer el porcentaje completado
if (task.PercentComplete > 0)
{
tasksItem.Complete = (double)task.PercentComplete / 100;
}
else
{
tasksItem.Complete = (double)0;
}
//Establecer el estado de la tarea
tasksItem.StatusValue = task.TaskStatus.DisplayString;
//Si la tarea ya existe, actualizarla
if (allTasks.Count > 0 && DoesTaskExist(taskToSave) && task.ListID != 0)
{
tasksItem.Id = task.ListID;
context.AttachTo("Tasks", tasksItem, "*");
context.UpdateObject(tasksItem);
}
//Si la tarea no existe, crearla
else
{
context.AddToTasks(tasksItem);
}
Deployment.Current.Dispatcher.BeginInvoke(
() =>
18
{
//Iniciar la llamada asíncrona a SharePoint para confirmar los cambios
context.BeginSaveChanges(saveChangesCallBack, context);
}
);
}
Una vez completada la consulta, se activa saveChangesCallBack. Este método analiza los resultados que
devuelve la consulta y actualiza el objeto ObservableCollection enlazado a los elementos de la interfaz de
usuario del teléfono.
private void saveChangesCallBack(IAsyncResult asyncResult)
{
Deployment.Current.Dispatcher.BeginInvoke(
() =>
{
//Obtener el contexto de datos de la respuesta
context = asyncResult.AsyncState as ContosoIntranetDataContext;
//Llamar al método endsavechanges para confirmar el cambio
DataServiceResponse response = context.EndSaveChanges(asyncResult);
//Si la tarea ya existe, actualizarla
if (allTasks.Count > 0 && DoesTaskExist(taskToSave))
{
for (int i = 0; i < allTasks.Count; i++)
{
if (allTasks[i].ListID == taskToSave.ListID)
{
//Actualizar la tarea correspondiente en la colección en memoria
allTasks[i] = taskToSave;
//Llamar al método de devolución de llamada para indicar a la interfaz
de usuario que la operación de guardar ha terminado
saveTaskCallback.DynamicInvoke(taskToSave);
break;
}
}
}
19
//Si la tarea no existe, crearla
else
{
//Agregar la tarea a la colección en memoria
allTasks.Add(taskToSave);
//Llamar al método de devolución de llamada para indicar a la interfaz de
usuario que la operación de guardar ha terminado
saveTaskCallback.DynamicInvoke(taskToSave);
}
}
);
}
El método DeleteTask muestra cómo usar la biblioteca de cliente OData para eliminar tareas de una lista de
tareas de SharePoint desde un dispositivo con Windows Phone 7. Este método obtiene el Id. asociado con una
tarea seleccionada en la aplicación de Windows Phone 7 y crea un objeto Task basado en el Id. El objeto Task se
usa para localizar la instancia de TasksItem correspondiente en el contexto de biblioteca de cliente OData
asociado con la lista de tareas de SharePoint. Una vez que se ha localizado la entrada correspondiente, se
marca para su eliminación. El método de devolución de llamada BeginSaveChanges invoca la API REST de
SharePoint y registra el método de devolución de llamada DeleteCallback.
public void DeleteTask(int ID, Action callback)
{
deleteTaskCallback = callback;
taskToDelete = GetTask(ID);
//Recuperar la configuración del almacenamiento aislado
SettingsModel settings =
(IsolatedStorageSettings.ApplicationSettings["Settings"]
as SettingsModel);
//Configurar el contexto ODATA para que apunte al sitio de SharePoint apropiado
context = new ContosoIntranetDataContext(
new Uri(settings.ServerUri + "/_vti_bin/listdata.svc"));
//Registrar el controlador de eventos usado para la autenticación ante UAG
context.SendingRequest +=
new EventHandler<SendingRequestEventArgs>(context_SendingRequest);
20
foreach (TasksItem tasksItem in allTaskItems)
{
if (tasksItem.Id == taskToDelete.ListID)
{
context.MergeOption = MergeOption.OverwriteChanges;
context.AttachTo("Tasks", tasksItem, "*");
context.DeleteObject(tasksItem);
//Iniciar la llamada asíncrona a SharePoint para confirmar la eliminación
context.BeginSaveChanges(DeleteCallback, context);
break;
}
}
}
Una vez terminada la consulta, se activa el método DeleteCallback. Este método analiza los resultados que
devuelve la consulta y elimina la tarea en el objeto ObservableCollection enlazado a los elementos de la
interfaz de usuario del teléfono.
private void DeleteCallback(IAsyncResult asyncResult)
{
Deployment.Current.Dispatcher.BeginInvoke(
() =>
{
//Obtener el contexto de datos de la respuesta
context = asyncResult.AsyncState as ContosoIntranetDataContext;
//Llamar al método endsavechanges para confirmar el cambio
DataServiceResponse response = context.EndSaveChanges(asyncResult);
// Quitar la tarea también de la colección en memoria
if (taskToDelete != null)
{
//Quitar la tarea de la colección en memoria
GetAllTasks().Remove(taskToDelete);
//Llamar al método de devolución de llamada para indicar a la interfaz de
usuario que la operación de eliminar ha terminado
deleteTaskCallback.DynamicInvoke();
21
}
}
);
}
RSS de fuente de actividades
El suministro de noticias principal y las actividades recientes se publican desde el host Mi sitio como una
fuente RSS. La aplicación simplemente debe solicitar la fuente RSS, descargar la cadena y agregar los
resultados en un objeto de colección. Las actividades se publican desde el host Mi sitio en el URL
http://<host_mi_sitio>/_layouts/activityfeed.aspx?consolidated=true. (Antes de intentar acceder a la fuente
RSS a través del enfoque de código que se describe a continuación, asegúrese de que ha probado la fuente
RSS; para ello, siga las instrucciones que se indican en el apéndice al final de este documento.)
El método LoadNewsfeed muestra cómo solicitar la fuente de actividades consolidada para el usuario
autenticado a través de UAG. Se crea una nueva solicitud HtpWebRequest pasando el URI de la fuente de
actividades consolidada. Los encabezados de cliente necesarios se agregan a la solicitud. La cuenta y la
contraseña son variables a las que se accede desde el almacenamiento aislado. Para facilitar el uso del patrón
Modelo Vista Vista Modelo, se usa MVVM Light Toolkit (para obtener más información, vea el sitio web de
MVVM Light Toolkit (http://go.microsoft.com/fwlink/?LinkId=216135)). En este ejemplo, se llama a
DispatcherHelper.CheckBeginInvokeOnUI para manejar ResponseStream y los resultados se pasan a
AddNewsfeedItems para extraer los valores de resultado y agregarlos a la colección NewsfeedItems.
private void LoadNewsfeed()
{
//URL del RSS de Mi suministro de noticias
string url =
String.Format("{0}/my/_layouts/activityfeed.aspx?consolidated=true",
AppSettings.Url);
System.Uri authServiceUri = new Uri(url);
HttpWebRequest client =
WebRequest.CreateHttp(authServiceUri) as HttpWebRequest;
//Agregar los encabezados necesarios para UAG
client.Headers["User-Agent"] = "Microsoft Office Mobile";
client.Headers["Authorization"] = "Basic " +
Convert.ToBase64String(Encoding.UTF8.GetBytes(AppSettings.Username + ":" +
AppSettings.Password))+
System.Environment.NewLine;
22
client.AllowReadStreamBuffering = true;
client.AllowAutoRedirect = true;
// Llamar y manejar la respuesta
client.BeginGetResponse((asResult) =>
{
DispatcherHelper.CheckBeginInvokeOnUI(
() =>
{
try
{
var response = client.EndGetResponse(asResult);
StreamReader reader = new
StreamReader(response.GetResponseStream());
string responseString = reader.ReadToEnd();
AddNewsfeedItems(responseString);
}
catch (WebException failure)
{
throw failure;
}
});
},
null);
}
Una vez completada la descarga, AddNewsfeedItems agrega los resultados a la colección enlazada a la
interfaz de usuario. La cadena responseString se analiza en un XDocument y se agregan los dos espacios de
nombres. Se usa LINQ para consultar la colección de entradas y crear objetos MyNewsfeedViewModel que
almacenan los elementos de suministro de noticias resultantes e información sobre el autor. Por último, los
elementos se agregan a la colección MyNewsFeedItems.
private void AddNewsfeedItems(string responseString)
{
//Analizar la respuesta XML
XDocument newsfeedDoc = XDocument.Parse(responseString);
//Agregar los espacios de nombres necesarios
XNamespace ns = "http://www.w3.org/2005/Atom";
23
XNamespace af = "AF";
//Usar LINQ para extraer la información en un modelo ViewModel
IEnumerable<MyNewsfeedViewModel> entries = from entry in
newsfeedDoc.Descendants(XName.Get("entry", ns.NamespaceName))
select new MyNewsfeedViewModel()
{
Summary = entry.Element(ns + "summary").Value,
Published = entry.Element(ns + "published").Value,
Author =
(from author in entry.Descendants(XName.Get("author",
ns.NamespaceName))
select new PersonViewModel(NavigationService)
{
AccountName = author.Element(af + "AccountName").Value,
Name = author.Element(ns + "name").Value,
PersonalSiteUrl = author.Element(ns + "uri").Value,
Email = author.Element(ns + "email").Value,
PictureUrl = author.Element(af + "Picture").Value
}).FirstOrDefault()};
//Agregar los elementos resultantes en la colección enlazada a los controles
de la interfaz de usuario
DispatcherHelper.CheckBeginInvokeOnUI(() =>
{
foreach (MyNewsfeedViewModel e in entries.ToList())
{
MyNewsfeedItems.Add(e);
}
});
}
Servicio de perfiles de usuario: Compañeros
El Servicio de perfiles de usuario de SharePoint proporciona la capacidad de visualizar, crear, editar y
administrar información de perfiles de usuario en productos de SharePoint 2010. El servicio es el punto de
entrada principal que tiene la aplicación para recuperar información acerca de compañeros del usuario y
24
perfiles de usuario. El siguiente código muestra cómo llamar al Servicio de perfiles de usuario desde Windows
Phone 7 a través de UAG.
Creación de la referencia del Servicio de perfiles
de usuario
Para empezar, agregue una referencia de servicio al proyecto de Windows Phone 7. Especifique el URL del
punto final del Servicio de perfiles de usuario de SharePoint, como, por ejemplo:
http://spwp7intranet.contoso.com/_vti_bin/userprofileservice.asmx
Asigne a la referencia de servicio un nombre reconocible, como UserProfileService y haga clic Aceptar.
Método web GetUserColleagues
El método LoadColleagueData usa el método GetUserColleaguesAsync del Servicio de perfiles de usuario para
devolver una colección de compañeros como objetos ContactData. Una vez que se ha creado BasicHttpBinding y
EndpointAddress, se crea un nuevo UserProfileServiceSoapClient con los parámetros necesarios. En Silverlight,
las llamadas al servicio deben realizarse de forma asíncrona. Se agrega un nuevo controlador de eventos
OnCompleted para el evento GetUserColeaguesCompleted. Para agregar los encabezados necesarios para UAG,
se usa un OperationContextScope y se crea un una HttpRequestMessageProperty que va a contener los dos
encabezados necesarios para la autenticación ante UAG. Los encabezados se agregan al mensaje saliente y la
llamada asíncrona se realiza para GetUserColleaguesAsync usando la cuenta de usuario como parámetro.
private void LoadColleagueData()
{
string url =
String.Format("{0}/_vti_bin/userprofileservice.asmx", AppSettings.Url);
BasicHttpBinding binding = new BasicHttpBinding();
EndpointAddress endpoint = new EndpointAddress(url);
UserProfileService.UserProfileServiceSoapClient ups =
new UserProfileServiceSoapClient(binding, endpoint);
//Agregar el controlador de eventos completados
ups.GetUserColleaguesCompleted +=
new EventHandler<GetUserColleaguesCompletedEventArgs>(
ups_GetUserColleaguesCompleted);
//Agregar las credenciales
using (OperationContextScope scope =
new OperationContextScope(ups.InnerChannel))
25
{
//Crear la propiedad de mensaje de solicitud
HttpRequestMessageProperty request = new HttpRequestMessageProperty();
//Crear el encabezado de autenticación y de agente móvil
request.Headers[System.Net.HttpRequestHeader.Authorization] =
"Basic " +
Convert.ToBase64String(Encoding.UTF8.GetBytes(AppSettings.Account +
":" + AppSettings.Password)) + System.Environment.NewLine;
request.Headers[System.Net.HttpRequestHeader.UserAgent] =
"Microsoft Office Mobile";
//Agregar los encabezados a la solicitud
OperationContext.Current.OutgoingMessageProperties.Add(
HttpRequestMessageProperty.Name, request);
//Llamar al método
ups.GetUserColleaguesAsync(account);
}
}
Cuando el método GetUserColleaguesAsync devuelve resultados, se llama al evento
ups_GetUserColleaguesCompleted. Si no existe ningún error, se usa LINQ para crear una lista de
PersonViewModels a partir de los datos ContactData resultantes. El último paso consiste en agregar los
modelos PersonViewModels de la lista a ColleaguesList en el subproceso de la interfaz de usuario llamando
a CheckBeginInvoke y pasando la lista de PersonViewModels.
private void ups_GetUserColleaguesCompleted(object sender,
GetUserColleaguesCompletedEventArgs e)
{
if (e.Error == null)
{
//Crear una lista de PersonViewModels
IEnumerable<PersonViewModel> colleagues =
from contact in e.Result
select new PersonViewModel()
{
AccountName = contact.AccountName,
UserProfileID = contact.UserProfileID.ToString(),
26
Name = contact.Name,
Title = contact.Title,
Email = contact.Email,
PersonalSiteUrl = contact.Url
};
//Cargar la lista de compañeros en el subproceso de la interfaz de usuario
DispatcherHelper.CheckBeginInvokeOnUI(() =>
{
foreach (PersonViewModel c in colleagues.ToList())
{
Colleagues.Add(c);
}
});
}
else
{
Debug.WriteLine("Error loading the Colleagues List: {0}",
e.Error.Message);
}
}
Servicio de perfiles de usuario: Datos de perfil
de usuario
El método web GetUserColleagues no devuelve perfiles de usuario. El método devuelve datos ContactData
que pueden pasarse de nuevo al método GetUserProfileByName del Servicio de perfiles de usuario que
devuelve un objeto de perfil de usuario completo, que posteriormente puede usarse para visualizar un perfil
de usuario completo. El método siguiente se usa para devolver los detalles del perfil de usuario para nuestros
compañeros. Específicamente, devolveremos los campos AboutMe, WorkPhone, MobilePhone y PictureURL.
El método GetUserProfileProperties toma un objeto PersonViewModel para la persona cuyo perfil deseamos
recuperar. En este método, construimos un inspector de mensajes para resolver un problema que hace que el
valor devuelto por PropertyData no se analice correctamente. A continuación, creamos un
BasicHttpMessageInspectorBinding que toma el inspector de mensajes como parámetro, pasa el enlace y el
punto final al constructor para UserProfileServiceSoapClient y registra el controlador de eventos
GetUserProfileByNameCompleted. Para agregar los encabezados de solicitud necesarios para UAG, un
OperationContextScope agrega los encabezados Authorization y UserAgent a la solicitud. Por último, llamamos al
27
método GetUserProfileByNameAsync y pasamos el Account Name para el usuario y el PersonViewModel que
queremos actualizar.
private void GetUserProfileProperties(PersonViewModel person)
{
//URL para el servicio
string url = String.Format("{0}/_vti_bin/userprofileservice.asmx",
AppSettings.ServerUrl);
//Crear el inspector de mensajes
SPAsmxMessageInspector messageInspector = new SPAsmxMessageInspector();
//Aplicar el inspector de mensajes al enlace
BasicHttpMessageInspectorBinding binding = new
BasicHttpMessageInspectorBinding(messageInspector);
EndpointAddress endpoint = new EndpointAddress(url);
UserProfileService.UserProfileServiceSoapClient ups = new
UserProfileServiceSoapClient(binding, endpoint);
//Agregar el controlador de eventos completados
ups.GetUserProfileByNameCompleted += new
EventHandler<GetUserProfileByNameCompletedEventArgs>
(ups_GetUserProfileByNameCompleted);
using (OperationContextScope scope = new
OperationContextScope(ups.InnerChannel))
{
//Crear la propiedad de mensaje de solicitud
HttpRequestMessageProperty request = new HttpRequestMessageProperty();
//Crear el encabezado de autenticación y de agente móvil
request.Headers[System.Net.HttpRequestHeader.Authorization] = "Basic " +
Convert.ToBase64String(Encoding.UTF8.GetBytes(AppSettings.UserName + ":" +
AppSettings.Password)) + System.Environment.NewLine;
request.Headers[System.Net.HttpRequestHeader.UserAgent] =
"Microsoft Office Mobile";
//Agregar los encabezados a la solicitud
28
OperationContext.Current.
OutgoingMessageProperties.Add(HttpRequestMessageProperty.Name, request);
Debug.WriteLine("Getting User Profile for: {0}", person.AccountName);
//Llamar al método
ups.GetUserProfileByNameAsync(person.AccountName, person);
}
}
Cuando se llama a GetUserProfileByNameCompleted, los valores de propiedad devueltos (si se devuelve
alguno) se inspeccionan y asignan a la propiedad adecuada en PersonViewModel.
private void ups_GetUserProfileByNameCompleted(object sender,
GetUserProfileByNameCompletedEventArgs e)
{
if (e.Error == null)
{
Debug.WriteLine("Got the user profile for {0}",
((PersonViewModel)e.UserState).AccountName);
foreach (UserProfileService.PropertyData propertyData in e.Result)
{
switch (propertyData.Name)
{
case "AboutMe":
((PersonViewModel) e.UserState).AboutMe = propertyData.Values.Count >
0 ? (propertyData.Values[0].Value as string): String.Empty;
break;
case "WorkPhone":
((PersonViewModel)e.UserState).WorkPhone = propertyData.Values.Count >
0 ? (propertyData.Values[0].Value as string) : String.Empty;
break;
case "CellPhone":
((PersonViewModel)e.UserState).MobilePhone = propertyData.Values.Count >
0 ? (propertyData.Values[0].Value as string) : String.Empty;
break;
29
case "PictureURL":
((PersonViewModel)e.UserState).PictureUrl = propertyData.Values.Count >
0 ? (propertyData.Values[0].Value as string) : String.Empty;
break;
}
}
}
else
{
Debug.WriteLine(e.Error.Message);
}
}
Nota: se recomienda usar el inspector de mensajes de este ejemplo únicamente en un entorno en el que se hayan
aplicado las últimas actualizaciones de Silverlight. Para obtener más información, vea Solución alternativa para
acceder a algunos servicios de ASMX desde Silverlight 4 (http://go.microsoft.com/fwlink/?LinkID=216134 ) y GUID
de servicio de perfiles de usuario de Silverlight y SharePoint (http://go.microsoft.com/fwlink/?LinkId=216136).
Pruebas
Pruebas de la aplicación en el emulador
La aplicación de este ejemplo se prueba en el emulador de desarrollo de Windows Phone 7. El emulador usa la
conexión de red del equipo de desarrollo host. Si es necesario, pueden agregarse entradas de archivo host al
equipo de desarrollo de modo que el emulador pueda resolver las direcciones del servidor de UAG de desarrollo.
Pruebas de la aplicación en un dispositivo
Para poder probar la aplicación en un dispositivo Windows Phone físico, el teléfono debe estar conectado a
una conexión Wi-Fi disponible públicamente que proporcione DNS y enrutamiento al servidor de UAG de
prueba de destino o a un servidor de UAG de prueba expuesto en Internet.
Consideraciones sobre el catálogo de soluciones
Una vez que haya desarrollado la aplicación de Windows Phone 7, es importante que lleve a cabo los pasos
adecuados para publicar correctamente la aplicación en el Catálogo de soluciones de Windows Phone.
Microsoft ha implementado varios mecanismos para evitar la piratería de software de aplicaciones de
Windows Phone 7. Para obtener más información acerca de estas medidas, vea el documento Notas del
30
producto Modelo antipiratería de Windows Phone Marketplace
(http://go.microsoft.com/fwlink/?LinkId=216137).
A nivel general, para publicar una aplicación de Windows Phone 7 en el Catálogo de soluciones de Windows
Phone de, como mínimo, crear una cuenta de programador y publicar la aplicación en el catálogo de soluciones.
En el artículo Tutorial de registro de programadores en App Hub
(http://go.microsoft.com/fwlink/?LinkId=216138) se describe cómo registrar una cuenta de programador. Es
importante tener en cuenta que la cuenta de un programador puede estar asociada a un individuo o a una
empresa. En función de sus necesidades, puede suscribirse a la cuenta que más le convenga. Ambos tipos de
cuenta tienen la misma tarifa de registro. En el artículo Tutorial de envío de la aplicación Windows Phone 7
(http://go.microsoft.com/fwlink/?LinkId=216139) se describe cómo enviar la aplicación para su comprobación y
publicación. Si la aplicación cumple los requisitos estipulados en Requisitos de certificación de la aplicación
Windows Phone 7 [PDF] (http://go.microsoft.com/?linkid=9730558), se publicará en el Catálogo de soluciones
de Windows Phone.
En el momento de publicar estas notas del producto, no existe ningún «catálogo de soluciones privado» para
las organizaciones para evitar la distribución pública de sus aplicaciones. Vea el sitio App Hub
(http://create.msdn.com) para obtener información sobre las actualizaciones y sobre la capacidad de las
organizaciones de publicar aplicaciones de forma privada.
Microsoft ha implementado muchas medidas de seguridad, no obstante, deben tomarse todas las
precauciones necesarias para proteger el código en caso de que alguna persona obtenga una copia del
archivo .xap que representa la aplicación de Windows Phone 7. Antes de seguir los pasos necesarios para
publicar la aplicación en el Catálogo de soluciones de Windows Phone, debe asegurarse de que protege las
aplicaciones para proteger su propiedad intelectual. Existen varias herramientas disponibles para proteger
las aplicaciones de Windows Phone 7.
Es muy probable que la siguiente lista no sea completa, pero constituye un buen punto de partida para
explorar las opciones disponibles actualmente.
PreEmptive Solutions Dotfuscator Windows Phone Edition
(http://www.preemptive.com/windowsphone7.html)
RedGate SmartAssembly 6 EAP (http://www.red-gate.com/MessageBoard/viewforum.php?f=116)
DeepSea Obfuscator (http://www.deepseaobfuscator.com/)
La protección adecuada es un proceso iterativo para cuya prueba y comprobación se requiere tiempo.
Asegúrese de prever tiempo en el plan del proyecto para proteger las aplicaciones de Windows Phone 7,
probarlas y comprobar que el nivel de protección satisface sus necesidades.
Puede usar la herramienta Windows Phone 7 Application Deployment (figura 7) para probar las aplicaciones
de Windows Phone 7 protegidas. Esta herramienta permite implementar las aplicaciones de Windows Phone
7 protegidas en un dispositivo con Windows Phone 7 real que haya registrado con su cuenta de programador
o en el emulador de Windows Phone 7.
31
Figura 7: Herramienta Windows Phone 7 Application Deployment
Una vez que haya implementado y probado una aplicación protegida de Windows Phone 7, es posible que
detecte que en niveles muy altos de protección (en los que se activan todas las opciones posibles para
proteger el código) la aplicación no se ejecute correctamente en un dispositivo con Windows Phone 7 o en el
emulador de Windows Phone 7. Por otro lado, es posible que observe que el uso de un nivel mínimo de
configuración de protección sea suficiente para garantizar la ejecución correcta de la aplicación, pero que el
nivel de protección no satisfaga sus necesidades.
Puede seguir los pasos que se indican a continuación para determinar el nivel de protección que una
herramienta de protección aplica a su aplicación. En primer lugar, localice el archivo .xap que representa su
aplicación de Windows Phone 7 y cambie el nombre de la extensión por .cab o .zip. A continuación, abra el
archivo y extraiga su contenido. Use una herramienta como RedGate .NET Reflector para abrir el montaje
32
que corresponde a su aplicación. Al abrir el nodo de recursos podrá ver todos los archivos XAML y guardarlos
en el disco duro (figura 8).
Figura 8: Almacenamiento de archivos XAML con .NET Reflector
A continuación, puede examinar los archivos XAML para ver el nivel de protección que se ha aplicado al código.
Quizás le sorprenda ver que los niveles bajos de protección no cambian en absoluto el contenido de un archivo
XAML y que en los niveles altos de protección simplemente se quita un espacio en blanco. Esto fomenta el uso
del patrón Modelo Vista Vista Modelo para separar el código y la lógica de presentación de las capas de acceso
a datos.
También puede examinar el código de los montajes en los que se basa su aplicación de Windows Phone 7. En la
figura 9 se muestra un montaje protegido.
33
Figura 9: Protección aplicada a un montaje de aplicación de Windows Phone 7
En cuanto a la protección, es muy importante no olvidar que no existe ningún nivel de protección que pueda
impedir que un hacker muy decidido realice una operación de ingeniería inversa en la mayor parte del código
fuente. Las técnicas de protección están diseñadas para proteger la propiedad intelectual proporcionando
una barrera que dificulta llevar a cabo una operación de ingeniería inversa del código y robarlo.
Conclusión
El programador de Windows Phone 7 tiene muchos recursos a su disposición. El punto de partida es App Hub
en MSDN, http://create.msdn.com. Los artículos, blogs y foros ayudan a los programadores en los escenarios
de desarrollo de los más simples a los más avanzados. Los Productos de SharePoint 2010 proporcionan un
amplio abanico de capacidades para las organizaciones que desean colaborar y compartir conocimientos,
experiencia e información. Las aplicaciones empresariales que usan las capacidades de la movilidad y de
SharePoint proporcionarán una gran ventaja a las empresas que pueden administrar, mantener e
implementar de forma eficiente soluciones basadas en la plataforma .NET.
34
Apéndice: Instalación y configuración de UAG
para Productos de SharePoint 2010
En esta sección se describe cómo configurar las redes e instalar y configurar un servidor de UAG para publicar
un sitio de SharePoint para el desarrollo de Windows Phone 7. Estos pasos son adecuados para un entorno
de desarrollo. Para obtener información sobre la implementación en un entrono de producción, vea Guía de
la solución de publicación UAG (http://go.microsoft.com/fwlink/?LinkID=206256) en TechNet. Durante el
proceso de instalación, el servidor de UAG solicitará como mínimo 4 GB de RAM. En un entorno de
demostración, 2 GB son suficientes y la advertencia puede omitirse sin problema alguno.
1. Cree una máquina virtual SharePoint Server y
una máquina virtual UAG
En este ejemplo, se usa 2010 Information Worker Demonstration and Evaluation Virtual Machine (RTM)
(http://go.microsoft.com/fwlink/?LinkID=189314) para la máquina virtual SharePoint Server. Para crear una
máquina virtual servidor de UAG, instale Windows Server 2008 R2 en una nueva máquina virtual, instale
todas las actualizaciones mediante Windows Update y proceda con los pasos que se indican a continuación.
Redes
El siguiente diagrama ilustra cómo están conectados el servidor que ejecuta SharePoint Server, el servidor de
UAG y el equipo de desarrollo de Windows Phone 7. En la documentación que sigue se describe cómo
implementar este escenario.
35
Windows 7 Development Machine
Hyper-V Host Machine
.5
.180
.171
UAG Server Virtual
Machine
.180
Visual Studio 2010
.6
.1
SharePoint Server
Virtual Machine
192.168.150.x – Internal Network | 192.168.1.x – External Network
2. Configure redes de equipos virtuales de host
Hyper-V
En la máquina host Hyper-V, cree dos redes virtuales como se indica a continuación. Al configurar las dos redes
se simula un entorno DMZ en el que el servidor de UAG habla en Internet en un adaptador de red y habla con
los recursos internos, en este caso, el servidor que ejecuta SharePoint Server, en otro adaptador de red.
Nombre Tipo de conexión
Descripción
Interna
Interna únicamente
Conexión entre el servidor de UAG y el
servidor que ejecuta SharePoint Server.
UAG
externa
Externa: Enlazada al adaptador de red en el Conexión entre el equipo de desarrollo de
equipo host Hyper-V.
WP7 y el servidor de UAG.
Nota: es posible que las direcciones IP sean ligeramente distintas en su entorno. La clave es hacer que la red
interna opere en una subred distinta de la red externa.
Establezca la configuración de TCP/IP para el adaptador de red interna en el equipo host Hyper-V como se
indica a continuación.
36
Establezca la configuración de TCP/IP para el adaptador de red externa en el equipo host Hyper-V como
se indica a continuación.
37
3. Configure redes de equipos virtuales Hyper-V
En la máquina virtual servidor de UAG, agregue otro adaptador de red y configure la máquina virtual servidor
de UAG para usar redes internas y redes virtuales externas UAG en Hyper-V.
En la máquina virtual SharePoint Server, agregue otro adaptador de red y configure la máquina virtual
SharePoint Server para usar redes internas y redes virtuales externas UAG en Hyper-V.
Establezca la configuración de TCP/IP para el adaptador de red interna en la máquina virtual servidor de UAG
como se indica a continuación.
38
Establezca la configuración de TCP/IP para el adaptador de red externa en la máquina virtual servidor de UAG
como se indica a continuación.
Establezca la configuración de TCP/IP para el adaptador de red interna en la máquina virtual SharePoint
Server como se indica a continuación.
39
Establezca la configuración de TCP/IP para el adaptador de red externa en la máquina virtual SharePoint
Server como se indica a continuación.
40
4. Prepare la máquina virtual servidor de UAG
para la instalación de UAG
Inicie sesión en la máquina virtual servidor de UAG. Cambie el nombre del equipo por UAG1, únalo al
dominio contoso.com y reinicie el equipo. Nota: si no usa 2010 Information Worker Demonstration and
Evaluation Virtual Machine (RTM) (vea http://go.microsoft.com/fwlink/?LinkID=189314&clcid=0xC0A), una el
servidor de UAG al mismo dominio que el servidor que ejecuta SharePoint Server. Asegúrese de que 2010
Information Worker Demonstration and Evaluation Virtual Machine (RTM) esté en ejecución.
Use las credenciales siguientes para unir la máquina virtual servidor de UAG al dominio contoso.
Nombre de usuario: contoso\administrator
Contraseña: pass@word1
Reinicie el equipo e inicie sesión con las credenciales contoso\administrator o con las credenciales específicas
de su entorno.
41
5. Tome una instantánea de la máquina virtual
servidor de UAG
Apague la máquina virtual servidor de UAG y tome una instantánea en la consola de administración de Hyper-V.
6. Instale el servidor de UAG
En primer lugar, monte el medio de instalación de UAG en la máquina virtual servidor de UAG. A continuación,
inicie la máquina virtual servidor de UAG e inicie sesión con las credenciales contoso\administrator. Una vez
que haya iniciado sesión, compruebe que lo ha hecho usando las credenciales de administrador de contoso.
Abra un símbolo del sistema, escriba whoami y presione ENTRAR para comprobar las credenciales.
A continuación, inicie la instalación de UAG desde el medio de instalación. Vea Instalación de SP1 para
Forefront UAG 2010 (http://go.microsoft.com/fwlink/?LinkId=216130) en TechNet para obtener más
información acerca de la instalación. (Nota: no es posible instalar UAG durante una sesión remota; debe
realizar la instalación desde la consola.)
42
Haga clic en Install Forefront UAG. En un escenario de desarrollo, puede ejecutar la máquina virtual servidor
de UAG con menos de 4 GB de RAM. Si ha asignado menos de 4 GB de RAM a la máquina virtual servidor de
UAG, haga clic en Continue.
43
En la página de Welcome del asistente, haga clic en Next >.
44
Haga clic en I accept the Licensing Terms for Microsoft Software y haga clic en Next.
45
En la página Select Installation Location, haga clic en Next.
46
El proceso de instalación se inicia en este punto. El instalador instala todos los roles y las características de
los que depende UAG y configura el servidor para UAG.
47
En la página Setup Wizard Completed, haga clic en Finish.
7. Tome una instantánea de la máquina virtual
servidor de UAG
Una vez que la máquina virtual servidor de UAG se reinicie y finalice la instalación de UAG, apague la
máquina virtual servidor de UAG y tome una instantánea en la consola de administración de Hyper-V.
8. Configuración y activación inicial del servidor
de UAG
Inicie la máquina virtual servidor de UAG e inicie sesión con las credenciales contoso\administrator. Una vez
que haya iniciado sesión, compruebe que lo ha hecho usando las credenciales de administrador de contoso.
Abra un símbolo del sistema, escriba whoami y presione ENTRAR para comprobar las credenciales.
48
Para iniciar el asistente de configuración de UAG, haga clic en Inicio | Todos los programas |Microsoft
Forefront UAG | Forefront UAG Management.
Haga clic en Configure Network Settings.
49
Haga clic en Next.
50
Elija la configuración del adaptador de red según se muestra en la captura de pantalla anterior y haga clic en Next.
51
Haga clic en Next.
52
Haga clic en Finish.
En este paso, va a definir el servidor de UAG como una configuración de “único servidor”.
53
Haga clic en Define Server Topology.
Haga clic en Next.
54
Haga clic en Single Server y, a continuación, en Next.
55
Haga clic en Finalizar.
Haga clic en Join Microsoft Update.
56
Haga clic en Next.
57
Haga clic en Use Microsoft Update when I check for updates (recommended) y, a continuación, en Next.
58
Elija Yes o No y, a continuación, haga clic en Next.
59
Haga clic en Finish.
60
Haga clic en Cerrar.
Haga clic en Yes para activar la configuración.
61
Escriba una contraseña y haga clic en Next >.
Haga clic en Activar.
62
Haga clic en Finish.
El asistente para activación ha finalizado; no obstante, es posible que la configuración de UAG todavía no
esté completamente activada. Para asegurarse de que sí lo está, active los mensajes informativos en la
ventana de mensajes.
En el menú Messages, seleccione Filter Messages.
Active la casilla de verificación Informational messages.
Haga clic en OK.
63
Espere hasta que la ventana de mensajes muestre el mensaje Activation completed successfully.
9. Cree el tronco HTTP para publicar el sitio de
SharePoint
En este escenario, se usa un tronco HTTP para las actividades de desarrollo. Al usar un tronco HTTP en lugar de
un tronco HTTPS la configuración se acelera gracias a la eliminación de los pasos implicados en la configuración
de los certificados de seguridad para habilitar SSL (Secure Sockets Layer). En un entorno de desarrollo, también
resulta más fácil usar HTTP porque de este modo no es necesario volver a crear los certificados temporales cada
dos semanas. En un entorno de prueba y en un entorno de producción, se recomienda usar un tronco In HTTPS
para proteger las comunicaciones entre los dispositivos móviles y el servidor de UAG. Vea Topologías de
publicación de SharePoint (http://go.microsoft.com/fwlink/?LinkId=216131) en TechNet para obtener más
información sobre las topologías usadas habitualmente para implementar servidores que ejecutan productos
de SharePoint 2010 a través de UAG.
Para crear el tronco HTTP, haga clic en el botón secundario en HTTP Connections y, a continuación, haga clic en
New Trunk.
Haga clic en Next.
64
En el paso 1 del asistente Create Trunk Wizard, haga clic en Portal Trunk y haga clic en Next.
65
En el paso 2 del asistente Create Trunk Wizard, escriba ContosoMobile en el cuadro de texto Trunk name.
Este nombre no es un URL explorable, sino que representa un nombre identificable y descriptivo para el
tronco HTTP.
En el cuadro de texto Public Host Name, escriba portal.contoso.com. Este valor expone un punto final para
el tronco HTTP que UAG usa para crear un entorno de un portal que publica todas las aplicaciones en una
misma página, por ejemplo, nuestro sitio SharePoint.
Seleccione la dirección IP que corresponda a la IP de red externa para la máquina virtual servidor de UAG.
Haga clic en Next.
66
En el paso 3 del asistente Create Trunk Wizard, haga clic en Add para abrir el cuadro de diálogo que permite
agregar el servidor de autenticación al tronco.
Haga clic en Add.
En la lista desplegable Server type, seleccione Active Directory.
En el cuadro de texto Server name, escriba demo2010a.contoso.com. Este es el nombre de dominio
completo (FQDN) para el controlador de dominio que se ejecuta en la máquina virtual SP2010-7a.
67
En la sección Connection settings, haga clic en Define domain controllers.
En la sección Connection settings, haga clic en Define.
En el cuadro de diálogo Domain Controllers, escriba la dirección IP interna para el controlador de dominio.
En la máquina virtual SP2010-7a, esta dirección IP es 192.168.150.1.
Haga clic en OK.
En la sección Search settings, haga clic en el botón … que se encuentra junto a Base DN.
En el cuadro de diálogo Search Root, en la lista desplegable Select Base DN, seleccione
CN=Users,DC=contoso,DC=com.
Haga clic en OK.
Active la casilla de verificación Include subfolders.
Establezca el valor de Level of nested groups en 0.
En la sección Server access, en el cuadro de texto User (domain\user), escriba contoso\administrator.
En el cuadro de texto password, escriba pass@word1.
68
Haga clic en OK.
Haga clic en Yes.
Seleccione el servidor demo2010a.contoso.com y haga clic en Select.
69
Haga clic en User provides credentials for each selected server. (En un entorno de un único servidor como el
que nos ocupa, puede elegir User selects from a server list.)
Active la casilla de verificación Use the same user name.
Haga clic en Next.
70
Haga clic en Use Forefront UAG access policies.
A efectos del desarrollo, las directivas de acceso predeterminadas de Forefront UAG serán suficientes. En un
entorno de producción, puede ajustar estas directivas a una configuración más específica para su entorno.
Haga clic en Next.
71
A efectos del desarrollo, las directivas de punto de acceso predeterminadas de Forefront serán suficientes. En
un entorno de producción, puede ajustar estas directivas a una configuración más específica para su entorno.
Haga clic en Next.
72
La última página del asistente Create Trunk Wizard muestra un resumen de la configuración del tronco.
Haga clic en Finish para finalizar la configuración del tronco.
73
10. Cree la aplicación de SharePoint
En la sección Applications de Forefront UAG Management Console, haga clic en Add.
En el asistente Add Application Wizard, haga clic en Next.
En el paso 2 del asistente Add Application Wizard, haga clic en Web.
En la lista desplegable Web, seleccione Microsoft SharePoint Server 2010.
74
Haga clic en Next >.
En el cuadro de texto Application name, escriba Contoso Intranet.
Se trata de un nombre descriptivo para la aplicación que va a publicar con el servidor de UAG. Este nombre
aparecerá en la página de inicio de UAG Portal.
75
Haga clic en Next.
76
Haga clic en Next.
A efectos del desarrollo, las directivas de punto de acceso predeterminadas de Forefront serán suficientes. En
un entorno de producción, puede ajustar estas directivas a una configuración más específica para su entorno.
Haga clic en Configure an application server.
77
Haga clic en Next.
Deje Address type como IP/Host.
En la lista Addresses, escriba el nombre de host o la dirección IP interna del servidor que ejecuta SharePoint
Server 2010 192.168.150.1. En función de su entorno, es posible que deba optar por usar el FQDN para el
servidor que ejecuta SharePoint Server o la dirección IP para el hardware de equilibrio de carga.
En la lista Paths, deje la entrada predeterminada «/». Esto indica que la aplicación de SharePoint publicada
se publica en el nivel raíz.
Haga clic en Http port y escriba 80 en el cuadro.
Como se ha indicado anteriormente, el uso de un puerto HTTP en lugar de un puerto HTTPS simplifica la
instalación y configuración de desarrollo. En un entorno de producción, debería usarse un puerto HTTPS para
cifrar las credenciales que se pasan entre los equipos cliente y el servidor de UAG.
En el cuadro de texto Public host name, escriba spwp7intranet. Este es el URL de asignación de acceso
alternativo en el servidor que ejecuta SharePoint que corresponde a la colección de sitios que publica.
78
Este valor es el URL que el servidor de UAG usará para publicar la aplicación en los equipos cliente. Cuando
acceda a la colección de sitios intranet.contoso.com a través de los clientes de servidor de UAG, use el URL
http://spwp7intranet.contoso.com. El servidor de UAG dirige la solicitud a SharePoint como
http://spwp7intranet.contoso.com una vez que el usuario se ha autenticado. La asignación de acceso
alternativo de SharePoint (que debe configurarse en pasos posteriores) asignará la solicitud a
http://intranet.contoso.com.
Haga clic en Next.
Active la casilla de verificación Use SSO.
Haga clic en Add.
En el cuadro de diálogo Authentication and Authorization Server, seleccione demo2010a.contoso.com.
79
Haga clic en Select.
En la sección Select client authentication method, haga clic en Both.
Active la casilla de verificación Allow rich clients to bypass trunk authentication.
Active la casilla de verificación Use Office Forms Based Authentication for Office client applications.
Haga clic en Next.
80
Haga clic en Yes.
En el cuadro de diálogo Portal Link, active la casilla de verificación Open in a new window. El vínculo del
portal es opcional porque la aplicación de Windows Phone 7 accede directamente a las API de SharePoint,
pero el vínculo es una buena herramienta para solucionar problemas.
81
Haga clic en Next.
Active la casilla de verificación Authorize all users.
En un entorno de desarrollo, conceder acceso a todos los usuarios a la colección de sitios de SharePoint
publicada proporciona máxima flexibilidad para realizar pruebas. En un entorno de producción, conceda acceso
únicamente a los usuarios y grupos que tienen permiso para acceder a la colección de sitios de SharePoint.
82
Haga clic en Next.
83
Haga clic en Finish.
11. Configure la aplicación de SharePoint
En Forefront UAG Management Console, en la sección Applications, seleccione Contoso Intranet y haga clic
en Edit.
84
En la ficha Portal Link, active las siguientes casillas de verificación: Computer portal, Premium mobile portal
y Non-premium mobile portal.
85
Haga clic en OK.
12. Active la configuración
En Forefront UAG Management Console, haga clic en el botón Activate de la barra de herramientas.
Aparece el cuadro de diálogo Activate Configuration.
86
Haga clic en Activate.
La nueva configuración se activa en el servidor de UAG.
Haga clic en Finish.
Espere hasta que la ventana de mensajes de la parte inferior de la consola de administración de Microsoft
Forefront UAG visualice el mensaje Activation completed successfully. Si bien en el cuadro de diálogo
Activation Configuration se indica que la configuración se ha activado correctamente, en realidad no ha
finalizado hasta que aparece el mensaje en la ventana de mensajes.
87
13. Configure y compruebe las asignaciones de
acceso alternativo de SharePoint
SharePoint debe configurarse para responder a solicitudes para http://spwp7intranet.contoso.com y asignar
las solicitudes a http://intranet.contoso.com.
1.
2.
3.
4.
5.
6.
En Administración central de SharePoint 2010, navegue a la sección Administración de aplicaciones y elija
Administración de aplicaciones Web.
Seleccione Intranet y elija Extender (Extender aplicación web) en la cinta.
En el cuadro de diálogo Extender una aplicación web a otro sitio web de IIS, escriba la siguiente configuración:
 Nombre: SharePoint - spwp7intranet.contoso.com – 80
 Puerto: 80
 Encabezado de host: spwp7intranet.contoso.com
 Zona: Intranet
Haga clic en Aceptar.
Navegue a Administración de aplicaciones | Aplicaciones web | Configurar asignaciones alternativas de
acceso para confirmar la configuración.
Elija Colección de asignaciones de acceso alternativas para la Intranet; debería ver la nueva entrada para
http://spwp7intranet.com.
14. Agregue entradas del archivo hosts al
entorno de desarrollo
En este escenario, las entradas del archivo hosts se usan para resolver el servidor de UAG y el servidor que
ejecuta SharePoint. También podrían usarse las entradas de DNS, pero los archivos hosts son una solución
alternativa aceptable en un entorno de desarrollo. En un entorno de producción, deben usarse entradas de
DNS para resolver nombres.
En el equipo en el que ejecuta el emulador de Windows Phone 7, agregue una entrada al archivo hosts que
apunte al nombre de host público y a la dirección IP asociada con la aplicación de portal de intranet de
Contoso en el servidor de UAG. El archivo hosts se encuentra en c:\windows\system32\drivers\etc.
192.168.1.171
spwp7intranet.contoso.com
De manera opcional, puede agregar una entrada al sitio principal del portal.
192.168.1.171
portal.contoso.com
88
15. Pruebe la configuración
En el equipo en el que ejecuta el emulador de Windows Phone 7, cierre todos los exploradores web para
asegurarse de que la entrada del archivo hosts se reconoce. A continuación, abra Internet Explorer y navegue
a http://spwp7intranet.contoso.com.
Aparecerá la Aplicación de servidor de UAG y el Portal de acceso a la red.
Descargue e instale el control ActiveX.
89
Haga clic en Instalar.
Haga clic en Sí.
Active la casilla de verificación Confiar en este sitio y haga clic en Confiar.
Escriba las credenciales de un usuario que tenga acceso al sitio de SharePoint publicado y haga clic en Iniciar
sesión.
90
El sitio de SharePoint se visualiza en el explorador web. En este punto, es posible acceder al sitio de
SharePoint publicado a través de UAG desde un dispositivo móvil como, por ejemplo, un dispositivo con
Windows Phone 7.
91
De manera opcional, puede probar el acceso a la página del portal de UAG escribiendo el URL del portal
http://portal.contoso.com en un explorador.
92
UAG también presenta un Premium Mobile Portal a clientes como Windows Phone. En el explorador del
emulador, escriba el URL para el portal, http://portal.contoso.com, para ser redirigido a la página de inicio de
sesión:
Escriba la credencial de Contoso (por ejemplo, Contoso\tonip y pass@word1) para ser redirigido a Mobile Portal.
93
Seleccione el enlace de la Intranet de Contoso para ver la página principal de SharePoint.
16. Pruebe el suministro de noticias RSS
Cuando los Productos de SharePoint 2010 se publican a través de UAG, algunas de las páginas
predeterminadas no se analizan correctamente. Para este documento, es de vital importancia la página
Activityfeed.aspx que representa el suministro de noticias consolidado. Pruebe su configuración siguiendo las
instrucciones que se indican a continuación.
94
Activityfeed.aspx
Vaya a la página Mi suministro de noticias y elija ver la fuente RSS.
Se visualiza el siguiente error.
Solución
La regla predeterminada para ocultar el cierre de sesión se aplica a la página ActivityFeed.aspx. Para cambiar
esta regla a fin de evitar que se aplique la regla, siga estos pasos:
Abra el archivo de configuración de AppWrap adecuado en un editor de texto. Los archivos se encuentran en
el directorio %ProgramFiles%\Microsoft Forefront Unified Access
Gateway\von\Conf\WizardDefaults\AppWrapTemplates.
Realice una copia de seguridad del archivo AppWrap apropiado para el protocolo del portal y edítelo:
HTTP_WhlFiltAppWrap_ForPortal for HTTP and HTTPS_WhlFiltAppWrap_ForPortal for HTTPS.
95
Localice la línea siguiente:
<!-- for sharepoint 2010 conditional appwrap hide log off -->
<URL case_sensitive="false">.*\.aspx.*</URL>
Modifíquela para que sea como la siguiente:
<!-- for sharepoint 2010 conditional appwrap hide log off changed to
exclude ActivityFeed.aspx -->
<URL case_sensitive="false">^.*(?<!(^|\\|/)(activityfeed))\.aspx.*</URL>
Guarde el archivo y active la nueva configuración.
Regrese a la página Mi suministro de noticias y haga clic en el botón RSS. La página debería representarse
correctamente y los URL se deberían rescribir correctamente.
96
Recursos
Forefront Unified Access Gateway en TechNet
http://go.microsoft.com/fwlink/?LinkId=216132&clcid=0xC0A
Blog Closer to the Edge
Autor: Jason Jones
Forefront UAG SP1 Endpoint Assessment Changes Impact Mobile Devices like iPads/iPhones
(http://go.microsoft.com/fwlink/?LinkId=216133)
Blog Silverlight Web Services Team
Workaround for accessing some ASMX services from Silverlight 4
(http://go.microsoft.com/fwlink/?LinkId=216134)
Acerca de los autores
Todd Baginski, MVP
Todd es un consultor independiente y reconocido en cinco ocasiones como Profesional más valioso
de Microsoft SharePoint que usa tecnologías SharePoint, Silverlight, Office, Windows Phone 7 y
.NET para crear sitios web y soluciones personalizadas para trabajadores de la información. Todd
es el autor y presentador del contenido para la sección Business Connectivity Services (BCS) del
programa SharePoint Microsoft Certified Masters (MCM) y un ponente habitual en las conferencias
de TechEd, SharePoint Connections y Microsoft SharePoint. Todd colabora de forma periódica en
columnas de la revista SharePointPro Connections y recientemente también ha trabajado como
editor técnico para el libro Professional Business Connectivity Services in SharePoint 2010 de Scot
Hillier y Brad Stevenson. Asimismo, Todd ha creado el material educativo Microsoft Business
Productivity Online Suite (BPOS) para SharePoint Online (SPO) 2010 mientras BPOS 2010 se
encontraba en las fases alfa y beta, y entregó el material educativo de BPOS/SPO en una
conferencia post-TechReady 11 solamente para los empleados de Microsoft.
Todd es una persona muy activa a quien gusta dedicar tiempo a su familia e ir a esquiar siempre
que se presenta la oportunidad. Dirección de contacto de Todd: [email protected]
Matthew McDermott, MVP
Matthew McDermott, Microsoft SharePoint Server MVP, es un miembro fundador de Aptillon, Inc.
y consultor principal para AbleBlue en Austin, Texas. AbleBlue se especializa en la consultoría de
integración, estrategia e implementación de SharePoint. Matthew es autor y especialista en
tecnologías SharePoint centradas en la administración, colaboración y búsqueda de contenido
web y en sistemas sociales; también ha liderado las implementaciones de SharePoint para
empresas Fortune 500 desde 2002. El blog de Matthew (www.ableblue.com/blog) contiene
temas de interés para programadores, profesionales de TI y usuarios. Dirección de contacto de
Matthew: [email protected]
97
En su tiempo libre, Matthew trabaja como adiestrador de perros para K9 Search • Austin, un equipo
de investigación K9 de voluntarios que presta servicios al FBI y a los departamentos de policía de
Austin y San Antonio. Matt es un talentoso cocinero y barman y pasa tanto tiempo libre con su
mujer como sus perros le permiten.
Ben Ari
Ben Ari es un ingeniero principal de seguridad de Microsoft especializado en UAG y proporciona
soporte para el producto para los clientes Premier y Professional de Microsoft de todo el mundo.
Ben también es un periodista y escritor de blogs muy activo; recientemente ha publicado
Microsoft Forefront UAG 2010 Administrator's Handbook (ISBN 978-1849681629). Dirección del
blog de Ben: http://blogs.technet.com/b/ben
98
Descargar