Archivo de la categoría: PowerShell

Eliminar características de la base de datos de contenido con PowerShell

Una de mis tareas es revisar el Analizador de mantenimiento de SharePoint 2010, donde quedan registrados problemas que pueden hacer que una granja de SharePoint tenga problemas de seguridad, escalabilidad, rendimiento…

Uno de los problemas que he detectado y que viene siendo recurrente, es soluciones han sido eliminadas, antes de que las características correspondientes hayan sido desactivadas de colecciones de sitios y sitios.

Este problema queda registrado en el  Analizador de mantenimiento, con la categoría a nivel de granja: “Missing server side dependencies“.

Dentro de esta categoría, puedes encontrar registros como el siguiente, donde se detallo el problema:

[MissingFeature] Database [_WSS_DSI01] has reference(s) to a missing feature: Id = [e8389ec7-70fd-4179-a1c4-6fcb4342d7a0]. The feature with Id e8389ec7-70fd-4179-a1c4-6fcb4342d7a0 is referenced in the database [_WSS_DSI01], but is not installed on the current farm. The missing feature may cause upgrade to fail. Please install any solution which contains the feature and restart upgrade if necessary.

Este mensaje de error indica un nombre de base de datos de contenido (_WSS_DSI01) y el identificador de la característica (e8389ec7-70fd-4179-a1c4-6fcb4342d7a0), lo malo es que este error, no informa sobre los sitios o colecciones de sitios donde la característica existe y además, aunque supiéramos donde se ha activado esta característica, no es posible desde el interfaz de usuario desactivarla, ya que dicha solución se ha eliminado de la granja.

El siguiente script de PowerShell, nos informa de que sitios o colecciones de sitio de la base de datos de contenido, contienen la referencia a esta característica y fuerza la desactivación de de esta.

function Remove-SPFeatureFromContentDB($ContentDb, $FeatureId, [switch]$ReportOnly)
{
    $db = Get-SPDatabase | where { $_.Name -eq $ContentDb }
    [bool]$report = $false
    if ($ReportOnly) { $report = $true }
    $db.Sites | ForEach-Object 
    {
        Remove-SPFeature -obj $_ -objName "site collection" -featId $FeatureId -report $report
        $_ | Get-SPWeb -Limit all | ForEach-Object 
        {
            Remove-SPFeature -obj $_ -objName "site" -featId $FeatureId -report $report
        }
    }
}

function Remove-SPFeature($obj, $objName, $featId, [bool]$report)
{
    $feature = $obj.Features[$featId]
    if ($feature -ne $null) 
    {
        if ($report) 
        {
            write-host "Feature found in" $objName ":" $obj.Url -foregroundcolor Red
        }
        else
        {
            try 
            {
                $obj.Features.Remove($feature.DefinitionId, $true)
                write-host "Feature successfully removed from" $objName ":" $obj.Url -foregroundcolor Red
            }
            catch 
            {
                write-host "There has been an error trying to remove the feature:" $_
            }
        }
    }
    else 
    {
        #write-host "Feature ID specified does not exist in" $objName ":" $obj.Url
    }
}

 

Si únicamente queremos obtener el listado de sitios y colecciones de sitios, donde se referencia esta característica, deberás utilizando de la siguiente forma:

Remove-SPFeatureFromContentDB -ContentDB "_WSS_DSI01" -FeatureId "e8389ec7-70fd-4179-a1c4-6fcb4342d7a0" –ReportOnly

 

Si por el contrario, además de obtener el listado, deseas eliminar las referencias de la base de dato de contenido, deberás utilizarlo como anteriormente, el único cambio es que has de eliminar el parámetro “–ReportOnly”:

Remove-SPFeatureFromContentDB -ContentDB "_WSS_DSI01" -FeatureId "e8389ec7-70fd-4179-a1c4-6fcb4342d7a0"

 

Una vez hayas eliminado todas las referencias erróneas, es necesario volver a analizar  la categoría: “Missing server side dependencies” dentro del Analizador de mantenimiento, para comprobar que los errores han desaparecido.

Referencia: get-spscripts.com

 

Configurar Remote Blob Storage (RBS) en SharePoint 2010

Con este post quiero explicar como se ha de configurar Remote Blob Storage o RBS en SharePoint 2010. Parto que todos sabemos que es RBS y los tipos de contenido Blob, únicamente aclarar que este sistema de almacenar ficheros en File System es algo propio de SQL Server 2008 llamado FILESTREAM y SharePoint 2010 lo único que hace es a través de la siguiente configuración, permitir que dichos ficheros (han de ser de gran tamaño) se almacenen en el sistemas de archivos en vez de en base de datos con lo cual, se tenga una mayor velocidad de acceso…

Requisitos: La versión mínima de SQL Server seria: Microsoft SQL Server 2008 R2, Microsoft SQL Server 2008 con Service Pack 1 (SP1) y Cumulative Update 2.

Aclarado esto, vamos a ver los pasos a seguir a la hora de activar RBS en una base de datos de contenido de SharePoint 2010 y antes de nada debemos asegurarnos que la cuenta que vamos a utilizar es miembro del grupo de Administradores de SharePoint y miembro de SQL Server con los roles de dbcreator y securityadmin.

1) Partimos que tenemos claro en que base de datos de contenido de SharePoint vamos a habilitar RBS, así que lo primero es habilitar FILESTREAM en nuestro servicio de SQL Server, para ello:

Abrimos “SQL Server Configuration Manager”, seleccionamos “SQL Services” y en la ventana de la derecha, accedemos a las propiedades de “SQL Server”. Esto nos abrirá una nueva ventana sobre la que pincharemos en la pestaña “FILESTREAM” y activaremos las siguientes opciones:

  • “Enable FILESTREAM for Transact-SQL access” 
  • “Enable FILESTREAM for file I/O streaming access” 
  • “Allow remote clients to have streaming access to FILESTREAM data”

2) Tras habilitar en el servicio SQL Server el FILESTREAM, debemos activarlo en SharePoint, para ello abrimos “SQL Server Management Studio”, y ejecutamos el siguiente script sql:

Use [master]
Exec sp_configure filestream_access_level, 2
Reconfigure

Una vez ejecutado, abrimos el “SharePoint 2010 Management Shell” para identificar el nombre de la base de datos de nuestra Web Application (también puede hacerse de un Site Collection) y escribimos:

$db = Get-SPContentDatabase –WebApplication http://miintranet
$db

Tras obtener el nombre (Name) de la base de datos, volvemos a  abrir el “SQL Server Management Studio” y ejecutamos las siguientes sentencias sql:

  • Creación de una clave maestra para nuestra base de datos:
Use [DemoContentDB]
If not exists (select * from sys.symmetric_keys where name =
N'##MS_DatabaseMasterKey##')create master key encryption by
password = N'Admin Key Password !2#4'
  • Creación del filegroup:
If not exists (select groupname from sysfilegroups where groupname=
N'RBSFilestreamProvider')alter database [DemoContentDB] 
add filegroup RBSFilestreamProvider contains filestream
  • Una vez tenemos el filegroup, debemos añadir el archivo de filestream (en este ejemplo lo creamos en la ruta C:\RBSDataStore):
Alter database [DemoContentDB] add file (name = 
RBSFilestreamFile, filename = 'C:\RBSDataStore') to filegroup RBSFilestreamProvider

Para comprobar que todo se ha creado correctamente, abrimos el explorador de archivos y comprobamos que la carpeta ha sido creada:

3) El siguiente paso es instalar el proveedor RBS en los servidores de SQL Server y SharePoint 2010, para ello debemos descargar el paquete “RBS.msi” de Microsoft: http://go.microsoft.com/fwlink/?LinkID=177388 y realizar la instalación desde consola, para ello:

  • Accedemos al servidor SQL Server de la granja
  • Copiamos el paquete descargado “RBS.msi” a: “C:\SPSetupInfo\
  • Abrimos la “Consola de Windows” y ejecutamos el siguiente comando en “C:\SPSetupInfo\“:
msiexec /qn /lvx* rbs_install_log.txt /i RBS.msi TRUSTSERVERCERTIFICATE=true FILEGROUP=PRIMARY DBNAME="DemoContentDB" DBINSTANCE="SQL\SQLSP" FILESTREAMFILEGROUP=RBSFilestreamProvider FILESTREAMSTORENAME=FilestreamProvider_1

Los dos únicos parámetros que debemos tener en cuenta son el nombre de la base de datos y la instancia de SQL Server.

La ejecución de este comando puede tardar varios minutos, puedes verificar si ha terminado, desde el administrador de tareas de Windows buscando el proceso “msiexec.exe“.

Una vez finalizado debemos comprobar en el archivo de log que deja en  “C:\SPSetupInfo\rbs_install_log.txt’” que la instalación ha ido correcta, para ello buscamos casi al final del archivo el siguiente mensaje:

 Si todo ha ido correctamente, debemos instalar el anterior paquete en todos los servidores de SharePoint de la granja:

  • Accedemos al resto de servidores de SharePoint 2010 de la granja
  • Copiamos el paquete descargado “RBS.msi” a: “C:\SPSetupInfo\
  • Abrimos la consola de Windows y ejecutamos el siguiente comando en “C:\SPSetupInfo\“:
msiexec /qn /lvx* rbs_install_log.txt /i RBS.msi DBNAME="DemoContentDB" DBINSTANCE="SQL\SQLSP" ADDLOCAL=Client,Docs,Maintainer,ServerScript,FilestreamClient,FilestreamServer

Los dos únicos parámetros que debemos tener en cuenta son el nombre de la base de datos y la instancia de SQL Server. Se paciente porque este proceso tardara unos minutos en cada uno de los servidores de la granja.

Una vez finalizado debemos comprobar que las bases de datos se han creado en nuestra base de datos de contenido “DemoContentDB”, así que volvemos a  abrir el “SQL Server Management Studio”, navegamos hasta la base de datos y verificamos que nuevas tablas con el prefijo “mssqlrbs_” han sido creadas:

4) Tras configurar RBS, solo queda activar y especificar el proveedor en SharePoint 2010, por lo que:

  • Volvemos a abrir el “SharePoint 2010 Management Shell” y ejecutamos el siguiente script:
$db = Get-SPContentDatabase -Site http://miientranet/sitios/DemoSite
$db
$rbss = $db.RemoteBlobStorageSettings
$rbss | format-list
$rbss.Installed()
$rbss.Enable()
$rbss.SetActiveProviderName($rbss.GetProviderNames()[0])
$rbss | format-list

El único que parámetro que hay que indicar es la url de la colección de sitio donde debemos activarlo.

5) El ultimo paso es comprobar que los ficheros que subimos a nuestro sitio, se están almacenando físicamente en disco en vez de hacerlo en base de datos, para ello subimos varios documentos a SharePoint y tras hacerlo, comprobamos como en el directorio “C:\RBSDataStore” se ven reflejados:

Crear una Colección de Sitio en una nueva base de datos de contenido en SharePoint 2010

Por defecto, SharePoint 2010 al crear una Aplicación Web (o Web Application), internamente genera una nueva base de datos de contenido, donde almacenará toda la información que haya dentro de este nuevo sitio, es decir, la información de Colecciones de Sitios y Subsitios…

Se nos puede dar el caso que queramos, por diferentes motivos (mantenimiento, escalabilidad, seguridad, etc.), crear una Colección de Sitio en una base de datos diferente, a la que tiene por defecto una Aplicación Web… en ese caso y como desde la interface Web de SharePoint 2010 no se permite realizar este tipo de acciones, debemos recurrir a un pequeño script de PowerShell, con el que podremos hacerlo de una forma muy sencilla.

El siguiente script crea una una Colección de Sitio en una nueva base de datos:

$w = Get-SPWebApplication -Identity "http://miintranet"
New-SPContentDatabase "DemoContentDB" -DatabaseServer "localhost\SharePoint" -WebApplication $w
New-SPSite "http://miintranet/sitios/DemoSite" -OwnerAlias "SPDOMAIN\omartin" -ContentDatabase "DemoContentDB" -Name "Demo Site"
Set-SPContentDatabase -Identity "DemoContentDB" -Status Disabled

Para que no haya duda, voy a comentar el script:

  • Lo primero que hacemos es definir sobre que Aplicación Web (en este caso: http://miintranet) vamos a crear la nueva Colección de Sitio.
  • El siguiente paso, es la creación de una nueva base de datos asignándola a la Aplicación Web, para ello debemos indicar, el nombre de la base de datos, el servidor SQL Server y el objeto SPWebApplication que hemos definido anteriormente.
  • Una vez la base de datos esta lista, creamos la Colección de Sitio, por lo que especificamos varios parámetros obligatorios
  • Por ultimo u no menos importante, si solo queremos que en esta base de datos este esta Colección de Sitio y no se creen las nuevas Colecciones que vayamos creando en esta base de datos, debemos de ponerla offline (en caso de no ser requerido, esta ultima linea se puede comentar).

Referencia de comandos de PowerShellGet-SPWebApplication, New-SPContentDatabase, New-SPSite, Set-SPContentDatabase.

 

SharePoint Designer: Unexpected error on server associating the workflow

Utilizando los workflows estándar de SharePoint 2010, nos ha aparecido el siguiente problema, cuando hemos intentado desde SharePoint Designer 2010 publicar un Workflow con múltiples pasos de aprobación: “Errors were found when compiling the workflow. The workflow files were saved but cannot be run. Unexpected error on server associating the workflow“. En la siguiente imagen podemos ver la pantalla de error del Designer:

Buceando en Internet, he encontrado que Microsoft tiene reportado en el siguiente articulo: http://support.microsoft.com/kb/2557533 este problema, en el que se indica que es necesario aumentar la propiedad UserDefinedWorkflowMaximumComplexity, para poder implementar workflows con muchos pasos.

El valor actual de dicha propiedad se encuentra por defecto en 7000 por lo que podríamos aumentarlo a 30000 para que no nos vuelva a pasar este problema… para ello lo único que debemos hacer es ejecutar este sencillo script de PowerShell , donde se aumenta el valor de UserDefinedWorkflowMaximumComplexity:

 

$app = get-spwebapplication http://miintranet.com
Write-Host "Limite actual: " $app.UserDefinedWorkflowMaximumComplexity
$app.UserDefinedWorkflowMaximumComplexity = 30000
$app.Update()
Write-Host "Nuevo limite: " $app.UserDefinedWorkflowMaximumComplexity

 

Por ultimo solo queda reiniciar el servicio IIS con un IISReset de todas las maquinas de la granja, y volver a publicar el workflow desde Designer…

Actualización: Otra solución a este problema, que personalmente no he probado, es la de realizar unas pequeñas modificaciones en el web.config de la aplicación, como se indica en Manjuke’s Blog sin necesidad de tener que tocar parámetros de objetos SharePoint.

 

Libro: Introducing Windows Server 2012, gratuito

Aprovecha y descargate de forma gratuita este libro “Introducing Windows Server 2012” (en formato PDF), escrito por parte del equipo de Windows Server y publicado por Microsoft Press.

Este libro esta dirigido a toda persona de IT, que quiera conocer las mejoras que incorpora el nuevo sistema operativo de Microsoft: Windows Server 2012 (eso si, comentar que el libro esta basado en la versión beta de este producto).

En sus casi 260 paginas, se detalla su nueva interface, las nuevas herramientas de administración, mejoras a nivel de PowerShell, pasando por cientos de características a nivel de redes, almacenaje y virtualización.

Puedes descargarte esta imagen desde aqui: http://go.microsoft.com/FWLink/?Linkid=251464

 

 

Aumentar el numero de filas del BCS en SharePoint 2010

Después de algún tiempo sin publicar ninguna entrada… he vuelto a sacar un rato para ello. Esta vez, se trata de un error muy común cuando trabajamos con listas externas en SharePoint 2010. Las listas externas están basadas en tipos de contenido externos, los cuales podemos crear a través de BCS (Busines Conectivity Service).

Una vez hemos configurado la nueva cuenta de acceso en el Sercure Storage Service y hemos creado tanto el BCS como la lista basada en el nuevo tipo de contenido externo, accedemos a la lista y vemos el siguiente error:

 

No se puede mostrar este elemento web. Para obtener información sobre
cómo solucionar el problema, abra esta página web en un editor HTML
compatible con Microsoft SharePoint Foundation, como Microsoft SharePoint
Designer. Si el problema persiste, póngase en contacto con el administrador
del servidor web.

Identificador de correlación:9ba64368-5a98-4064-90b8-c9f9681d9e66

Revisando los logs de SharePoint con ese identificador de correlación obtenernos mas información sobre el error:

Error while executing web part: Microsoft.BusinessData.Runtime.ExceededLimitException:
El conector de bases de datos limitó la respuesta. La respuesta de la base de datos
contiene más de '2000' filas. La cantidad máxima de filas que se pueden leer a través
del conector de base de datos es '2000'. El límite puede cambiarse mediante el cmdlet
'Set-SPBusinessDataCatalogThrottleConfig'...

Lo que nos quiere decir este error es que se ha superado el límite de filas por defecto (2000) que se pueden obtener en una consulta, mediante el BCS.

Para solucionar este error, debemos recurrir al PowerShell para aumentar dicho limite…

#Define el Proxy BCS
$bdcAppProxy = Get-SPServiceApplicationProxy | where {$_ -match "BDC_*"}
$throttleDatabaseItems = Get-SPBusinessDataCatalogThrottleConfig -Scope Database -ThrottleType Items -ServiceApplicationProxy $bdcAppProxy
#Muestra los items antes de la modificacion
$throttleDatabaseItems
#Modifica el numero de elementos en base de datos
Set-SPBusinessDataCatalogThrottleConfig -Identity $throttleDatabaseItems -Maximum 1000000 -Default 5000
#Muestra los items despues de la modificacion
$throttleDatabaseItems

 

Script para ver donde se esta usando una caracteristica en SharePoint 2010

Es posible que en algun momento dado neceistes saber, donde se esta utilizando una caracteristica dentro de SharePoint 2010, ya que cuando tienes multiples Web Application con muchas colecciones de sitios, es complicado controlarlo y mas aun, si existen varios administradores de sitio, que pueden activar/descativar caracteristicas (Features) a su gusto…

Si se te ha planteado un situacion similar y quieres disponer de un listado de todos los sitios, donde se esta haciendo uso de una caracteristicas (Features) concreta, puedes usar el siguiente script de PowerShell:

#====================================================================================
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint") > $null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Administration") > $null
[System.Reflection.Assembly]::LoadWithPartialName("System.Collections.Generic") > $null
#====================================================================================
$ContentService = [Microsoft.SharePoint.Administration.SPWebService]::ContentService;
$Farm = [Microsoft.SharePoint.Administration.SPFarm]::Farm.Local;
#====================================================================================
function GetFeatureUsageById([string]$FeatureId)
{
	$FeatureGuid = New-Object System.Guid($FeatureId)
	$FeatureDef=$ContentService.Farm.FeatureDefinitions[$FeatureGuid]
	if($FeatureDef -eq $null)
	{
		Write-Host "WARNING: Característica invalida o desconocida"
		return;
	}
	Write-Host "Ambito de la característica: " $FeatureDef.Scope
	if($FeatureDef.Scope -eq [Microsoft.SharePoint.SPFeatureScope]::Farm)
	{
		Write-Host "WARNING: Característica de granaja no soportada"
		return;
	}
	[Microsoft.SharePoint.Administration.SPWebApplicationCollection] $Applications = $ContentService.WebApplications
	foreach($App in $Applications)
	{
		if($FeatureDef.Scope -ne [Microsoft.SharePoint.SPFeatureScope]::WebApplication)
		{
			foreach($TopLevel in $App.Sites)
			{
				if($FeatureDef.Scope -ne [Microsoft.SharePoint.SPFeatureScope]::Site)
				{
					[Microsoft.SharePoint.SPWebCollection] $AllWebs = $TopLevel.AllWebs
					foreach($Web in $AllWebs)
					{
						  $Feature = $Web.Features[$FeatureId];
						  if($Feature -ne $null)
						  {
								Write-Host $Feature.DisplayName " usado en el sitio: " $Web.Url
						  }
						  $Web.Dispose();
					}
				}
				else
				{
					if($TopLevel.Features[$FeatureId] -ne $null)
					{
						Write-Host "Usado por la Coleccion de Sitio: " $TopLevel.Url
					}
				}
			$TopLevel.Dispose();
			}
		}
		else
		{
			if($App.Features[$FeatureId] -ne $null)
			{
			  Write-Host "Usado por la Aplicacion Web: ",$App.Name
			}
		}
	}
}
#====================================================================================
function GetFeatureUsageByName([string]$FeatureName)
{
	$FeatureDef=$ContentService.Farm.FeatureDefinitions[$FeatureName]
	if($FeatureDef -eq $null)
	{
	   Write-Host "WARNING: Característica invalida o desconocida"
	   return
	}
	$FeatureId=$FeatureDef.Id
	GetFeatureUsageById $FeatureId
}
#====================================================================================
#Llamada a la funcion que devuelve la informacion de la caracteristica
#GetFeatureUsageById "8c0cd022-afa0-4f1b-9bbe-4f128c0cf4b3"
#GetFeatureUsageByName "Document Rating Moderators"

La llamada a este script puedes hacerla de dos forma diferentes:

  • Si dispones del GUID puede llamar al metodo: GetFeatureUsageById “8c0cd022-afa0-4f1b-9bbe-4f128c0cf4b3”
  • Por el contrario si sabes el nombre de la caracteristica puedes usar este otro metodo: GetFeatureUsageByName “Document Rating Moderators”

En el script las llamadas a estos dos metodos estan comentados a modo de ejemplo.

 

Script para habilitar CollectSPRequestAllocationCallStacks en SharePoint 2010

Una tarea que ha de realizar cualquier desarrollador de SharePoint 2010 es la labor de revisar los logs en los diferentes entornos de los que se cuenta…

Revisando los logs de ULS con la aplicación ULS Viewer (verdaderamente útil), me he encontrado con este mensaje de error relacionado con un memory leak (perdida de memoria):

An SPRequest object was not disposed before the end of this thread.
To avoid wasting system resources, dispose of this object or its
parent (such as an SPSite or SPWeb) as soon as you are done using it.
This object will now be disposed.  Allocation Id:
{646667A7-73BC-4DDD-B0FB-6EDFC315CCE7}  To determine where this
object was allocated, set
Microsoft.SharePoint.Administration.SPWebService.ContentService.CollectSPRequestAllocationCallStacks = true.

Este es un mensaje que no nos da mucha información sobre el objeto que esta generando la perdida de memoria al no ser liberado… para obtener mas información lo que debemos hacer es ver la pila de llamadas actual.

Para ello y como se especifica en la descripción del error, lo que debemos hacer es activar la propiedad CollectSPRequestAllocationCallStacks, para ello, lo mas sencillo es usar un script de PowerShell:

$contentService = [Microsoft.SharePoint.Administration.SPWebService]::ContentService
write-host "Actual: " $contentService.CollectSPRequestAllocationCallStacks
$contentService.CollectSPRequestAllocationCallStacks = $true
$contentService.Update()
write-host "Nuevo: " $contentService.CollectSPRequestAllocationCallStacks

Una vez hayamos realizado el cambio podemos volver a revisar los logs de ULS y ahora comprobaremos que nos muestra toda la información de la pila sobre el objeto que no esta siendo liberado.

 

No es posible retirar/eliminar/desplegar una solución Sharepoint 2010

Esto es lo que me ocurrió el día de ayer en uno de mis entornos de SharePoint 2010, al intentar actualizar una versión de una solución (.wsp)… después de intentar retirar la solución con PowerShell, veo que el proceso se queda indefinidamente en “Retracting”.

Intento realizar el mismo proceso desde la Administración Central, pero ocurre lo mismo 🙁

Así que después de un rato esperando… recuerdo que en SharePoint 20007 había un comando que forzaba la ejecución de todos los trabajos (timer jobs) llamado execadmsvcjobs, con lo que desde una consola de PowerShell ejecuto lo siguiente:

stsadm -o execadmsvcjobs

Tras la ejecución del comando, veo que SharePoint comienza a ejecutar todos los trabajos que tenia pendiente (entre ellos el “retract” de mi solución)…

Aquí lo dejo para que mi compañero @Raul Gilabert siempre lo tenga como referencia 🙂

Mas información sobre este comando, aquí.

Scripts para la activación/desactivación de caracteristicas en SharePoint 2010

Una de las muchas cosas que se puede hacer con PowerShell es la activacion/desactivacion de caracteristicas. Me ha ocurrido que hay veces que con el usuario administrador de la granja, no me deja activar caracteristicas desde la Administración Central… y recurro a este tipo de scripts…

Lo primero es la identificación del GUID de la caracteristica que queremos activar/desactivar:

 

#Listado de las caracteristicas de la granaja, ordenado
Get-SPFeature | Sort -Property DisplayName, Id | FT -GroupBy Scope DisplayName,Id

Este seria el resultado de la ejecución del comando Get-SPFeature:

Una vez tenemos el listado de todas las caracteristicas instaladas en la Granaja, solo nos queda localizar y obtener el GUID sobre la que queremos activar/desactivar. A continuacion os indico como se pueden realizar estas acciones a través de script:

#Deshabilita una caracteristica en el sitio: http://url_intranet
Disable-SPFeature –Identity f6924d36-2fa8-4f0b-b16d-06b7250180fa –url http://url_intranet

#Habilita una caracteristica en el sitio: http://url_intranet
Enable-SPFeature –Identity f6924d36-2fa8-4f0b-b16d-06b7250180fa –url http://url_intranet

Puedes consultar mas informacion sobre los comandos: Disable-SPFeature y Enable-SPFeature.