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()

Monday, February 13, 2012

ping -t pour sharepoint, version ferme

trivial... penser à déclarer un AAM avec le nom de la machine (ici par exemple sur le port 81) pour isoler un noeud, et mettre en tache planifiée tous les x minutes :

function Test-Site
{ param($URL)
try
{
$webclient = New-Object Net.WebClient
# Proxy avec le compte "windows"
$webclient.Credentials = [System.Net.CredentialCache]::DefaultCredentials
if($webclient.Proxy -ne $null) {
$webclient.Proxy.Credentials = `
[System.Net.CredentialCache]::DefaultNetworkCredentials
}
# test
$webclient.DownloadString($URL) | Out-Null
}

Catch
{
"FAIL: $($_.Exception.innerexception.message)"
Send-mailmessage -to "emmanuel.issaly@am.wtfbbq.com" -from "sharepoint.prod@wtfbbq.com" -subject "wtfbbqportal ne répond pas!" -body "FAIL: $($_.Exception.innerexception.message)" -smtpserver "SMTP.wtfbbq" -priority high
exit 1
}

}

Write-host N1 OK T=(Measure-Command {test-site "http://vpt-wtfbbq-01:81/"}).TotalSeconds
Write-host N2 OK T=(Measure-Command {test-site "http://vpt-wtfbbq-02:81/"}).TotalSeconds


PS : pour en faire un ping -t, encadrer les deux lignes de test par un while(1) par exemple...

Friday, February 10, 2012

Word starter et windows 7 - "imprimante non installée"

Sur le portable de ma fille, word starter (et uniquement word starter) ne peut pas imprimer, message "imprimante non installée"

C'est un problème de sécurité. Baisser ou désactiver l'UAC, en attendant d'installer open office ^^

Thursday, February 9, 2012

Pensez à heriter vos providers sous IIS7 !

dans IIS7, une declaration au miveau machine( par exemple une chaine de connexion) se retrouve partout.
Particulièrement utile quand on vous demande de modifier la CA, le STS et une webapp pour un accès FBA...

par exemple si on crée une connection au niveau racine (serveur)



On la retrouve dans chaque Site (Inherited)



Du coup, une seule manip.

Alternative, dans le web.config du bon framework, C:\Windows\Microsoft.NET\Framework64\v2.0.50727\CONFIG, taper les chaines.

PS: Evidamment, si on a plusieurs providers, ca peu perdre de son interet...

edit : en complement, il y a par défaut une balise dans la section providers du ststoken.... il faut alors ajouter les providers à la main.

Generateur de commandes powershell pour Sharepoint 2010

awesome!

http://www.microsoft.com/resources/TechNet/en-us/Office/media/WindowsPowerShell/WindowsPowerShellCommandBuilder.html