www.flickr.com

dinsdag 26 oktober 2010

SQL 2008 Express backups met PowerShell

Als je gebruikt maakt van de Express editie van SQL Server, dan zul je het moeten doen zonder Maintenance Plans. Hoewel dit een zeer eenvoudige tools is om te gebruiken, is er voor SQL 2008 Express een goed alternatief beschikbaar; PowerShell!

Beter goed gejat dan slecht verzonnen was mijn insteek bij deze oplossing. Ik heb gebruik gemaakt van de volgende artikelen:
Daarnaast had ik zelf een one-liner om bestanden ouder dan een bepaalde tijd op te ruimen. Als je dit combineert, dan krijg je het onderstaande resultaat.

#
# Loads the SQL Server Management Objects (SMO)
#

$ErrorActionPreference = "Stop"

$sqlpsreg="HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.SqlServer.Management.PowerShell.sqlps"

if (Get-ChildItem $sqlpsreg -ErrorAction "SilentlyContinue")
{
throw "SQL Server Provider for Windows PowerShell is not installed."
}
else
{
$item = Get-ItemProperty $sqlpsreg
$sqlpsPath = [System.IO.Path]::GetDirectoryName($item.Path)
}


$assemblylist =
"Microsoft.SqlServer.Management.Common",
"Microsoft.SqlServer.Smo",
"Microsoft.SqlServer.Dmf ",
"Microsoft.SqlServer.Instapi ",
"Microsoft.SqlServer.SqlWmiManagement ",
"Microsoft.SqlServer.ConnectionInfo ",
"Microsoft.SqlServer.SmoExtended ",
"Microsoft.SqlServer.SqlTDiagM ",
"Microsoft.SqlServer.SString ",
"Microsoft.SqlServer.Management.RegisteredServers ",
"Microsoft.SqlServer.Management.Sdk.Sfc ",
"Microsoft.SqlServer.SqlEnum ",
"Microsoft.SqlServer.RegSvrEnum ",
"Microsoft.SqlServer.WmiEnum ",
"Microsoft.SqlServer.ServiceBrokerEnum ",
"Microsoft.SqlServer.ConnectionInfoExtended ",
"Microsoft.SqlServer.Management.Collector ",
"Microsoft.SqlServer.Management.CollectorEnum",
"Microsoft.SqlServer.Management.Dac",
"Microsoft.SqlServer.Management.DacEnum",
"Microsoft.SqlServer.Management.Utility"


foreach ($asm in $assemblylist)
{
$asm = [Reflection.Assembly]::LoadWithPartialName($asm)
}

Push-Location
cd $sqlpsPath
update-FormatData -prependpath SQLProvider.Format.ps1xml
Pop-Location

$s = New-Object ("Microsoft.SqlServer.Management.Smo.Server") "(local)"

$Date = Get-Date
$bkdir = $s.Settings.BackupDirectory
$dbs = $s.Databases
foreach ($db in $dbs)
{
if($db.Name -ne "tempdb") #We don't want to backup the tempdb database
{
$dbname = $db.Name
$dt = get-date $Date -format yyyyMMddHHmm #We use this to create a file name based on the timestamp
$dbBackup = new-object ("Microsoft.SqlServer.Management.Smo.Backup")
$dbBackup.Action = "Database"
$dbBackup.Database = $dbname
$dbBackup.Devices.AddDevice($bkdir + "\" + $dbname + "_" + $dt + ".bak", "File")
$dbBackup.Initialize = $true
$dbBackup.SqlBackup($s)
}
}
$CutOff = 7
$bkdir | get-childitem | where {$_.PSIsContainer -eq $false -AND $_.LastWriteTime.date -lt ($Date).AddDays(-$CutOff)} | Remove-Item

woensdag 20 oktober 2010

PowerCLI als vervanger voor COS opdrachten - ESX patches

Met de release van vSphere versie 4.1 was het hoge woord eruit. De volgende 'major' release van vSphere zal uitsluitend in een ESXi variant beschikbaar komen.

Deze gedachte speelt al een tijdje in mijn achterhoofd als ik het beheer van ESX servers uitvoer. Vaak maak ik gebruik van een batchfile die door middel van plink, pageant en public/private keypairs commando's uitvoert in het Console Operating System (service console) van een groep ESX servers.

Dit is zometeen dus niet meer mogelijk en zodoende probeer ik tegenwoordig zoveel mogelijk met PowerCLI te doen. Een van de opdrachten die ik probeer om te zetten is het opvragen van geïnstalleerde software. Dit is van belang omdat ik de versie van een geïnstaleerde netwerk driver wil kunnen zien.

Helaas is er geen PowerCLI versie van het RPM commando beschikbaar, maar sinds PowerCLI versie 4.1 is er wel de CMDlet Get-VMHostPatch. Met deze CMDlet is het mogelijk om de geïnstalleerde patches van een ESX hosts uit te lezen. Een nadeel van deze methode is dat deze alleen werkt voor ESX 4 en hoger.

De onderstaande code gebruik ik om een overzicht te maken van alle ESX hosts in een vCenter omgeving:

Get-VMhost | Get-VMHostPatch | select @{N="Host";E={Get-VMhost -Id $_.VMhostid}}, @{N="Build";E={Get-VMhost -Id $_.VMhostid | Get-View | %{$_.Config.Product.build}}}, ID, InstallDate

donderdag 14 oktober 2010

Mailforwarding controleren met powershell

Sinds ik powershell gebruik zie ik steeds meer toepassingen en maak ik steeds minder gebruik van andere tools. Toch heeft powershell standaard nog wat meters te maken als het gaat om het beheer van Active Directory. Gelukkig vult Quest software dit gat op met een aantal AD-gerelateerde CMDlets, gebundeld onder de naam ActiveRoles Management Shell for Active Directory.

Door middel van deze tool is het een fluitje van een cent om te achterhalen op welke accounts email forwarding is ingeschakeld en naar welk adres de email gestuurd wordt. De onderstaande code geeft weer hoe ik dit voor elkaar heb gekregen.

get-qadobject -IncludeAllProperties -LdapFilter '(altrecipient=*)' | select name, email,
@{ Name = "altrecipient";
Expression = {get-qadobject $_.altrecipient -IncludeAllProperties | %{$_.mail}}
} | sort name | format-table -auto

maandag 20 september 2010

vCenter database cleanup

Met vCenter 2.5 draaide ik regelmatig een SQL query die de historie van events en tasks opruimde. Deze procedure had ik van de VMware Knowledge Base, artikel nummer 1000125.

Onlangs upgrade ik een vCenter server naar versie 4.1 en liep daarna door de instellingen. Het viel me toen ineens op dat er onder de noemer 'Database Retention Policy' een functie beschikbaar is die hetzelfde doet.

Deze benadering is nog beter dan het SQL script, want om die uit te kunnen voeren moest eerst de vCenter service gestopt zijn.

donderdag 2 september 2010

Snel bestanden hernoemen

Stel, je hebt een grote verzameling bestanden met een onjuiste extentie en je wilt deze aanpassen. Hoe ga je dan te werk? Er zijn allehande tools om dit op Windows te doen, echter ik gebruik liever standaard tools die al in het OS aanwezig zijn. De onderstaande code is hiervan een mooi voorbeeld. Voer deze uit op een *nix machine en voor je het weet heb je resultaat!

for f in *txt.zip ; do mv $f `basename $f txt.zip`zip; done

Video conversie met opensource tools: Oude laptops

Voor sommigen is de 720p output van mijn fotocamera wat teveel van het goede. Bijvoorbeeld oude laptops gaan het niet redden. Voor deze apparaten verklein ik de videos naar een ander formaat met een 16:9 verhouding.

mencoder -oac copy -ovc lavc -lavcopts vcodec=mjpeg:aspect=16/9 -vf scale=854:480,expand=854:480 input.avi -o output.avi

Video conversie met opensource tools: Nokia 5230

Deze telefoon heeft al een beeldscherm met een verhouding van 16:9, dus daar hoeven geen extra maatregelen te worden genomen. De transcoding voorbeelden die ik op het internet tegenkwam voor deze telefoon (of z'n broers de 5800 en N97) gebruikten een 2-pass MP4 encoding met de tool mencoder. De syntax hiervan ziet er als volgt uit:

mencoder -of lavf -lavfopts format=mp4 -oac lavc -ovc lavc -lavcopts aglobal=1:vglobal=1:acodec=libfaac:vcodec=mpeg4:abitrate=96:vbitrate=800:keyint=250:mbd=1:vqmax=10:lmax=10:vpass=1:turbo -ofps 25 -af lavcresample=44100 -vf harddup,scale=640:-3 'input.avi' -o 'output.mp4'

mencoder -of lavf -lavfopts format=mp4 -oac lavc -ovc lavc -lavcopts aglobal=1:vglobal=1:acodec=libfaac:vcodec=mpeg4:abitrate=96:vbitrate=800:keyint=250:mbd=1:vqmax=10:lmax=10:vpass=2 -ofps 25 -af lavcresample=44100 -vf harddup,scale=640:-3 'input.avi' -o 'output.mp4'