martes, 24 de mayo de 2011

No se puede cargar el archivo C:\Fichero.ps1 porque en el sistema está deshabilitada la ejecución de scripts.

Buenos Días de nuevo.

Intentando programar unas tareas de Powershell en unos servidores nuevos me
ha aparecido el siguiente mensaje de error.

No se puede cargar el archivo C:\Fichero.ps1 porque en el sistema está
deshabilitada la ejecución de scripts. Vea “get-help about_signing” para
obtener más información.

Y la verdad es que no me acordaba del significado, parece trivial, pero la
memoria a veces falla.

Por defecto la ejecución de scripts viene deshabilitada en Windows 2008, por
motivos de seguridad, así que os voy a dar la receta para solucionarlo.

Abrimos Powershell como "administrador" (Muy importante porque
vamos a tocar claves de registro).

Ejecutamos Get-ExecutionPolicy

Si nos devuelve Restricted, este es nuestro problema.

Ejecutamos:

Set-ExecutionPolicy Unrestricted

Y ya lo tendríamos habilitado.

Volvemos a ejecutar Get-ExecutionPolicy y nos debería devolver Unrestricted.

Ya tenemos habilitada la ejecución de Scripts.

Un Saludo



lunes, 23 de mayo de 2011

Listar ficheros y tamaños de SQL SERVER

Buenas Tardes a todos ,
Os voy a compartir un procedimiento almacenado que lista todos los ficheros de todas las bases de datos que tenemos y nos dirá su tamaño y su nivel de ocupación.

Es relativamente simple utilizando el comando sp_msforeachdb , pero me ha parecido interesante compartirlo con todos vosotros.

Lo dejará en una tabla en tempdb llamada ocupacion que podremos consultar.

SET ANSI_NULLS ONGO

SET QUOTED_IDENTIFIER ON

GO

CREATE PROCEDURE  [dbo].[ocupacions] as

IF EXISTS (SELECT * FROM tempdb.sys.objects WHERE name = ('ocupacion') AND type in (N'U'))
 
drop table tempdb.dbo.ocupacion
 
CREATE TABLE tempdb.dbo.ocupacion(
 
[name] [varchar](256) NULL,

[Filename] [varchar](256) NULL,

[size] [int] NULL,

[usedspace] [int] NULL,

[id] [int] NULL,

) ON [PRIMARY]

EXECUTE sp_msforeachdb 'USE  [?]

insert into tempdb.dbo.ocupacion SELECT

DB_NAME() AS [Name],

s.physical_name AS [FileName],

s.size * CONVERT(float,8) AS [Size],

CAST(FILEPROPERTY(s.name, ''SpaceUsed'') AS float)* CONVERT(float,8) AS [usedspace],

s.file_id AS [ID]

FROM

sys.master_files AS s

WHERE

(s.type = 1 and s.database_id = db_id())

ORDER BY

[ID] ASC'
EXECUTE sp_msforeachdb 'USE  [?]

create table #tmpspc (Fileid int, FileGroup int, TotalExtents int, UsedExtents int, Name sysname, FileName nchar(520))

insert #tmpspc EXEC (''dbcc showfilestats'')

insert into tempdb.dbo.ocupacion SELECT 
s.name AS [Name],

s.physical_name AS [FileName],

s.size * CONVERT(float,8) AS [Size],

CAST(tspc.UsedExtents*convert(float,64) AS float) AS [UsedSpace],

s.file_id AS [ID]

FROM

sys.filegroups AS g

INNER JOIN sys.master_files AS s ON (s.type = 0 and s.database_id = db_id() and (s.drop_lsn IS NULL)) AND (s.data_space_id=g.data_space_id)

LEFT OUTER JOIN #tmpspc tspc ON tspc.Fileid = s.file_id

ORDER BY

[ID] ASC

DROP TABLE #tmpspc'
GO
EXEC [dbo].[ocupacion]
SELECT * FROM tempdb.dbo.Ocupacion
 


martes, 17 de mayo de 2011

Aparecer en busquedas de Google,Bing y Yahoo.

Muy Buenos Días.

Buscando como hacer para que este nuevo blog aparezca en los buscadores me he interesado un poquito en el tema y la verdad es que es curioso.

Si no apareces en Google o Bing o Yahoo no eres nadie y a veces es mejor animarles a que te encuentren de manera que os paso unas direcciones donde dar de alta vuestra web y empezar a aparecer en las busquedas.
Google:
http://www.google.com/addurl/?continue=/addurl
Bing:
http://www.bing.com/webmaster/SubmitSitePage.aspx
Yahoo:
https://siteexplorer.search.yahoo.com/submit

Yahoo y Bing piden que te conectes con una cuenta de usuario para dar de alta vuestra URL.

Espero que os resulte útil.
Un Saludo.

Correo entrante en Sharepoint sin SMTP - Parte 2.

Saludos a todos .
Viendo la solución me han surgido dudas con respecto al tema de reflejar la fecha en los correos entrantes.
Sharepoint cuando recoje los correos de la carpeta de correo entrante utiliza el Subject para dar el nombre a la entrada en la biblioteca, ignorando el nombre del fichero y marcando como fecha y hora la que tiene en el momento de la recogida, no la original del envio.

Si queremos reflejar de alguna manera este dato, podemos añadirlo al comienzo del nombre con esta modificación del Script Original.



Set-ExecutionPolicy RemoteSigned -force
import-module messageops-exchange
$path = "c:\CARPETA TEMPORAL"
$path2= "C:\CARPETA DONDE SHAREPOINT RECOGE CORREO"
$apppath="C:\CARPETA DONDE INSTALAS TODO"
cd $apppath
$Inbox="\\bandeja de entrada"
import-module ./messageops-exchange.psd1
$user = "TUDIRECCION@TUEMPRESA.COM"
$ewsProfile = New-MessageOps.EWSProfile -usedefaultcredentials 1 -id $user/*captura usuario actual*/
$ItemCollection = Get-MessageOps.Messages -p $ewsprofile -fp $inbox  -messagecount 1 -fulldetails $true
/*recoge  un correo*/
if ($itemcollection.sender.address -ne $null)
{
if ($itemcollection.subject -eq $null) /*si no tiene asunto se le añade como título “Sin Asunto”*/
{$name = "Sin Asunto"}
else
{$name = $itemcollection.subject -replace(':',' ') }/* Eliminamos caracteres especiales que puedan provocar error en el asunto error*/
$name = $name -replace("`""," ")
$name = $name.replace("\"," ")
$name = $name.replace('+',' ')
$name = $name.replace('*',' ')
$name = $name.replace('?',' ')
$name = $name.replace('=',' ')
$name = $name.replace('-',' ')
$name = $name.replace('[',' ') 
$name = $name.replace(']',' ')
$name = $name.replace('''',' ')
$sender = "x-sender: " + $itemcollection.sender.address /* añadimos cabeceras para SharePoint*/
$receiver = "x-receiver: " + $itemcollection.receivedby.address/* añadimos cabezeras para SharePoint*/
$file =$path + $name + ".eml" /*Construimos el nombre del fichero con el asunto*/
Export-MessageOps.MessageToEml -EWSProfile $ewsprofile -ewsid $itemcollection.id  -filename $file
add-content ($path +"temp.eml") $sender
add-content ($path + "temp.eml") $receiver
$texto =  get-content $file
add-content ($path + "temp.eml")  $texto
del $file /* borramos el fichero si existe  en la carpeta de destino*/
$temp = Get-Content ($path +"temp.eml")  | Foreach-Object { $_ -replace ("Subject:", ("Subject: " + $date + " ")) }  /* buscamos la cadena de texto Subject y le añadimos la fecha original*/
add-content $file $temp /*salvamos el fichero en el destino final*/
del ($path + "temp.eml")  /*Borramos el fichero temporal*/
Remove-MessageOps.Message -ewsid $itemcollection.id -ewsprofile $ewsprofile /*borramos el correo del buzón.*/
}
Como siempre se dice en estos casos, esto es un ejemplo, no lo uséis en producción, probarlo y reprobarlo antes de hacer uso de él.

Saludos a todos.

martes, 10 de mayo de 2011

Primer Plato: Correo entrante en sharepoint sin SMTP.

En los últimos días me ha tocado lidiar con un problema, no tan extraño, pero a la vez poco documentado.

Os comento, tengo una granja de SharePoint 2007, sobre Windows 2008 y no tengo posibilidad de redirigir un conector Smtp desde Exchange, en mi caso 2010.

Tras mucho buscar he encontrado recursos para montar una solución domestica para este proceso, la solución:
POWERSHELL.

Desde luego no es la opción que hubiese elegido para realizar esta conexión, pero ha resultado tremendamente efectiva. Descargo los ficheros con formato .eml con sus adjuntos y me permite añadir las cabeceras x-sender y x-receiver.

Comencemos.

Para empezar he instalado las herramientas de administración de Exchange, desde el DVD de instalación, en el servidor donde quería recibir los correos.

A continuación encontré un kit de herramientas para Exchange, gratuito por supuesto en MessageOps.
Una gente muy maja a la que le agradezco encarecidamente este Kit.
Lo descomprimimos en una carpeta que será donde guardemos nuestro script.

Por otro lado descargue la Api de los Web services de Exchange.

Ya tenemos todos los ingredientes.
-Instalamos el Api de Exchange.
-Descomprimimos el kit de messageops a una carpeta y abrimos la shell de Exchange como administrador y ejecutamos el script 
.\install-module.ps1 del kit.

Ahora comprobamos como en la carpeta
C:\Users\usuario\Documents\WindowsPowerShell\Modules\MessageOps-Exchange
Tenemos tres ficheros:
MessageOps-Exchange.psd1
MessageOps-Exchange-Powershell-Module.dll
Microsoft.Exchange.WebServices.dll
Si no los tenéis podéis copiarlos manualmente.

Ahora viene la parte crítica de la solución. EL SCRIPT.

Set-ExecutionPolicy RemoteSigned -force
import-module messageops-exchange
$path = "c:\CARPETA TEMPORAL"
$path2= "C:\CARPETA DONDE SHAREPOINT RECOGE CORREO"
$apppath="C:\CARPETA DONDE INSTALAS TODO"
cd $apppath
$Inbox="\\bandeja de entrada"
import-module ./messageops-exchange.psd1
$user = "TUDIRECCION@TUEMPRESA.COM"
$ewsProfile = New-MessageOps.EWSProfile -usedefaultcredentials 1 -id $user/*captura usuario actual*/
$ItemCollection = Get-MessageOps.Messages -p $ewsprofile -fp $inbox  -messagecount 1 -fulldetails $true
/*recoge  un correo*/
if ($itemcollection.sender.address -ne $null)
{
if ($itemcollection.subject -eq $null) /*si no tiene asunto se le añade como título “Sin Asunto”*/
{$name = "Sin Asunto"}
else
{$name = $itemcollection.subject -replace(':',' ') }/* Eliminamos caracteres especiales que puedan provocar error en el asunto error*/
$name = $name -replace("`""," ")
$name = $name.replace("\"," ")
$name = $name.replace('+',' ')
$name = $name.replace('*',' ')
$name = $name.replace('?',' ')
$name = $name.replace('=',' ')
$name = $name.replace('-',' ')
$name = $name.replace('[',' ') 
$name = $name.replace(']',' ')
$name = $name.replace('''',' ')
$sender = "x-sender: " + $itemcollection.sender.address /* añadimos cabeceras para SharePoint*/
$receiver = "x-receiver: " + $itemcollection.receivedby.address/* añadimos cabezeras para SharePoint*/
$file =$path + $name + ".eml" /*Construimos el nombre del fichero con el asunto*/
Export-MessageOps.MessageToEml -EWSProfile $ewsprofile -ewsid $itemcollection.id  -filename $file
add-content ($path +"temp.eml") $sender
add-content ($path + "temp.eml") $receiver
$texto =  get-content $file
add-content ($path + "temp.eml")  $texto
del $file /* borramos el fichero si existe */
ren ($path +"temp.eml") $file /*renombramos el fichero */
MOVE $file $path2  /*se mueve a la carpeta de SharePoint*/
Remove-MessageOps.Message -ewsid $itemcollection.id -ewsprofile $ewsprofile /*borramos el correo del buzón.*/
}

Para ejecutarlo tendréis que eliminar todos los comentarios.
Salvamos el fichero con extensión ps1.

Lo guardaremos en la carpeta donde descomprimimos messageops.

Por últimos, como programar la ejecución. Pues muy simple desde el programador de tareas ponemos en acciones la siguiente línea.

c:\windows\system32\windowspowershell\v1.0\powershell "C:\ruta\correo.ps1"

Y elegimos la programación que deseemos, 
Nota: El script se descarga únicamente un correo cada vez, por lo que recomiendo ejecutarlo cada poco tiempo.

Como siempre se dice en estos casos, esto es un ejemplo, no lo uséis en producción, probarlo y reprobarlo antes de hacer uso de él.

Dejo para otra ocasión el desarrollo que hice hace tiempo para conectar con servidores de Exchange 2003.

Un Saludo.

Agradecimientos:



Primeros Pasos

Hoy abro mi primer blog para compartir aquellas cosas que el día a día y los cabezazos contra la pantalla me han enseñado.
La periodicidad ni semanal , ni mensual, cuando me acuerde, tenga tiempo y ganas.
Un Saludo.