Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Blog Technique de Romelard Fabrice

Les dernières Actualités de Romelard Fabrice (Alias fabrice69 ou F___) principalement autour des technologies Microsoft

Actualités

  • Toutes les actualités et informations sur les technologies Microsoft principalement autour de .NET et SQL Server
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) :

  • SYSTEMINFO

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]

Technorati Tags: ,
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 :
Posted: jeudi 5 juin 2008 22:03 par ROMELARD Fabrice

Commentaires

Pas de commentaires

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Le nouveau Gojira, c’est pour lundi… par CoqBlog le il y a 8 heures et 20 minutes

- SharePoint : nouvel article sur la mise en place des Scopes dans MOSS Searchs par Blog Technique de Romelard Fabrice le il y a 15 heures et 46 minutes

- Hello CS par Le Blog de julz le il y a 21 heures et 12 minutes

- MSDN/TechNet/Microsoft Days Tour 2008 à Lille les 13 et 14 Octobre ! par RedoBlog - The .NET Gentleman !!! le 10-10-2008, 09:35

- MVC Pratique #07 - Un projet concret et le transfert des objets avec les ModelBinders par #Rui le 10-09-2008, 23:39

- SQL Server 2008 : Certifié - TS Admin (70-432) par SQL Server vu par Christian Robert le 10-09-2008, 10:58

- [WPF] Comment changer la couleur utilisée pour sélectionner les éléments d’un ItemsControl ? par Thomas Lebrun le 10-09-2008, 10:49

- Hello World! par Hamid's Place le 10-08-2008, 23:38

- SQL Profiler - Configuration pour un développeur - tracer les requêtes SQL de votre application par Atteint de JavaScriptite Aiguë [Cyril Durand] le 10-08-2008, 15:52

- Monitoring et Patron de méthode par Le blog de Marc Ranchin le 10-08-2008, 10:22