viernes, 30 de enero de 2015

Error OMS_6118 al intentar crear una suscripción en Azure para virtualizar SharePoint

El proyecto es tener una granja de SharePoint en Azure en un ambiente hibrido donde los usuarios de la red interna se puede autenticar en el portal de SharePoint con sus cuentas de Windows.

El problema que tuvimos fue que los créditos de Azure se compraron por licenciamiento Open y la cuenta registrada en Azure al momento de adicionar la suscripción daba el siguiente error:

Sorry, we could not complete the operation. Please try again later or reload the web page [OMS_6118]

La clave de la solución me la dio el sugiente comentario en el foro:

“I was having the same issue, tried about 20 times with no luck. But first time I checked the "Microsoft can contact me for marketing purposes" checkbox, I got my subscription created.”http://answers.flyppdevportal.com/categories/azure/azurebilling.aspx?ID=5ff93290-f7b0-4b2f-9b03-097e17dfc6c4

Al parecer el problema esta con la cuenta que estamos utilizando para agregar la suscripción en Azure.  Las cuentas de empresas se deben de registrar en el sistema de identidades de Microsoft como lo es live.com, y este a su vez se asocia a Azure.

La solución:

Sabiendo de antemano esto, ingrese a www.live.com y me autentique con la cuenta y sorpresa me dio la bienvenida (es decir el usuario nunca había ingresado a live.com a revisar su perfil). 

image

Valide el tema de aceptar correos y lo volví a guardar.   Regrese a Azure e intente de nuevo el mismo procedimiento y adivinen que paso… funcionó! Guiño

image

Eso es todo a partir de ello pudimos empezar a trabajar con la creación de la VPN para comunicar el ambiente local (On Premises) y de la Nube o sea Azure.

Así que SharePonit vive en Azure también en un ambiente híbrido con muchas posibilidades para crecimiento y escalabilidad.

Hasta la próxima!,

Juan Manuel Herrera Ocheita

jueves, 15 de enero de 2015

Los roles de la autenticación por formularios pareciera no funcionar en SharePoint 2013

 

La autenticación por formularios en SharePoint existe desde la versión 2007 y es la respuesta de Microsoft para proveer otra forma de autenticación que no sea a través del Directorio Activo.  Este método de autenticación a evolucionado con las versiones más recientes de SharePoint y se ha convertido en una implementación más de la autenticación basada en reclamos permitiendo al administrador de IT o consultor de SharePoint personalizar el método de autenticación elegido de forma muy flexible.

En este artículo resolveremos el acertijo porque no funciona el rol de FBA dentro de un grupo de SharePoint y cual es la aplicación correcta.

En la imagen de abajo muestra el flujo de autenticación de una implementación por formularios.  Fundamentalmente el usuario navega a la URL del sitio de SharePoint y al momento de autenticarse es redirigido a una página aspx donde le solicita el usuario y la contraseña esta solicitud es trasladada al servicio en SharePoint para autenticar los usuarios el cual es conocido como Security Token Service o STS este valida el tipo de autenticación que en este caso es Autenticación basada en Reclamos y en una implementación de Formularios el cual conoce que su proveedor de membresía es una base de datos en SQL Server y allí valida que exista el usuario, que sea valida su contraseña y luego si es válida pasa al proceso de autorización sino lo es es rechazada la solicitud.

Forms-based authentication process

La implementación del repositorio de credenciales en la autenticación por formularios es a través de una implementación de base de datos denominada ASP.NET membership and role providers.  Dentro del esquema de base de datos se almacena los usuarios y los roles y la combinación de ambos. 

Expanded aspnetdb_claim node

Podemos concluir que los Roles es una forma de agrupar los usuarios dentro de esta implementación. 

EXEC aspnet_Roles_CreateRole 'MyAppName', 'Employee'
EXEC aspnet_Roles_CreateRole 'MyAppName', 'TeamManager'
EXEC aspnet_Roles_CreateRole 'MyAppName', 'CEO'

EXEC aspnet_UsersInRoles_AddUsersToRoles 'MyAppName', 'bob', 'Employee', 8
EXEC aspnet_UsersInRoles_AddUsersToRoles 'MyAppName', 'mary', 'TeamManager', 8
EXEC aspnet_UsersInRoles_AddUsersToRoles 'MyAppName', 'jack', 'CEO', 8
EXEC aspnet_UsersInRoles_AddUsersToRoles 'MyAppName', 'jack', 'Admin', 8

Por tanto los Roles a diferencia de los usuarios deben de aplicarse directamente a los permisos del sitio y no a otro grupo de SharePoint.  En ocasiones hemos aplicado a grupos de SharePoint y SharePoint no logra descubrir los permisos del usuario, en cambio por el otro lado si ha funcionado.


SharePoint4Fun!,


Juan Manuel Herrera Ocheita

jueves, 8 de enero de 2015

Nuevo hallazgo sobre como evitar la autenticación cuando se esta desplegando contenido de un App en SharePoint 2013

 

Luego que a realizado el procedimiento para registrar el nombre para las Apps en el DNS y también las del portal, pueda con que se tope que aún le pide las credenciales del usuario a pesar de que esta en una red interna o Intranet.  Si esto le sucede pueda que el problema sea el permiso que tiene el usuario.

Recientemente nos hemos percatado que el permiso mínimo que debe de tener un usuario en SharePoint para que no le solicite credenciales es Read y No Restricted Read.  Así valide eso por favor.  Algo que debe de tomar en cuenta es que SharePoint valida siempre sobre el nivel de permisos mayor que tenga el usuario esto para evitar conflictos en los permisos que puedan ser otorgados a los usuarios a través de los diferentes grupos y objetos de SharePoint (Sitios, Bibliotecas, Listas y elementos)

NOTA: Si usted esta teniendo este problema en una IOS su problema pueda derivarse a que el navegador de SAFARI no tiene las opciones de autenticación que si dispone IE por lo que una alternativa sería utilizar el Firewall de su organización para que guarde las credenciales del usuario cada vez que utilice el navegador Safari.  Ver más información aquí: http://sharepoint.stackexchange.com/questions/38086/sharepoint-repeatedly-prompting-ipad-users-for-credentials

Procedimiento para configurar Internet Explorer

How to hide the message "Only secure content is displayed":

1. In IE 10, go to Tools (alt+x) + Internet Options.

2. Go to the “Security TAB”

3. Select “Local Intranet”

4. Add to this zone the next domains:

a. Microsoftonline.com

b. Sharepoint.com

c. Yahooapis.com

5. Click on “Close” + “Apply”

6. Go to “Custom Level”:

7. Click on “enable” under the section “Display Mixed Content”:

8. Close the IE 10 completely, and re – open it (this is only required the first time, after applying the procedure).

9. Done.

Script en PowerShell para actualizar correo y puesto del perfil de usuario

Con la tendencia mundial de migración hacia la nube y en especial a Office 365, la migración de dominios que estén listos para Office 365 es uno de los caminos a seguir, pero en este proceso de migración pueden salir las cosas mal, por ello he escrito un Script en PowerShell para que actualice la propiedad de WorkEmail y Title (o sea Puesto) en el servicio de Perfiles de Usuario, basado en un archivo CSV con el objetivo de corregir algún error que se haya efectuado o bien porque no se han migrado aún los correos al nuevo dominio pero es necesario que sigan funcionando las alertas de SharePoint con la cuenta de correo anterior… Bueno y lo del puesto no sería necesario si se sincroniza, pero si se desea hacer una rápida actualización de un puñado de usuarios de esta propiedad sin necesidad de sincronizar todos los usuarios, es una solución práctica.

Como el Script se basa en un archivo CSV vamos a describir el formato de este archivo.

Formato del Archivo CSV

El formato CSV es un archivo de texto que tiene en su primera línea contiene el nombre de cada columna como parte del encabezado y se separa por una coma. Luego cada línea siguiente representa una fila y se separa igualmente por comas

Los nombres de las columnas del archivo CSV deben de tener por lo menos las siguientes:

NewAccount: Es la cuenta de usuario. Ejemplo: DOMINIO\NOMBRE_USUARIO

Title: El Puesto del usuario. Ejemplo: NOMBRE DEL PUESTO

Email: EL correo del usuario. Ejemplo: nombre_usuario@dominio.com

Un ejemplo del contenido de un archivo es el siguiente

NewAccount,Title,Email

DOMINIO\NOMBRE_USUARIO,Nombre del Puesto,nombre_usuario@dominio.com

El Script

 

#Primera línea de archivo UpdateUPAProperties.ps1

#Primero solicitaremos dos parámetros; $archivoEntrada = Que es la ruta de la ubicación del archivo csv y $misitioUrl que la URL de My Site. 

param (
    [string]$archivoEntrada , [string]$miSitioUrl
)

#Valida si fue ingresado el parámetro $archivoEntrada, sino le asigna un valor predeterminado para pruebas
if ($archivoEntrada -eq $null -or $archivoEntrada -eq "")
{
    $archivoEntrada = "E:\Infoware\Scripts\PruebaActualizaPropiedadesPerfilUsuario.csv"

    Write-Host "No ha recibido parametro archivoEntrada"
}

#Valida si fue ingresado el parámetro $miSitioUrl sino le asigna uno predeterminado
if ($miSitioUrl -eq $null -or $miSitioUrl -eq ""){
    $miSitioUrl = http://misitio.dominio.com
}

#Se Cargan las librerias de SharePoint para ejecutar la actualización de los perfiles de usuario

if((Get-PSSnapin | Where {$_.Name -eq "Microsoft.SharePoint.PowerShell"}) -eq $null) {
    Add-PSSnapin Microsoft.SharePoint.PowerShell;
}
[reflection.assembly]::Loadwithpartialname("Microsoft.Office.Server.Search") | out-null
[reflection.assembly]::Loadwithpartialname("Microsoft.Office.Server") | out-null

#Se Carga en memoria el Administrador de Perfiles de Usuario para ello es necesario la url que solicitamos en el parámetro e instanciar en memoria la colección de sitios y el sitio principal de MySite.
$site=Get-SPSite $miSitioUrl
$web=$site.RootWeb
$serverContext=[Microsoft.Office.Server.ServerContext]::GetContext($site)
$upm=New-Object Microsoft.Office.Server.UserProfiles.UserProfileManager($serverContext)


# Ahora cargaremos en memoria como una tabla el archivo CSV
$FileExists = (Test-Path $archivoEntrada -PathType Leaf)
if ($FileExists) {
   "Loading $archivoEntrada for processing..."
   $listadoUsuarios = Import-CSV $archivoEntrada
} else {
   "$archivoEntrada not found - stopping import!"
   exit
}

#El objetivo de esta función es actualizar el valor de la propiedad del perfil de usuario en cuestión

function set-SPProfileProperty([string]$propertyName, [string]$val, $up)
{

        #Validamos que no venga el perfil de usuario nulo
         if($up -ne $null)
        {

            #Obtenemos la propiedad por su nombre
            $property = $up.Properties.GetPropertyByName($propertyName)

     #Validamos que no si hayamos obtenido la propiedad


            if (-not [System.String]::IsNullOrEmpty($property))
            {
                $up[$propertyName].value = $val;
                $up.Commit();
                write-host "Actualizo la propiedad " $propertyName " con el valor" $val -ForegroundColor yellow
            }
        }
 
    Write-Host "Done" -foregroundcolor green
}

#Recorremos la tabla en memoria del archivo CSV

foreach ($row in $listadoUsuarios)
{
   $loginName = $row.NewAccount

   #Validamos que obtuvimos la columna NewAccount que trae la cuenta del usuario
   if( $loginName)
   {
        #validamos que el usuario exista en los perfiles de usuario
        if($upm.UserExists($loginName)){

            #Obtenemos el Perfil del Usuario
            $up = $upm.GetUserProfile($loginName);

            #Validamos que hayamos obtenido el perfil del usuario
            if($up) {
                $Puesto = $row.Title
                $Correo = $row.email       

                    #Si la columna Title trae valor invocamos la función para que modifique la propiedad en UPA
                    if($Puesto) {
                        set-SPProfileProperty -propertyName "Title" -val $Puesto -up $up
                
                    }

                   #Si la columna Corre trae valor invocamos la función para que modifique la propiedad en UPA

                    if($Correo) {
                        set-SPProfileProperty -propertyName "WorkEmail" -val $Correo -up $up
                    }
            }    
        }else
        {
            Write-Host "Usuario no existe " $loginName -ForegroundColor Red
        }
   }
}


Write-Host "End of file"
# Fin del archivo ps1

Procedimiento de Ejecución

Para ejecutar el Script puede utilizar PowerShell de Windows 3.0 o bien la consola de administración de SharePoint 2013.  Abajo una imagen que muestra como ejecutar el Script desde una ubicación predeterminada.

image

Bueno amigos espero les sirva el Scrip como lo hizo conmigo.

Hasta la próxima!… SharePoint4Fun!,

Juan Manuel Herrera Ocheita

sábado, 3 de enero de 2015

El nombre del usuario no aparece cuando se le asigna a un grupo de SharePoint 2013

Este error es raro de que suceda y su comportamiento es extraño. 

Les explicó:  Cuando se realiza la búsqueda del usuario en la ventana de búsqueda aparece debidamente el nombre y el puesto del usuario pero cuando se asigna al grupo solo aparece el puesto y no el nombre del usuario, como se muestra en la siguiente imagen: 

image

Pero si le asignamos directamente el permiso al usuario este si se muestra correctamente.

Entonces, qué está sucediendo?, Bueno realizando algunas pruebas e investigando como estaban asignados los permisos descubrí que el grupo Propietarios estaba asignado como propietario del grupo el mismo grupo. 

Lo inaceptable del caso es que SharePoint no valida que se pueda asignar así mismo el mismo grupo, y esto provoca este error extraño.  

Cual es la razón porque SharePoint permite esto.  Bueno la idea de asignar un grupo como propietario es que varios usuarios puedan atender la solicitud de usuarios que deseen ser miembros del grupo a través de las opciones de configuración del grupo como se muestra en la siguiente imagen:

image

Lo más extraño de todo es que esta configuración funciona correctamente en el SPO o SharePoint Online y sucede cuando al crear el sitio le indicamos que asigne permisos exclusivos y lo configura así.

La solución para la versión On premises SharePoint 2013 con Service Pack 1.0 es asignar un usuario u otro grupo que no sea el mismo.

image

Con ello se corrije el problema encontrado en una instalación On Premises.

Hasta la próxima SharePont4Fun!,

Juan Manuel Herrera Ocheita