El listado de todas las actualizaciones de SharePoint 2010...
Solución a este problema de InfoPath sobre plataformas SPS2010
Un practico ejemplo, para casos en los que quieren usarse mas de un lenguaje de programción
Si tienes multiples subsitios dentro de una coleccion de sitios en SharePoint 2010 y quieres saber por cada uno de ellos, cuanto espacio ocupa, en diferentes medidas, aqui os dejo un script de PowerShell muy útil. Además este script, da el tamaño total de la suma de todos.
#====================================================================================
function GetWebSizes ($StartWeb)
{
$web = Get-SPWeb $StartWeb
[long]$total = 0
$total += GetWebSize -Web $web
$total += GetSubWebSizes -Web $web
$totalInMb = ($total/1024)/1024
$totalInMb = "{0:N2}" -f $totalInMb
$totalInGb = (($total/1024)/1024)/1024
$totalInGb = "{0:N2}" -f $totalInGb
write-host "El tamaño de los subsitios bajo:" $StartWeb " es de " $total "Bytes, el cual es " $totalInMb " MB o" $totalInGb "GB"
$web.Dispose()
}
#====================================================================================
function GetWebSize ($Web)
{
[long]$subtotal = 0
foreach ($folder in $Web.Folders)
{
$subtotal += GetFolderSize -Folder $folder
}
write-host "Sitio:" $Web.Title " tiene " $subtotal "KB"
return $subtotal
}
#====================================================================================
function GetSubWebSizes ($Web)
{
[long]$subtotal = 0
foreach ($subweb in $Web.GetSubwebsForCurrentUser())
{
[long]$webtotal = 0
foreach ($folder in $subweb.Folders)
{
$webtotal += GetFolderSize -Folder $folder
}
write-host "Sitio:" $subweb.Title " tiene " $webtotal "Bytes"
$subtotal += $webtotal
$subtotal += GetSubWebSizes -Web $subweb
}
return $subtotal
}
#====================================================================================
function GetFolderSize ($Folder)
{
[long]$folderSize = 0
foreach ($file in $Folder.Files)
{
$folderSize += $file.Length;
}
foreach ($fd in $Folder.SubFolders)
{
$folderSize += GetFolderSize -Folder $fd
}
return $folderSize
}
#====================================================================================
$siteurl = "http://intracepsa.cepsacorp.com"
#Llamada a la funcion para devolver el tamaño del la Intranet
GetWebSizes $siteurl
Este es uno de los primeros de una serie posts, cuyo objetivo es mostrar como se pueden realizar muchas de las labores de administracion de SharePoint 2010 habituales, con scripts de PowerShell.
Comenzamos con un sencillo script que permite aprovisionar el My Site de un usuario, unicamente hay que llamar a la siguiente funcion:
[Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")
[Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.Server")
Function CreateMySite($siteurl, $loginname)
{
$site = New-Object Microsoft.SharePoint.SPSite($siteurl)
$context = [Microsoft.Office.Server.ServerContext]::GetContext($site)
$upm = New-Object Microsoft.Office.Server.UserProfiles.UserProfileManager($context)
if ($upm.UserExists($loginname)) {
$profile = $upm.GetUserProfile([string]$loginname)
trap [Microsoft.Office.Server.UserProfiles.PersonalSiteExistsException]
{
Write-Host "WARNING: Ya existe el sitio personal del usuario: $loginname" -ForeGroundColor Red
continue
}
write-host "Creando el sitio personal para el usuario: $loginname" -ForeGroundColor Green
$profile.CreatePersonalSite();
} else {
Write-Host "WARNING: No existe el usuario: $loginname" -ForeGroundColor Red
}
$site.Dispose()
}
$siteurl = "http://misitio"
$loginname = "DOMINIO\USUARIO"
#Llamada a la funcion para crear el My Site
#CreateMySite $siteurl $loginname
En el caso que quieras provisionar todos los usuarios existentes en el UserProfile, en vez de utilizar la función anterior puedes usar esta otra:
[Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")
[Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.Server")
Function CreateMySite($siteurl)
{
$site = New-Object Microsoft.SharePoint.SPSite($siteurl)
$context = [Microsoft.Office.Server.ServerContext]::GetContext($site)
$upm = New-Object Microsoft.Office.Server.UserProfiles.UserProfileManager($context)
foreach ($userobject in $Profiles ) {
$loginname = $userobject.item("AccountName")
if ($upm.UserExists($loginname)) {
$profile = $upm.GetUserProfile([string]$loginname)
trap [Microsoft.Office.Server.UserProfiles.PersonalSiteExistsException]
{
Write-Host "WARNING: Ya existe el sitio personal del usuario: $loginname" -ForeGroundColor Red
continue
}
write-host "Creando el sitio personal para el usuario: $loginname" -ForeGroundColor Green
$profile.CreatePersonalSite();
trap
{
Write-Host "ERROR: Se ha producido un error al crear el sitio para: $loginname" -ForeGroundColor Red
continue
}
}else{
Write-Host "WARNING: No existe el usuario: $loginname" -ForeGroundColor Red
}
}
$site.Dispose()
}
$siteurl = "http://misitio"
#Llamada a la funcion para crear el My Site
#CreateMySite $siteurl
nov 11
17
SharePoint 2007/20010 dispone de un sistema de logs/trazar llamado Unified Logging System (ULS). Si quieres mas información sobre ULS puedes consultar este artículo de Microsoft: Introducción al registro del sistema de creación de registros unificado (ULS).
Cuando implementamos una aplicación sobre esta plataforma, es muy conveniente, registrar cualquier excepción al ULS para un futuro análisis, que nos permita evaluar y corregir el problema.
En SharePoint 2010 se implementa la clase SPDiagnosticsServiceBase, con la que podemos acceder de una forma mas cómoda que en versiones anteriores a este tipo de información, ya que cuenta con los métodos WriteEvent y WriteTrace, para ello.
El siguiente codigo muestra un ejemplo de como escribir en ULS volcando la información de una excepción capturada:
try
{
var i = 0;
var a = 2 / i;
}
catch (Exception ex)
{
SPDiagnosticsService.Local.WriteTrace(0, new SPDiagnosticsCategory("Mi Categoria", TraceSeverity.Unexpected, EventSeverity.Error), TraceSeverity.Unexpected, ex.Message, ex.StackTrace);
}
En el caso que queramos volcar información al ULS sin necesidad de estar dentro de un “catch” puedes usar esto:
SPDiagnosticsService.Local.WriteTrace(0, new SPDiagnosticsCategory("Mi Categoria", TraceSeverity.Unexpected, EventSeverity.Error), TraceSeverity.Unexpected, "Mi descripcion del error", string.Empty);
Por ultimo, existe una herramienta de Microsoft, para visualizar estos archivos de logs, llamada ULS Viewer, que puedes descargar de forma gratuita desde aquí.
Revisando el visor de eventos de los entornos de producción, donde está instalado SharePoint 2010, me he encontrado un error muy curioso, relacionado con el control TaxonomyPicker.ascx. La descripción del error es:
Error al cargar el archivo de plantilla de control /_controltemplates/TaxonomyPicker.ascx: Could not load type ‘Microsoft.SharePoint.Portal.WebControls.TaxonomyPicker’ from assembly ‘Microsoft.SharePoint.Portal, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c’.
Revisando el codigo del control TaxonomyPicker.ascx me he dado cuenta que en vez de aparecer una “,” aparece “,”.
<%@ Control className=”TaxonomyPickerControl” Language=”C#” Inherits=”Microsoft.SharePoint.Portal.WebControls.TaxonomyPicker,Microsoft.SharePoint.Portal,Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c” %>
Para solucionar este problema existen dos opciones:
Existe un articulo de soporte donde Microsoft, trata este error: KB2481844
Como hacer las cosas desde la interface web de SharePoin, no tiene mucho misterio y además puedes encontrarlo facilmente buscando en Internet, prefiero detallar como se harian las cosas programaticamente, ya que esto es lo que nos va a permitir personalizar SharePoint a nuestro gusto/necesidad.
Este es el caso de la creación de un subsitio y mas contratamente un sitio de tipo blog en idioma Español. A continuación os dejo una funcion, que crea un nuevo sitio utilizando la plantilla de blog: SPWebTemplate.WebTemplateBLOG (aunque se puede usar cualquier otra que necesitemos, para ello puedes consultar el listado de plantillas de sitio de SharePoint 2010). He de destacar que el idioma de creacion de estas plantillas enla funcion es el Spanish – Spain (Modern Sort), pero se puede usar cualquier otro, solo tienes que cambiar el LCID:
private void CreateBlogSite(SPWeb web, string siteUrl, string siteTitle, string siteDescription)
{
string siteTemplate = SPWebTemplate.WebTemplateBLOG; //epecifica la plantilla de sitio (Blog)
uint siteLocationID = 3082; //idioma Spanish - Spain (Modern Sort)
SPWebCollection subsite = web.Webs;
subsite.Add(siteUrl, siteTitle, siteDescription, siteLocationID, siteTemplate, true, false);
}
Para más informacion puedes consultar el metodo SPWebCollection.Add.
Esta es la forma de establecer a través de código el administrador primario y secundario de una coleccion de sitios en SharePoint 2010. Para ello vamos a usar las propiedades SPSite.Owner y SPSite.SecondaryContact. Esta es un funcion de ejemplo que puede mejorarse verificando si los usuarios vienen vacios, o si el objeto SPSite es nulo… pero espero que os sirva a modo plantilla sobre la que partir. He decidido pasarle como parámetro el objeto SPSite, ya que asi puede ser llamada, por ejemplo, desde un WebPart de administración como desde la activación de una característica:
private bool SetAdministrators(SPSite site, string admPrimary, string admSecondary)
{
bool result = false;
try
{
SPUser PrimaryUser = site.RootWeb.EnsureUser(admPrimary);
SPUser SecondaryUser = site.RootWeb.EnsureUser(admSecondary);
site.Owner = PrimaryUser; //asigna el administrador primario
site.SecondaryContact = SecondaryUser; //asigna el administrador secundario
result = true;
}
catch (Exception) { }
return result;
}
Como me ha tocado crear nuevos sitios a través del modelo de objetos, he tenido que pegarme con las plantillas estandar que trae por defecto SharePoint 2010… Como creo que es util tener tanto la definición, como el listado de plantillas que se pueden usar, adjunto un listado de estas:
Más información sobre las plantillas de sitio de SharePoint 2010: aquí.