PI Services

Le blog des collaborateurs de PI Services

WINRM : Résolution de l'erreur -2144108526 0x80338012

 

Aujourd’hui mon 2ème blog va porter sur l’erreur WINRM : -2144108528 0x80338012 que l’on peut retrouver sur tout les serveurs de :                                                                                                                                 - Windows 2003 SP2 à Windows 2012 R2. Là aussi pour trouver une solution sur internet est introuvable.

PERIMETRE: Dans le cadre de l’organisation des reboot de 400 serveurs chez un de nos client, j’ai mis en place une vérification Post-démarrage de ces 400 serveurs.

Voici la commande du script powershell qui permet de vérifier si le service MSDTC qui est commun au serveur 2000 à 2012 R2 ,  l’exemple ci-dessous porte sur 1 serveur le but étant de démontrer l’erreur winrm.

Nous allons utiliser le script powershell ci-dessous depuis le serveur source, pour rappel $computerdestination est la variable qui contient le nom du serveur distant.

######SERVEURS A TESTER################

$Computerdestination = "SRVxxx"

######SERVICES A VERIFER################

$Servicesname = "MSDTC"

Invoke-Command -ScriptBlock {param($ServicesName) Get-Service $ServicesName -ErrorAction stop | select PScomputerName,Status,Name   } -ArgumentList $ServicesName -ComputerName $Computerdestination

Ce qu’il faut effectuer AVANT de lancer le script,ouvrir la console powershell

Taper sur le serveur de destination : WINRM QUICKCONFIG

clip_image001

1er message d’erreur : sur le serveur de destination

Le service Windows Remote Management (WS-management) WINRM n’est pas démarrer automatiquement  et il refuse de démarrer automatiquement

1ère Résolution : Démarrer le service d’administration IIS (demarré –automatique) , puis relance sous powershell de winrm quickconfig , Set-WSManQuickConfig et Enabled-psremoting

clip_image001[6]

2ème message d’erreur : serveur destination

clip_image002

2ème  Résolution : Taper GPEDIT.MSC puis activé : autoriser l’acces au environnement  distant (voir ci-dessous)

clip_image003

Puis le relancer  le script depuis le serveur source  sous powershell

######SERVEURS A TESTER################

$Computerdestination = "SRVxxx"

######SERVICES A VERIFER################

$Servicesname = "MSDTC"

Invoke-Command -ScriptBlock {param($ServicesName) Get-Service $ServicesName -ErrorAction stop | select PScomputerName,Status,Name   } -ArgumentList $ServicesName -ComputerName $Computerdestination

RESULTAT : CONCLUANT

clip_image004

WINRM : Erreur-2144108387 0x8033809D

 

Aujourd’hui mon blog va porter sur l’erreur WINRM : 2144108387 0x8033809D que l’on peut retrouver sur tout les serveurs de :                                                                                                                                 - Windows 2003 SP2 à Windows 2012 R2. Même en regardant dans l’observateur d’évènement ID 4 qui correspond à une solution TechNet qui n’est pas adapter à la situation.

PERIMETRE: Dans le cadre de l’organisation des reboots de 400 serveurs chez un de nos client, j’ai mis en place une vérification Post-démarrage de ces 400 serveurs.

Voici la commande du script powershell qui permet de vérifier la date les derniers redémarrage des serveurs, bien sûr l’exemple ci-dessous porte sur 1 serveur le but étant de démontrer l’erreur winrm.

SCRIPT:

$computer = "SRV01"   
$LastBootUpTime = ([Management.ManagementDateTimeConverter]::ToDateTime((Get-WmiObject Win32_OperatingSystem).LastBootUpTime)).ToString("dd'/'MM'/'yyyy-HH'h'mm")

Invoke-Command -ScriptBlock { $LastBootUpTime }  -ComputerName $computer

RESULTAT:

image

ACTIVATION WINRM:

Bien évidement tout ceci est conditionné par le fait qu’il faille activer winrm sur tout les serveurs et que le port 5985 doit être ouvert lui aussi (invoke-command est utilisé, il lance la commande à distance .

sur certains serveurs, j’ai rencontré des problèmes lié à l’activation de WINRM dont l’un des serveurs SRV01.

ERREUR :

clip_image001

IDENTIFICATION DE L’ERREUR :  Apparemment lorsque le rôle serveur WEB est mis en place sur un serveur, il se peut que le TRANSPORT HTTP soit lié à un compte de service web exemple : SVC- WEB

Comment déterminer si un  compte de service est  attribué au service HTTP avec la commande exemple :                                                                       

setspn –q */srv01 

                                                                                                                                Une liste s’affiche ci-dessous : nous voyons clairement en violet que le service http est lié au compte de service web :  SVC- WEB

Checking domain DC=domaine,DC=com

CN= SVC- WEB,OU=Utilisateur,OU=Ordinateurs,DC=domaine,DC=com

      HTTP/SRV01

       HTTP/SRV01.domaine.com

TERMSRV/SRV01

       TERMSRV/SRV01.domaine.com

       WSMAN/SRV01.domaine.com

       RestrictedKrbHost/SRV01.domaine.com

       HOST/ SRV01.domaine.com

       WSMAN/SRV01

       RestrictedKrbHost/SRV01

       HOST/SRV01

Existing SPN found!

RESOLUTION : 

à savoir que cela puisse ne pas être une solution car il faut déterminer si les SITES WEB s’appuie sur un compte de service web et si ce compte ne gère pas d’autre site web qui s’appuie dessus , alors la solution appliquer ne permettra plus d’effectuer sous IE une requête sur:

 http://SRV01:80 ou http://SRV01:443                                                                                                                                                            Par contre si avez mis en place un cluster NLB site web exemple : http/clustersrv01-02.domaine.com, alors la solution peut être envisager

La commande permettant de ne plus lier le service http au compte de service WEB (SVC-WEB) est la suivante :

- Setspn   –D  http://srv01  SVC-WEB

- Setspn   –D  http://srv01.domaine.com SVC-WEB

Lorsque vous effectuer de nouveau la commande query :  setspn -q */srv01 nous voyons de nouveau  qui est lié au compte d’ordinateur  et plus au compte de service WEB si vous effectuer de nouveau  WINRM QC cela fonctionnera.

Checking domain DC=domaine,DC=com

CN= SRV01,OU=server,OU=Ordinateurs,DC=domaine,DC=com

TERMSRV/SRV01

       TERMSRV/SRV01.domaine.com

       WSMAN/SRV01.domaine.com

       RestrictedKrbHost/SRV01.domaine.com

       HOST/ SRV01.domaine.com

       WSMAN/SRV01

       RestrictedKrbHost/SRV01

       HOST/SRV01

Existing SPN found!

 

 

Lync 2013 – Lync client devient Skype Entreprise

Nouvelle interface

Dès aujourd’hui (mardi 14 avril 2015) Lync client devient Skype Entreprise (Skype for Business en anglais).
Cette modification apporte une refonte complète de l'interface Lync cliente. Les fonctionnalités de cette nouvelle version restent pour le moment inchangées (par rapport à Lync client 2013).
image

Activer ou désactiver Skype Entreprise

Il est pour le moment possible de désactiver l'interface Skype Entreprise pour les utilisateurs Lync Online.
Pour se faire il faut se connecter en PowerShell à Lync Online.
Téléchargement du module PowerShell pour Lync Online : http://www.microsoft.com/en-us/download/details.aspx?id=39366
Utilisez ensuite les commandes suivantes :
   Import-Module LyncOnlineConnector
   $session = New-CsOnlineSession –Credential username@domaine.com
   Import-PSSession $session

Remarque : Si le domaine du compte administrateur n'est pas @tenant.onmicrosoft.com, il faut ajouter le paramètre –OverrideAdminDomain "tenant.onmicrosoft.com" à la commande PS.
Lancez la commande Get-CsClientPolicy | ft Identity,EnableSkypeUI. Deux politiques existent déjà, une pour activer l'interface Skype et l'autre pour la désactiver.
image

Pour ajouter une politique à un utilisateur il faut lancer la commande suivante :
Get-CsOnlineUser Utilisateur@domaine.com | Grant-CsClientPolicy –PolicyName Police

image

image

Office 365 – Retour d’expérience d’une migration IMAP

Introduction

L'offre Office 365 inclut un outil de migration. Cet outil permet la migration des boites mails depuis Exchange (2003 / 2007 / 2010 /2013) vers Office 365 ou depuis un autre serveur de messagerie utilisant l'IMAP vers Office 365.
Ce billet portera sur mon retour d'expérience d'une migration IMAP vers Office 365.

Retour d'expérience

Les prérequis


1) Chaque compte migré doit avoir un utilisateur unique associé avec une licence active. Le compte peut être uniquement dans le cloud ou synchronisé avec Active Directory (via DirSync par exemple).
Dans le cadre d'une architecture hybride (c'était le cas dans ce projet), d'autres prérequis utilisateurs sont nécessaires. L'utilisateur doit être "connu" par les serveurs Exchange OnPremise. Pour cela la commande PowerShell suivante est à passer sur les serveurs Exchange OnPremise :

Enable-RemoteMailbox –Identity Utilisateur –RemoteRoutingAddress utilisateur@tenant.mail.onmicosoft.com –PrimarySMTPAddress utilisateur@domaine.fr
Remarque : Attention, si l'utilisateur possède d'autres adresses SMTP que la principale il est nécessaire de les indiquer dans la commande à l'aide du paramètre EmailAddresses
Remarque 2 : Il est également recommandé d'avoir l'UPN (UserPrincipalName) de l'utilisateur qui soit égal à l'adresse email afin de faciliter la connexion aux services Office 365.

2) Un Migration Endpoint avec les éléments suivants :

  • L'URL du serveur IMAP
  • Le type d'authentification (Basic ou NTLM)
  • Le chiffrement (Aucun, SSL, TLS)
  • Le port utilisé pour se connecter en IMAP au serveur
  • Le nombre maximum de migrations simultanées
  • Le nombre maximum de synchronisation incrémentales simultanées

image
3) Un fichier CSV contenant l'adresse email cible, le nom d'utilisateur et le mot de passe du compte IMAP (ou d'un compte administrateur). Le fichier CSV sera construit ainsi :

Les éléments migrés


La migration IMAP n'inclut que la partie mail. En effet les éléments de type contacts, calendrier, tâches… ne sont pas pris en compte.
La migration IMAP prend en compte les mails qui se trouvent dans les différents dossiers (et sous dossiers) personnels ainsi que les dossiers de base (Boite de réception, éléments envoyés, éléments supprimés…).

La migration


La migration se déroule par lot. Chaque lot peut comporter jusqu'à 5000 utilisateurs.
Pour une meilleure gestion des erreurs et de la volumétrie, des lots de 1200 utilisateurs environ ont été fait.
A titre d'exemple, le temps de migration pour un lot de 1200 utilisateurs ayant une volumétrie d'environ 30 Go au total (soit une moyenne de 25Mo/BAL) a mis un peu plus de deux heures.
Cette estimation est bien évidement propre à l'architecture et peut être différente en fonction de la bande passante et des performances du serveur source.

La gestion des erreurs


Il est courant qu'un lot de migration comporte des erreurs. Pour les identifier il est possible d'utiliser la commande PowerShell suivante sur le tenant Office 365 :
Get-MigrationUser -ResultSize Unlimited | ?{$_.Status -ne "Synced"}

image

Les utilisateurs en échec peuvent être sorti du lot de migration et relancés dans un lot séparé.
Remarque : Un utilisateur ne peut pas être inclus dans un nouveau lot s'il appartient déjà à un lot. Microsoft met également à disposition des rapports (au format CSV) sur la plateforme d'administration d'Office 365 – Exchange.

Conclusion

Dans le cadre de cette migration, le pourcentage d'erreur a été de 0.2% (moins d'une vingtaine de boites en erreur sur plus de 6000 boites migrées).
Le seul point négatif est la limite des éléments migrés. Les calendriers, carnets d'adresses… ne sont pas pris en compte et doivent être fait manuellement par l'utilisateur ou via un autre outil de migration.


Pour conclure l'outil de migration fonctionne parfaitement. Même s'il possède peu de fonctionnalités contrairement à d'autres outils de migration (Refresh IT, Quest…) il permet une migration simple à un moindre coût.

SCOM - Créer une vue avec un filtre « NOT »

 

Tout administrateur SCOM qui se respecte a déjà été amené à créer des vues d’alerte ou d’état spécifiques, ciblées sur une classe et filtrées en fonction d‘un niveau de résolution (resolution state), d’une criticité…

clip_image001

clip_image002

Une problématique revient cependant de temps en temps : comment créer une vue qui exclue spécifiquement certaines alertes en fonction de leur nom ?
Autrement dit, comment afficher toutes les alertes SAUF celles correspondant à un certain nom ?

Le filtre « with a specific name » ne permet à première vue pas de réaliser cette exclusion ; il semble plutôt prévu pour fonctionner en mode « inclusif » : seules les alertes répondant à la chaine de caractères entrée seront affichées :

clip_image004

Mais il est en réalité possible d’utiliser une expression d’exclusion dans ce champ, en plus des wildcards « SQL », à l’aide de la syntaxe suivante :

[^AlerteAExclure]

clip_image006

Voici le résultat obtenu :

clip_image008

Il est également possible de combiner plusieures exclusions à l’aide du symbole « pipe » :

[^(AlerteAExclure)|(TestAlert2)]

Attention toutefois, cette astuce exclut en réalité un groupe de caractères et ne supporte donc pas l’utilisation d’espaces.

Powershell: Gestion des erreurs sur Cmdlet

 

Dans mon précédent blog, je vous est montré comment on pouvait mettre en place la gestion d’erreur sur des commandes sous powershell qui ne sont pas des CMDLET, cette fois-ci nous allons voir comment appliquer la gestion d’erreur sur une CMDLET

PERIMETRE: Dans le cadre de l’amélioration des script powershell concernant la vérification des services après le redémarrage des serveurs en production chez un de nos client, celui-ci à laisser le soin au service architecture de trouver une solution.

 

Mon script d’origine:

######SERVEURS A REDEMARRER################

$Computerstring = "orches1"
$Computerdestination = $Computerstring.Split(",")

######SERVICES A ARRETER ET REDEMARRER################

$Servicesstring = "wudfsvc"
$Servicesname = $Servicesstring.Split(",")

######LOG CREER POUR LA VERIFICATION AVANT L'ARRET DES SERVICES SUR CHAQUES SERVEURS + GESTION ERREUR SUR SYNTAXE Command###
$StatusService = foreach ($vm in $Computerdestination){
         get-Service -ComputerName $vm -name $Servicesname | select status,name,machinename }
       

#GESTION ERREUR DES SERVICES

$ExitCodeService = foreach ($SRVservices in $StatusService) {
if ($($SRVservices.status) -eq "Running"){
"Success : Service(s) Running" + $SRVservices
}else{
"Error : Service(s)" + $SRVservices
}
}

$ErrorStatusSVC = if ($StatusService -eq $null){
"Error : Service(s) "
}else{
"Success : Service(s)"
}  

Voici le résultat pour les sortie erreurs:

$ExitCodeService

image

$ErrorStatusSVC

image

Vous voyez au dessus $ExitCodeService prend en compte que le service wudfsvc étant arrêté comme SUCCESS condition voulu ceci est normal et que $ErrorStatusSVC à été mise en place pour anticipé les erreurs $ExitCodeService si aucune valeur ne ressort ($ExitCodeService = VIDE) cela peut être une erreur de syntaxe, de service ou de serveurs inaccessible ou inexistant

Par contre aucune erreur détailler il faut effectuer une recherche supplémentaire.

 

Mon script amélioré:

######SERVEURS A REDEMARRER################

$Computerstring = "orches1"
$Computerdestination = $Computerstring.Split(",")

######SERVICES A ARRETER ET REDEMARRER################

$Servicesstring = "wudfsvc"
$Servicesname = $Servicesstring.Split(",")

######LOG CREER POUR LA VERIFICATION AVANT L'ARRET DES SERVICES SUR CHAQUES SERVEURS + GESTION ERREUR SUR SYNTAXE Command###

$StatusService =
Try {
foreach ($vm in $Computerdestination){
         get-Service -ComputerName $vm -name $Servicesname -ErrorAction stop | select status,name,machinename
        }
}catch{
   "$vm => " + $Error[0]
   }

#GESTION ERREUR DES SERVICES

$ExitCodeService =                                                                                         foreach ($SRVservices in $StatusService) {
            if ($($SRVservices.status) -eq "stopped"){
                    "Success:" + $SRVservices
            }else{
                   "Error:" + $SRVservices
            } 
    }

Voici le résultat pour la sortie d’erreur:

La correction se base sur la gestion d’erreur avec les commandes Try et Catch

Dans la partie Try  entre crochets, la commande get-service doit obligatoirement avoir l’option qui permet la sortie d’erreur qui se nomme        –ErrorAction stop cela permettra d’avoir dans la partie catch les messages d’erreur le déroulement du processus $Error[0] . 

Message des erreurs qui sont géré dans : $StatusService

image

Erreur sur le compte d’ordinateur inexistant ou inaccessible:

image

Erreur sur le service inexistant ou inaccessible:

image

Erreur sur la syntaxe commande get-service:

image

Les messages de sortie sont aussi retransmis dans la variable  $ExitCodeService à l’aide des conditions if et else

Powershell – Exemple de transfert de données vers un système Unix

 

A la suite de la récupération d’un dataset issu d’une requête a une base sql on veut exporter et transférer les données vers un système Unix.

Comme indiqué dans le code, a la suite de la validation du fait que le résultat de la requête contienne des données (RequestSQL OK),  on converti le dataset en csv vers un fichier local ($FullLocalFile):

($DataSet.Tables[0] | convertto-csv -Delimiter ";" -NoTypeInformation)  | Out-File -FilePath $FullLocalFile

Puis on récupère le contenu du fichier pour ensuite le convertir au format UTF8 (au passage on écrase le fichier d’origine):

$content=get-content $FullLocalFile
Set-Content -value $content -Encoding UTF8 -Path $FullLocalFile –Force

Enfin on envoi en ftp le fichier vers le système Unix (en construisant dynamiquement le fichier de commande):

N.B: Il est possible que le mode de transfert (ascii ou binary) ait une influence sur le résultat du transfert. N’hésitez pas a tester les deux cas.

#construction fichier ftpcommands
New-Item -Path "$LocalDirectory\ftpcommands.txt" -ItemType file -Force -value `
"open monserverunix
user1
password
ascii
cd /monappli/data
lcd $LocalDirectory
mput $FileName
Y
bye"

#Envoi FTP et verification
ftp.exe -s:$LocalDirectory\ftpcommands.txt > "$LocalDirectory\resultatftp.txt"

(...)

#suppression du fichier ftpcommands
Remove-Item -Path "$LocalDirectory\ftpcommands.txt"
Remove-Item -Path "$LocalDirectory\resultatftp.txt"

 

$LocalDirectory="D:\Data" $FileName="data.csv" $FullLocalFile="$LocalDirectory\$FileName" (...) #Si le dataset est vide => Echec de la requête => $RequestSuccess=$false If (($DataSet.Tables[0] | Measure-Object).count -eq "0") { $RequestSuccess=$false write-host -ForegroundColor blue "Dataset vide - FIN DU SCRIPT" Exit } Else { $RequestSuccess=$true write-host -ForegroundColor green "RequestSQL OK" #Export du fichier CSV en local ($DataSet.Tables[0] | convertto-csv -Delimiter ";" -NoTypeInformation) | Out-File -FilePath $FullLocalFile #Recuperation du contenu et conversion en UTF8 pour compatibilité Unix $content=get-content $FullLocalFile Set-Content -value $content -Encoding UTF8 -Path $FullLocalFile -Force } #construction fichier ftpcommands New-Item -Path "$LocalDirectory\ftpcommands.txt" -ItemType file -Force -value ` "open monserverunix user1 password ascii cd /monappli/data lcd $LocalDirectory mput $FileName Y bye" #Envoi FTP et verification ftp.exe -s:$LocalDirectory\ftpcommands.txt > "$LocalDirectory\resultatftp.txt" (...) #suppression du fichier ftpcommands Remove-Item -Path "$LocalDirectory\ftpcommands.txt" Remove-Item -Path "$LocalDirectory\resultatftp.txt"

Powershell – Script – Suppression création de compteur de performance

 

Il peut être nécessaire dans le cas d’un script insérant des données de performance de supprimer/recréer l’objet de performance

L’exemple ci-dessous montre la suppression ré-création d’un objet MyObject et d’un compteur de performance Mycounter1.

On vérifie l’existence de l’objet de performance via wmi et l’objet .net [Diagnostics.PerformanceCounterCategory]

On supprime MyObject

On recrée l’objet et son compteur  via Diagnostics.CounterCreationDataCollection et Diagnostics.CounterCreationData

On soumet la création de l’objet “global” via [Diagnostics.PerformanceCounterCategory]

Le compteur peut a partir de là être alimenté et interrogé.

 

if((Get-WmiObject -Query "Select * from Win32_perfformatteddata_MyObject_MyObject").MyCounter1 -eq 0 ` -OR (Get-WmiObject -Query "Select * from Win32_perfformatteddata_MyObject_MyObject").MyCounter1 -eq $null ` -AND [Diagnostics.PerformanceCounterCategory]::Exists(“MyObject”)) { write-host "Suppression et re-creation de l'objet de performance MyObject" #Suppression [Diagnostics.PerformanceCounterCategory]::Delete(“MyObject”); #Creation de l'objet de perf $script:cntrColl = New-Object Diagnostics.CounterCreationDataCollection; Write-Host "Add counter 1"; $counter = New-Object Diagnostics.CounterCreationData; $counter.CounterName = "Mycounter1"; $counter.CounterHelp = "Help for Counter_1"; $counter.CounterType = [Diagnostics.PerformanceCounterType]::NumberOfItems64; $script:cntrColl.Add($counter); #Ajout du compteur Write-Host "Ajout du compteur a PerfMon"; [Diagnostics.PerformanceCounterCategory]::Create(“MyObject”, “My counter”, $script:cntrColl); }

SCOM – Mise a jour de MP Author en SP3

 

L’outil gratuit de création de management pack de Silect Software a été mis  a jour en SP3

http://www.silect.com/mp-author 

Au menu:

- Amélioration de la visualisation et de l'édition des KB

- Amélioration de l’edition du XML

- Détection des oublis de champs DisplayName

- Possibilité d’utiliser les “Bases classes” a la place de LocalApplication en tant que cible d’une nouvelle classe.

- Affichage d’objets supplémentaires issus des MP

-  Ajout d’une liste dynamique de variable pour la customisation des messages d’alertes.

- Amélioration de la gestion de la mémoire utilisée.

Powershell: Gestion d’erreur sur une commande NON CMDLETS

 

PERIMETRE: Tâches planifiés qui permette la réplication de fichier d’un serveur vers un autre chez un de nos client.

FONCTIONNEMENT: Les tâches planifiées lancent des scripts PowerShell, la commande utilisé est la commande ROBOCOPY

Dans le cadre de la gestion des erreurs des commandes dites NON CMDLETS qui sont propre à powershell, la gestion des erreurs est différente.

 

SCRIPT D’ORIGNE:

#Listes des serveurs destinations +chemin
$Srvdestination = "\\orches1\tachep"
$srvdest1 = $Srvdestination.split("\")  
$srvdest = $srvdest1[2]

#Fichier Log avec nom du serveur.log
$Filelog = "$srvdest.log"

#repertoire de LOGS pour la derniere ligne du script powershell
$Folderlogs = "\\orches2\TACHEcollection2"

# Rapport Log Robocopy
$LOGS1 = "$Folderlogs"+"\"+"$Filelog"

#Option logs + chemin du rapport log
$LOGS = "/log:"+"$LOGS1"


#Liste de(s) fichier(s) à copier
$File = "*.*"

#Listes du dossier sources Réplication
$SourceFolder = "\\orches2\tachep2"

#Options de la commande robocopy
$optionstrings = "/XX,/E,/Z,/R:1,/W:2,/MT:64,/TEE"
$options = $optionstrings.split(",")

 

#Copie du fichier source vidéo vers le serveur de destination
$Robocopy = Robocopy $sourcefolder $srvdestination $file $options $logs

$LASTEXITCODE

Il faut savoir que dans la variable $Robocopy vous avez l’affichage du Log robocopy + la création du log $logs  grâce à l’option /TEE qui permet 2 sorties

Nous avons le log Robocopy sous cette forme :

-----------------------------------------------------------------------------
   ROBOCOPY     ::     Robust File Copy for Windows                             
-------------------------------------------------------------------------------

  Started : dimanche 8 mars 2015 16:40:16
   Source : \\orches2\tachep2\
   Dest : \\orches1\tachep\

    Files : *.*       


  Options : *.* /TEE /S /E /DCOPY:DA /COPY:DAT /Z /XX /MT:64 /R:1 /W:2

------------------------------------------------------------------------------

        New File          246.3 m    \\orches2\tachep2\tache.zip
  ------------------------------------------------------------------------------

               Total    Copied   Skipped  Mismatch    FAILED    Extras
    Dirs :         1                0         0         0         0
   Files :         1         1         0         0         0         0
   Bytes :  246.36 m  246.36 m         0         0         0         0
   Times :   0:00:59   0:00:14                       0:00:00   0:00:14
   Ended : dimanche 8 mars 2015 16:40:45

Nous voyons clairement que le log robocopy affiche le résultat de la copie Ok, mais lorsque la copie est un fichier ou répertoire identique  ou qu’il y’a des options au niveau du robocopy à ajouter ou modifier cela devient compliquer à gérer, de plus si nous voulons afficher une sortie simplifié du style Error ou Success en plus du log robocopy, il faudrait connaitre tout les retours sur ce qui est considérer comme Error ou Success , Sans oublier l’erreur de syntaxe de la commande robocopy qui n'apparait pas.

solution se baser sur  $LASTEXITCODE par contre le code de sortie de 0 à 16 cela ne nous dis pas si c’est une Erreur ou un Succès du déroulement de la copie

Voici le 2ème Script avec la gestion des erreurs qui inclura aussi l’erreur de syntaxe de la commande avec l’utilisation de TRY et CATCH. et le SWITCH pour les sorties $LASTEXITCODE.

2EME SCRIPT (le début et identique):

Pour info: Robocopy $LASTEXITCODE. :

- De 0 à 7 : Succès

- De 8 à 16 : Erreur

#Copie du fichier source vidéo vers le serveur de destination
$RoboSyntaxe = try {

      Robocopy $sourcefolder $srvdestination $file $options $logs | Out-Null

          Switch ($LASTEXITCODE
{   
"16" {$RobocopyJob = "Error Robocopy : Serious error. Robocopy did not copy any files. $srvdestination" }
"15" {$RobocopyJob = "Error Robocopy :OKCOPY + FAIL + MISMATCHES + XTRA. $srvdestination" }
"14" {$RobocopyJob = "Error Robocopy : FAIL + MISMATCHES + XTRA . $srvdestination" }
"13" {$RobocopyJob = "Error Robocopy :OKCOPY + FAIL + MISMATCHES. $srvdestination" }
"12" {$RobocopyJob = "Error Robocopy : FAIL + MISMATCHES. $srvdestination" }
"11" {$RobocopyJob = "Error Robocopy : OKCOPY + FAIL + XTRA. $srvdestination" }
"10" {$RobocopyJob = "Error Robocopy : FAIL + XTRA . $srvdestination" }
"9" {$RobocopyJob = "Error Robocopy : OKCOPY + FAIL. $srvdestination" }
"8" {$RobocopyJob = "Error Robocopy: Some files or directories could not be copied $srvdestination" }
"7" {$RobocopyJob = "Success Robocopy : Files were copied, a file mismatch was present, and additional files were present $srvdestination"}
"6" {$RobocopyJob = "Success Robocopy : Additional files and mismatched files exist, No files were copied $srvdestination" }
"5" {$RobocopyJob = "Success Robocopy : Some files were copied. Some files were mismatched $srvdestination"}
"4" {$RobocopyJob = "Success Robocopy : Some Mismatched files or directories were detected $srvdestination" }
"3" {$RobocopyJob = "Success Robocopy : Some files were copied. Additional files were present $srvdestination" }
"2" {$RobocopyJob = "Success Robocopy : Some Extra files or directories were detected $srvdestination "}
"1" {$RobocopyJob = "Success Robocopy : One or more files were copied successfully $srvdestination"}
"0" {$RobocopyJob = "Success Robocopy : No Change files successfully $srvdestination"}     
}
                           
    }catch{
          "Error : syntaxe command robocopy"
          } 
 

Dans ce script nous avons 2 types de sortie d’erreur :

- La 1ère s’effectue à l’aide du Try et catch, si on enleve le Y de ROBOCOPY on obtient :

image

image

- La 2ème s’effectue à l’aide du switch sur la variable $LASTEXITCODE mais commenter avec le chemin de destination et la variable qui permet d’afficher le résultat est $RobocopyJob :

image

image

Nous pouvons envoyer ses informations dans les journaux d’évènement dans un journal personnaliser APPLIMETIER par exemple plutôt que le log robocopy qui peut être trop long et pas pris en compte.