PowerShell : Script un peu plus avancé pour le chargement des informations d’un ensemble de serveurs dans une liste SharePoint
Après l’article précédent posté sur le site ASP-PHP, voila un second exemple de script pour lister du contenu d’une liste SharePoint (en m’aidant des posts suivant):
# Function: GetSharePointItemList
# Description: Get all value for one given Column in a specific list
function GetSharePointItemList([string]$SiteURL, [string]$ListName,
[string]$ColumnName)
{
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint") > $null
$site = new-object Microsoft.SharePoint.SPSite($SiteURL)
Write-Host "SiteURL", $SiteURL
$web = $site.openweb()
$spList = $web.Lists[$ListName]
Write-Host "ListName", $ListName
foreach ($MyItem in $spList.Items)
{
#Write-Host "Value [" + $ColumnName + "]: ", $MyItem[$ColumnName]
#Add your code here
}
}
Une fois cette première fonction faite, pourquoi ne pas aller un peu plus loin ?
Ainsi, un besoin classique est d’utiliser SharePoint pour sa simplicité et y ajouter la liste des serveurs de son réseau. On ajoute donc quelques colonnes donc le nom, l’IP, …
Karine Bosh nous explique alors comment mettre à jour les données de la machine courante dans la liste, le fait est que tous les serveurs qui sont dans la liste n’ont pas forcément ni SharePoint (donc pas possible de charger les objets) ni PowerShell (donc impossible d’exécuter le script).
La solution est d’utiliser une commande DOS standard disponible sur tous les systèmes Windows (on pourrait très bien utiliser WMI d’ailleurs mais ca oblige à gérer le résultat) :

On va donc depuis notre serveur SharePoint ayant PowerShell, utiliser cette commande pour obtenir toutes les informations de chaque serveur dans un fichier texte que l’on ajoute dans les pièces jointes de chaque item (donc chaque ligne de la liste, une ligne étant un serveur).
Voila donc le script résultat (on peut au passage voir comment ajouter un fichier en Attachment d’un item SharePoint avec powerShell)
# Function: GetAllSystemInfo
# Description: Get all Information by DOS SYSTEMINFO COMMAND and Upload it in the Item attachment
function GetAllSystemInfo([object]$MyItem, [string]$ServerName,
[string]$UserName, [string]$Password)
{
# Write-Host "ServerName", $ServerName
$Filename = "SystemInfo-"+ $ServerName +"-"+ (get-date).tostring("yyyy-MM-dd-HH-mm") + ".txt"
$Mycommand = "systeminfo /S " + $ServerName + " /U " + $UserName + " /P "+ $Password
$MyResult = cmd /c $Mycommand|Out-file C:\MyTempResultForSystemInfo.txt
$MySPAttachmentCollection = $MyItem.Attachments
[byte[]]$AttachmentFile = Get-Content "C:\MyTempResultForSystemInfo.txt" -Encoding byte
$MySPAttachmentCollection.Add($Filename, $AttachmentFile)
$MyItem.Update()
del C:\MyTempResultForSystemInfo.txt
}
# Function: GetSharePointItemList
# Description: Get all value for one given Column in a specific list
function GetSharePointItemList([string]$SiteURL, [string]$ListName,
[string]$ColumnName, [string]$UserName, [string]$Password)
{
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint") > $null
$site = new-object Microsoft.SharePoint.SPSite($SiteURL)
Write-Host "SiteURL", $SiteURL
$web = $site.openweb()
$spList = $web.Lists[$ListName]
Write-Host "ListName", $ListName
foreach ($MyItem in $spList.Items)
{
#Write-Host "Value [" + $ColumnName + "]: ", $MyItem[$ColumnName]
#Add your code here
GetAllSystemInfo $MyItem $MyItem[$ColumnName] $UserName $Password
}
}
On pourra donc simplement ajouter en fin de fichier la ligne pour appeler correctement la fonction sous le format :
GetSharePointItemList http://MonServerSharePoint/MonSite "Ma Liste" "LeNomDeLaColonne" "DOMAIN\AdminUser" "Password"
Vous retrouverez donc dans votre liste pour un Item Donné un résultat semblable à la capture suivante (avec un fichier attaché par exécution du script) :

Vous n’aurez donc plus qu’à exécuter ce script au besoin pour avoir toutes les configurations de chaque serveur à jour. Cela fonctionne aussi parfaitement pour des postes de travail (cas de petites structures).
UPDATE:
On peut aussi effectuer un test pour la taille du fichier résultat, en effet, si on a pas les droits sur la machine cible (ou si celle-ci n'existe plus), on obtiendra toujours un fichier mais qui sera vide. Or il est ridicule de charger des fichiers vides dans les attachments.
On doit donc faire un test sur la taille de ce fichier (avec la commande -gt (ou greater than) sur la valeur des 4 Octets). Cela donnera le bloc suivant :
$MyResult = cmd /c $Mycommand|Out-file C:\MyTempResultForSystemInfo.txt
$b = Get-ChildItem C:\MyTempResultForSystemInfo.txt
if($b.length -gt 4)
{
Write-Host "Servername[" + $ServerName + "] Size :", $b.length
$MySPAttachmentCollection = $MyItem.Attachments
[byte[]]$AttachmentFile = Get-Content "C:\MyTempResultForSystemInfo.txt" -Encoding byte
$MySPAttachmentCollection.Add($Filename, $AttachmentFile)
$MyItem.Update()
}
del C:\MyTempResultForSystemInfo.txt
Bonne lecture.
Romelard Fabrice [MVP]
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :