IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Inventorier les KB sur plusieurs serveurs distants


Sujet :

Scripts/Batch

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Inventorier les KB sur plusieurs serveurs distants
    Bonjour,

    Je suis confronté à un problème :

    J'ai fait un script qui permet d'inventorier les KB sur des serveurs distants et d'envoyer les résultats dans un fichier *.txt.
    Le script fonctionne cependant j'ai des erreurs (accès refusé) sur certaines machines :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    "Get-WmiObject : Accès refusé. (Exception de HRESULT : 0x80070005 (E_ACCESSDENIE
    D))
    Au niveau de C:\COMMUN\POWERSHELL\KB_Check\KB_Check.ps1*: 77 Caractère*: 20
    + $kb = get-wmiobject <<<<  -class "Win32_QuickFixEngineering" -ComputerName $S
    ervup | Select-Object -Property HotFixId
        + CategoryInfo          : NotSpecified: (:) [Get-WmiObject], UnauthorizedA 
       ccessException
        + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.Pow 
       erShell.Commands.GetWmiObjectCommand"
    J'ai activé transcript mais j'utilise une variable pour le nom des serveurs alimentée par une recherche de Computer dans une OU.

    Comment puis connaître le nom des machines qui posent problème ?
    Je vous remercie par avance de vous pencher sur mon problème.
    Ci-joint le script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    # Chemin des fichiers #
    
    
    $chemin = "C:\COMMUN\POWERSHELL\KB_Check"
    
    
    # Création des répertoires "result" et "Log" #
    
    
    if (test-path $Chemin\log) {}
    else {$Log = new-item "$Chemin\log" –type directory}
    if (test-path $Chemin\result) {}
    else {$result = new-item "$Chemin\result" –type directory}
    
    Start-Transcript $chemin\log\KB_Check.log
    
    
    # Suppression des *.txt dans le répertoire $chemin et ses sous-dossiers #
    
    
    if ((get-childitem $Chemin -include *.txt -recurse) -like "*.txt")
    {
    get-childitem $Chemin -include *.txt -recurse | remove-item
    }
    
    
    # Recherche des serveurs a scanner dans l'OU XX - Resultats dans servers.txt #
    
    
    $searcher=new-object System.DirectoryServices.DirectorySearcher([adsi]'LDAP://ou=XX,ou=serveurs,dc=domain,dc=com','objectCategory=computer')
    $searcher.FindAll()|%{$_.Properties.name}|Out-File $chemin\servers.txt
    
    
    # Obtention de la date du jour au format yyyymmdd #
    
    
    $date = get-date -uformat "%Y%m%d"
    
    
    # Pour chaque serveur dans servers.txt... #
    
    
    foreach($name in (get-content $chemin\servers.txt))
    {
    
    
    # Test ping #
    
    
    if (test-connection -computername $name -count 1 -quiet)
    
    {Out-file $Chemin\result\Ping_OK.txt -inputobject "$Name" -encoding ASCII -append}
    
    else
    
    {Out-file $Chemin\result\Ping_KO.txt -inputobject "$Name" -encoding ASCII -append}
    
    
    
    
    # Pour chaque serveur qui ping : remonter des ID de KB dans un Date_KB_Nom_du_serveur.txt #
    
    
    foreach($Servup in (get-content $chemin\result\Ping_OK.txt))
    
    {
    $NomFichier = "$date"+"_"+"KB"+"_"+"$Servup"
    $kb = get-wmiobject -class "Win32_QuickFixEngineering" -ComputerName $Servup | Select-Object -Property HotFixId
    out-file -inputobject $kb $chemin\result\$NomFichier.txt -encoding ASCII}
    
    }
    
    # Affichage d'une boîte de dialogue "traitement terminé"
    
    [void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
    $MaMsgBox = [Windows.Forms.MessageBox]
    $Monbouton=[Windows.Forms.MessageBoxButtons]::OK
    $Monicon=[windows.forms.MessageBoxIcon]::Information
    $MaMsgBox::show("Traitement terminé !","Inventaire des KB des serveurs de l'ou XX",$Monbouton,$Monicon)
    
    
    # Suppression du fichier servers.txt s'il existe ;-) #
    
    
    if (test-path $chemin\servers.txt)
    {
    Remove-Item $chemin\servers.txt}
    
    
    # Arrêt de la log #
    
    
    Stop-transcript

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    une solution, à placer au sein de la boucle des serveurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Remove-Variable ErrorCallKb -ea silentlycontinue
    Get-WmiObject -class "Win32_QuickFixEngineering" -ComputerName $Servup -ev ErrorCallKb -ea silentlycontinue
    if ($ErrorCallKb.Count -gt 0)
     { "Appel en erreur sur le serveur $Servup }
    Je te laisse adapter le code : ajout des noms de serveur dans une collection.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup !
    Je teste et je reviens donner le résultat. Certainement demain car pas le temps aujourd'hui.

    EDIT : Je ne voudrais pas trop abuser, je suis débutant en Powershell et en scripting tout court, je vais me documenter sur ta solution mais si tu pouvais m'expliquer ton code (dans les grandes lignes...), j'apprécierais beaucoup...

  4. #4
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bouba_69 Voir le message
    EDIT : Je ne voudrais pas trop abuser, je suis débutant en Powershell et en scripting tout court, je vais me documenter sur ta solution mais si tu pouvais m'expliquer ton code (dans les grandes lignes...), j'apprécierais beaucoup...
    Un passage obligé : lire la documentation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Remove-Variable ErrorCallKb -ea silentlycontinue
    Supprime une variable, le paramète -ErrorAction (ea) indique de ne pas afficher les erreurs, par exemple lors de la première itération la variable peut ne pas exister.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Get-WmiObject -class "Win32_QuickFixEngineering" -ComputerName $Servup -ev ErrorCallKb -ea silentlycontinue
    Appel un cmdlet, le paramètre ErrorVariable (ev) indique d'utiliser une variable spécifique pour récupèrer les erreurs d'exécution du cmdlet.
    Pour le paramètre ea -(ErrorAction) voir précédement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if ($ErrorCallKb.Count -gt 0)
    { "Appel en erreur sur le serveur $Servup }
    Le type de la variable crée par le paramètre ErrorVariable est arraylist, dans tous les cas, qu'une erreur existe ou pas, le cmdlet la crée.
    On a donc une collection contenant soi aucun élément (pas d'erreurs) soit plusieurs éléments (plusieurs erreurs).

    Il se peut que l'appel à Remove-Variable ErrorCallKb soit redondant, i.e. le cmdlet supprime et recrée la variable. A tester.

  5. #5
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    A supprimer : doublons

Discussions similaires

  1. creer un cloud répartis sur plusieurs serveurs distants
    Par altair8080 dans le forum Cloud Computing
    Réponses: 2
    Dernier message: 07/06/2015, 09h16
  2. Lancer un script/commande sur plusieurs serveurs distants
    Par bras39 dans le forum Shell et commandes GNU
    Réponses: 15
    Dernier message: 14/10/2011, 21h11
  3. Réponses: 6
    Dernier message: 07/10/2011, 18h19
  4. [AC-2003] executer les macro sur un serveur distant
    Par strike57 dans le forum VBA Access
    Réponses: 2
    Dernier message: 14/04/2009, 14h26
  5. Réponses: 0
    Dernier message: 21/08/2008, 07h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo