Wednesday, February 22, 2012

Script inventaire / monitoring V2 - Sharepoint 2007 et 2010

Pour rappel, le principe est de remplir une liste SharePoint automatiquement (tache planifiée) avec tous les sites crées sur le serveur (inventaire) et leur état (monitoring). Ceci inclus les bases de contenu et leur instance SQL. Egalement, on filtre les sites persos, le site de cache officewebapps pour une liste plus claire :


Le code powershell est un peu approximatif, remarques bienvenues.


#
# Code : Emmanuel ISSALY - version 1.4 - 23/02/2012
# modèle objet Sharepoint --> marche en 2007 (sinon les commandlets sharepoint 2010 sont mieux)
#

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint") > $null;

function get-webpage([string]$url,[System.Net.NetworkCredential]$cred=$null)
{
$wc = new-object net.webclient
if($cred -eq $null)
{
$cred = [System.Net.CredentialCache]::DefaultCredentials;
}
$wc.credentials = $cred;
return $wc.DownloadString($url);
}

#credentials windows par défaut

$cred = [System.Net.CredentialCache]::DefaultCredentials;
#$cred = new-object System.Net.NetworkCredential("username","password","machinename")

# liste sharepoint qui va stocker les infos
$docliburl="http://vpt--02.ds.cdcam.com:22222/Lists/SiteState";

$reportsite=new-object Microsoft.SharePoint.SPSite($docliburl);
$reportweb=$reportsite.openweb();
$reportlist=$reportweb.GetList($docliburl);

# Pour chaque AAM de type "default" (shell de stsadm)
set-alias stsadm -value "stsadm.exe"

# Motifs URL indésirables (cache office webapps, sites persos)
$filtre= @("Office_","perso/")

[xml]$x=stsadm -o enumzoneurls
foreach ($zone in $x.ZoneUrls.Collection) {

write-host + $zone.default;

[xml]$sites=(stsadm -o enumsites -url $zone.Default) -notmatch [String]::Join('|',$filtre)

foreach ($site in $sites.Sites.Site) {

write-host +++ $site.Url;
if (!$site.url) { Continue } # pas de droits sur la base de contenu

# obtenir instance SQL

$DBName = [Microsoft.SharePoint.Administration.SPContentDatabase].GetProperty("Name")
$DBServer= [Microsoft.SharePoint.Administration.SPContentDatabase].GetProperty("ServiceInstance")

$rootSite = New-Object Microsoft.SharePoint.SPSite($site.Url)
$ContentDBCollection = $rootSite.WebApplication.ContentDatabases ;

foreach($ContentDB in $ContentDBCollection)
{
$nom = $DBName.GetValue($ContentDB, $null)
$server = ($DBServer.GetValue($ContentDB, $null)).NormalizedDataSource
}

# write-host $server "\\" $nom ;

# Pas de fuite mémoire
$rootSite.Dispose();

#recherche l'url dans la liste
$item = $reportlist.Items | Where { $_["Title"] -eq $site.url }

# crée la ligne si n'existe pas
if ($item -eq $null) {$item = $reportlist.Items.Add();}

$item["Title"] = $site.url;
$item["OKN2?"]= $True;
$item["Erreur2"]="";
$item["ContentDatabase"]=$nom ;
$item["SqlInstance"] = $server;

trap
{
write-host $error[0].exception.innerexception.message -foregroundcolor red -backgroundcolor yellow
$item["OKN2?"]= $False;
$item["Erreur2"]= $error[0].exception.innerexception.message;
continue;
}

$html=get-webpage -url $site.Url -cred $cred;

$item.Update();

}
}

$reportweb.dispose()
$reportsite.dispose()

No comments: