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 :

Cliché instantanée Powershell [PowerShell]


Sujet :

Scripts/Batch

  1. #1
    Membre habitué
    Homme Profil pro
    Technicien
    Inscrit en
    Février 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Février 2018
    Messages : 12
    Par défaut Cliché instantanée Powershell
    Bonjour,

    Je vous explique mon problème.

    J'ai une trentaine de serveur à gérer ou je réalise des clichés toutes les 6 heures. Mon soucis c'est que j'ai aucune remonté d'information, du coup je voudrais réaliser un script powershell qui permet de comparer les lecteurs du serveur (C:, D:, G: ) par exemple, et les lettres des clichés réalisés durant les 6 dernières heures et m'afficher "OK" si le volume a un cliché de moins de 6heures, sinon m'afficher "KO".

    J'ai fais un petit script powershell sauf qu'il ne m'affiche pas les volumes sans clichés.

    Code powershell : 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
    $BackupDay = 6
    $server = $env:COMPUTERNAME
    Set-ExecutionPolicy unrestricted -force
     
    Function Get-DriveLetters
    {
        $volumes = @{}
        $allvolumes = Get-WmiObject -Class "win32_volume" -ComputerName $server | Select DeviceID, Name
             foreach ($v in $allvolumes)
                 {
                     $volumes.add($v.DeviceID, $v.Name)
                 }
             $volumes
    }
     
    Function Get-vol{
        $test2=@{}
        $test = Get-PSdrive -PSProvider filesystem | Select root, Name
            foreach ($t in $test)
                 {
                     $test2.add($t.Root, $t.Name)
     
                 }
    }
     
    $teste = Get-vol 
    write-host $teste
     
    Function Check-ShadowCopies
    {
        $allshadowcopies = @()
        foreach ($s in $server)
            {
                 $driveletters = Get-DriveLetters $s
                 $shadowcopies = Get-WmiObject -Class "Win32_shadowcopy" | Select InstallDate, VolumeName
     
                      foreach ( $copy in $shadowcopies)
                         {
                           $shadowcopy = New-Object System.object              
                           $date = [datetime]::ParseExact($copy.InstallDate.Split(".")[0], "yyyyMMddHHmmss", $null)
     
                           if ( $date -ge (Get-Date).Addhours(-$backupday))
                                 { 
                                    ## La variable $Etat prend la valeur "OK" ##
     
                                      $Etat = "OK"
     
                                    ## On ajoute à l'objet personnalisé $cliches une propriété Etat où l'on mettra la valeur retournée ##
     
                                       $shadowcopy| Add-Member -Type NoteProperty -Name Select -Value $driveletters.item($copy.VolumeName)
                                       $shadowcopy | Add-Member -Type NoteProperty -Name Etat -Value $Etat
                                       $shadowcopy | Add-Member -Type NoteProperty -Name Date -Value $date
                                     ## On ajoute les valeurs retournées de la variable $cliches dans le tableau $Tableau ##
     
                                       $allshadowcopies += $shadowcopy
                           }
     
                             ## Fin du if ##
     
                             ## Sinon ##
     
                 else
                    {
                        $Etat = "Ko"
                        $shadowcopy | Add-Member -Type Noteproperty -Name select -Value $teste
                    }                
     
     
     
         }
             $test2
             $allshadowcopies | Sort-Object Etat,Driveletter -Descending
    }
    }
     
    $checkshadowcopy = Check-Shadowcopies
    $checkshadowcopy | Out-File C:\Users\Administrateur\Desktop\test.txt

  2. #2
    Membre habitué
    Homme Profil pro
    Technicien
    Inscrit en
    Février 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Février 2018
    Messages : 12
    Par défaut Personne
    Personne ? J'aurais vraiment besoin d'aide.. je stagne..

    Cordialement,

  3. #3
    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
    Billets dans le blog
    1
    Par défaut
    Salut,
    place des traces de debug là où tu crées /émets des objets.
    La fonction Get-Vol ne renvoie rien.
    Et il est préférable d'utiliser un PSCustomObject au lieu d'un Object.
    Crée une fonction de création d'objet personnalisé, car je ne suis pas sûr qu'il aient tous les mêmes propriétés selon l'état.

  4. #4
    Membre habitué
    Homme Profil pro
    Technicien
    Inscrit en
    Février 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Février 2018
    Messages : 12
    Par défaut
    Salut,

    J'ai regardé votre message et vos indications à essayer, sauf que je ne maîtrise pas spécialement powershell.
    De ce fait je n'ai pas très bien compris ce que vous vouliez que j'essaie et je n'ai pas réussi.

    Cordialement,

  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
    Billets dans le blog
    1
    Par défaut
    Ok
    Citation Envoyé par thibautF Voir le message
    J'ai fais un petit script powershell sauf qu'il ne m'affiche pas les volumes sans clichés.
    Ton script doit renvoyer des objets avec et sans clichés, pour le moment il ne semble gérer que ceux avec cliché.
    Place avant la/les lignes de création de tes objets, un appel à write-debug "Objet avec cliché crée" ou write-debug "Objet sans cliché crée".
    Tu actives la trace avec $Debugpreference='Continue'.
    Code powersehll : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     $Etat = "OK"
     write-debug "Objet avec cliché crée"
    
    ...
      $Etat = "Ko"
     write-debug "Objet sans cliché crée"
    Ainsi tu verras cb d'objet tu penses créer et combien tu en reçois réellement.

    Ton idée d'utiliser un tableau $allshadowcopies n'est peut être pas la bonne approche. On peut déterminer ceux avec ou sans cliché en filtrant sur la proprieté Etat -eq 'Ok'

  6. #6
    Membre habitué
    Homme Profil pro
    Technicien
    Inscrit en
    Février 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Février 2018
    Messages : 12
    Par défaut
    Merci, pour votre rapidité,

    J'ai donc changer le En
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $Etat -eq 'ko' 
    write-debug "Objet sans cliché crée"

    et

    En
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $Etat -eq 'ok' 
    write-debug "Objet cliché crée"

    ça me retourne dans mon fichier txt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    False
    False
    False
    False
    False
    
    et mes lecteurs avec le cliché présent
    Je dois en déduire quoi?

  7. #7
    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
    Billets dans le blog
    1
    Par défaut
    Je t'ai réécrit une partie pour que ce soit plus lisible et te permettre de comprendre (enfin j'espère ) ce qui ne vas pas dans ton code:
    Code powershell : 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
    95
    96
     
    $BackupDay = 6
    $server = $env:COMPUTERNAME
    Set-ExecutionPolicy unrestricted -force
     
    Function Get-DriveLetters{
     param($Server)
     
        $volumes = @{}
        $allvolumes = Get-WmiObject -Class "win32_volume" -ComputerName $server | Select DeviceID, Name
        foreach ($v in $allvolumes)
        {
         $volumes.add($v.DeviceID, $v.Name)
        }
        $volumes
    }
     
    Function Get-vol{
      $test2=@{}
      # Attention au drive perso : new-PSDrive MonDrive c:\projets\ ...
      $test = Get-PSdrive -PSProvider FileSystem |
               Where-Object {$_.name -match '^[A-Z]$'} | 
               Select-Object Root, Name
      foreach ($t in $test)
      {
        $test2.add($t.Root, $t.Name)
      }
     $test2
    }
     
    $teste = Get-vol 
    write-host $teste
     
     
    Function New-InfosCliches{
    #crée un objet personnalisé
    param(
       [Parameter(Mandatory=$True,position=0)]
       [AllowNull()]
      $Select,
     
       [Parameter(Mandatory=$True,position=1)]
       [AllowNull()]
      $Etat,
     
       [Parameter(Mandatory=$True,position=2)]
       [AllowNull()]
      $Date
    )
     
      [pscustomobject]@{
        PSTypeName='InfosCliches';
        Select=$Select;
        Etat=$Etat;
        Date=$Date;
       }
    }# New-InfosCliches
     
    Function Check-ShadowCopies{
     param($Servers)         
     
      foreach ($Srv in $servers)
      {
          $driveletters = Get-DriveLetters $Srv
          $shadowcopies = Get-WmiObject -Class "Win32_shadowcopy" | Select InstallDate, VolumeName
     
          foreach ( $copy in $shadowcopies)
          {
           $shadowcopy=New-InfosCliches -Select $null -Etat $null-Date $null            
           $date = [datetime]::ParseExact($copy.InstallDate.Split(".")[0], "yyyyMMddHHmmss", $null)
     
           if ( $date -ge (Get-Date).Addhours(-$backupday))
           { 
              ## On ajoute à l'objet personnalisé $cliches une propriété Etat où l'on mettra la valeur retournée ##
             $shadowcopy.Select=$driveletters.item($copy.VolumeName)
             $shadowcopy.Etat="Ok"
             $shadowcopy.Date=$Date
              ## On émet le nouvel objet dans le pipeline
             write-debug "Création objet avec cliché" 
             Write-output $shadowcopy
           }
          else
          {
            write-debug "Création Objet sans cliché "        
            $shadowcopy.Etat="Ko"
            $shadowcopy.Select=$teste
                  ## On émet le nouvel objet dans le pipeline
            Write-output $shadowcopy
          }                
        }
     }
    }
    $Debugpreference='Continue'
      $checkshadowcopy = Check-Shadowcopies $Server
    $Debugpreference='SilentlyContinue'
    $checkshadowcopy | Sort-Object Etat,Driveletter -Descending| Out-File C:\Users\Administrateur\Desktop\test.txt
    Dans la dernière ligne, la propriété DriveLetter n'existe pas. J'ai retiré cette instruction de la fonction elle fausse le résultat obtenu. Quant à la variable $teste je l'ai laissé en l'état.
    Enfin le pb est que tu crées des objets en te basant sur la liste des clichés et pas sur la liste de drives du serveur.

  8. #8
    Membre habitué
    Homme Profil pro
    Technicien
    Inscrit en
    Février 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Février 2018
    Messages : 12
    Par défaut
    Merci beaucoup, donc j'ai plutôt bien compris ( t'as bien fais d'espérer ).

    C'est aussi ce que j'avais remarqué que je me basais sur la liste des clichés car quand j'essaye de faire l'inverse j'ai le droit à un retour de valeur null par exemple pour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $shadowcopy.Select=$driveletters.item($copy.VolumeName)
    Et quand j'arrive à trouver une solution le fichier txt est toujours vide.

    En revanche avec ton programme je viens de remarquer que l'utilisation du if n'est peut-être pas approprié, car actuellement si le cliché a moins de 6 heures il me dit 'Ok' mais si le cliché à plus de 6 heures il va me retourner 'Ko', donc si j'ai 20 cliché existant sur le serveur ça va me faire un joli petit paver à lire.

    Du coup voilà, je continue à chercher de mon côté en utilisant la base que tu m'as donné car c'est beaucoup plus claire et compréhensible que le fouilli que j'avais fais.

  9. #9
    Membre habitué
    Homme Profil pro
    Technicien
    Inscrit en
    Février 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Février 2018
    Messages : 12
    Par défaut
    J'ai de nouveau regardé et j'ai toujours pas trouvé comme faire.
    Le résultat attendu est :

    Nom : Capture.PNG
Affichages : 640
Taille : 2,6 Ko

    Sauf que ça m'affiche l'ensemble des clichés présents, du coup je sais pas comment faire, si tu aurais une piste pour moi ça serait génial.

  10. #10
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par thibautF Voir le message
    Sauf que ça m'affiche l'ensemble des clichés présents
    Oui, car la boucle sur les clichés émet un objet dans tous les cas.
    Citation Envoyé par thibautF Voir le message
    du coup je sais pas comment faire
    Je n'ai pas de jeux de test sous la main, pas facile de coder sans données :-)
    Reprend tes specs et réécrit cette partie uniquement : les lettres des clichés réalisés durant les 6 dernières heures.

    De ce que j'ai compris :
    On peut supposer que pour un lecteur il existe 0 ou n clichés,
    Si zéro : là je ne sais pas ce que tu dois faire, existe-il une liste des lecteurs concernés par les clichés ? cas des nouveaux serveurs ?
    S'il en existe plusieurs tu les regroupes par nom de volume et tu prend le plus récent de chaque groupe (en regardant la classe WMI je constates que tu ne tiens pas compte du statut du cliché, est-ce voulu ?).
    Tu auras donc au final le dernier cliché pris pour chaque lecteur.
    Code powershell : 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
     
    $DriveLetters=Get-DriveLetters '.'
     
    #propriété calculé
    $property=@{Name='InstallDate';Expression={[datetime]::ParseExact($_.InstallDate.Split(".")[0], "yyyyMMddHHmmss", $null)}}
     
     #groupe les clichés
    $GrpCliches=Get-WmiObject -Class "Win32_shadowcopy"| 
     Select $property, VolumeName|Group-Object VolumeName
     
    #récupère le dernier cliché de chaque volume
    $List=foreach ($CurrentGrp in $GrpCliches)
    {
      $ShdCp=$CurrentGrp.Group|sort-object InstallDate -Descending|Select-Object -Firs 1
     
     #On ajout le nom du drive et on émet l'objet
      $DriveName =$DriveLetters.$($ShdCp.VolumeName)
      $ShdCp|Add-member -name DriveName  -MemberType noteproperty -Value $DriveName -PassThru
    }
    $List
    # 
    # InstallDate         VolumeName                                        DriveName
    # -----------         ----------                                        ---------
    # 20/02/2018 11:13:55 \\?\Volume{f86ebb1f-86e0-11e1-b0a8-806e6f6e6963}\ C:\
    N'ayant dans mon jeux de test que 2 clichés pour un seul drive, le résultat est correct

  11. #11
    Membre habitué
    Homme Profil pro
    Technicien
    Inscrit en
    Février 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Février 2018
    Messages : 12
    Par défaut
    Alors pour
    Si zéro : là je ne sais pas ce que tu dois faire, existe-il une liste des lecteurs concernés par les clichés ? cas des nouveaux serveurs ?
    Je dois faire en sorte de lister les lecteurs disponibles sur le serveur, donc si j'ai un lecteur C: et un lecteur D: afficher mes deux lecteurs. Puis vérifier si sur le lecteur C: il y a un cliché datant de moins de 6 heures et après faire pareil sur le deuxième lecteur. S'il n'y a pas de cliché qui a était fait il doit quand même m'afficher le lecteur et me dire qu'il n'y a pas de cliché.

  12. #12
    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
    Billets dans le blog
    1
    Par défaut
    YAka le coder alors :-)

    A priori ton objet devrait au moins avoir ces propriétés (d'autre noms sont possibles) en plus de celle que tu as déjà ajoutées :
    isShadowCopy, isInThePeriod, ShadowCopyStatus

    Ensuite sur chaque objet tu peux ajouter une méthode , renvoyant vrai ou faux, permettant de calculer la présence d'un cliché d'après tes spécifications :
    isShadowCopy=$true (present), isInThePeriod=$true (moins de 6 heure),ShadowCopyStatus='Ok'

  13. #13
    Membre habitué
    Homme Profil pro
    Technicien
    Inscrit en
    Février 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Février 2018
    Messages : 12
    Par défaut
    Oui tout à fait il y a plus qu'à..

    Mais j'ai pas très bien compris ce que tu me demandes de faire

  14. #14
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par thibautF Voir le message
    Mais j'ai pas très bien compris ce que tu me demandes de faire
    C'est juste une proposition, fais comme tu le sens.

  15. #15
    Membre habitué
    Homme Profil pro
    Technicien
    Inscrit en
    Février 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Février 2018
    Messages : 12
    Par défaut
    Justement, j'aurais aimé tester t'as propositions mais le *hic* c'est que je ne comprends pas comment l'appliquer.

  16. #16
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par thibautF Voir le message
    c'est que je ne comprends pas comment l'appliquer.
    Ton premier code me fait penser le contraire :
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $shadowcopy | Add-Member -Type NoteProperty
    En revanche où placer la création de ces propriétés je peux le comprendre.
    ShadowCopyStatus provient de la classe WMI, on la sélectionne en l'état.

    Pour isShadowCopy tu la crées au même moment et tu la renseigne à $false par défaut. Et si un cliché existe tu la modifies à $true.

    Pour isInThePeriod tu la crées également au même moment, mais tu la renseignes 'plus tard', c'est à dire une fois que la propriété InstalleDate prend corps, car c'est une propriété calculé, mais une seule fois pas à chaque accès.

    Pour la méthode c'est qq chose comme ça:
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     #Le path est-il valide ? 
    $PSPathInfo| 
      Add-Member -Membertype Scriptmethod -Name isaValidFileSystemPath {
         $result=($this.LastError -eq $null)  -and 
                 (($this.isFileSystemProvider -eq $true) -or ($this.isUNC -eq $true)) 
        return $result                    
     }
    Dans cet exemple $PSPathInfo est un objet perso contenant de nombreuses propriétés qui aident à répondre à certaines questions :
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     #Le chemin de destination doit être valide  
     #le chemin valide doit exister
     #Le chemin doit référencer le FileSystem
     #Comme on attend une seule entrée on n'interprète pas le globbing
    $PSPathInfo=New-PsIonicPathInfo -LiteralPath $OutputPath
    if (-not $PSPathInfo.IsaValidNameForTheFileSystem()) -> erreur
    #si ok, la suite du traitement
    Dans ton cas cela facilitera la construction du rapport final

  17. #17
    Membre habitué
    Homme Profil pro
    Technicien
    Inscrit en
    Février 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Février 2018
    Messages : 12
    Par défaut
    Salut,

    Je ne vais pas te mentir, mais le script je suis censés l'avoir finis pour 18h mais tant pis car la je suis totalement perdu.. Le powershell ne doit pas être fait pour moi.
    Merci pour t'on aides et je vais essayer de trouver comment faire car la c'est le fouillis dans ma tête

  18. #18
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par thibautF Voir le message
    Je ne vais pas te mentir, mais le script je suis censés l'avoir finis pour 18h
    Il est préférable de communiquer les contraintes au début :-)
    Citation Envoyé par thibautF Voir le message
    Le powershell ne doit pas être fait pour moi.
    Faut avoir le temps pour faire les choses et les comprendre.
    Citation Envoyé par thibautF Voir le message
    mais tant pis car la je suis totalement perdu..
    C'est un peu de ma faute, on ne part pas du même point.
    A priori c'est toi qui te chargera de la maintenance de ce code(le fameux 'ton script, marche pas'), je me suis dit que tu devais faire un effort pour comprendre 2-3 trucs.

    Voilà une proposition :
    Code powershell : 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
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
     
    Set-ExecutionPolicy unrestricted -force
    $BackupDay = 6
    $server = $env:COMPUTERNAME
     
    Function Get-DriveLetters{
     param($Server)
     
        $volumes = @{}
        $allvolumes = Get-WmiObject -Class "win32_volume" -ComputerName $server | Select DeviceID, Name
        foreach ($v in $allvolumes)
        {
         $volumes.add($v.DeviceID, $v.Name)
        }
        $volumes
    }
     
    Function Get-Volume{
      $Volumes=@{}
      # Attention au drive perso : new-PSDrive MonDrive c:\projets\ ...
      $Drives = Get-PSdrive -PSProvider FileSystem |
               Where-Object {$_.name -match '^[A-Z]$'} | 
               Select-Object Root, Name
      foreach ($Drive in $Drives)
      {
        $Volumes.Add($Drive.Root, $Drive.Name)
      }
     $Volumes
    }
     
     
    Function New-InfosCliche{
    #crée un objet personnalisé
    param(
       [Parameter(Mandatory=$True,position=0)]
      $DriveName
    )
     
      $InfosCliche=[pscustomobject]@{
        PSTypeName='InfosCliche';
       DriveName=$DriveName
       VolumeName=$null
       Etat=$False
       InstallDate=$null
       isShadowCopy=$false 
       isInThePeriod=$false 
       ShadowCopyStatus=$null
       }
    $InfosCliche|
     Add-Member -Membertype Scriptmethod -Name IsSnapshotLessThanPeriod {
      #si le volume a un cliché de moins de 6heures,            
         $result=($this.isShadowCopy -eq $true)  -and 
                 (($this.isInThePeriod -eq $true) -or ($this.ShadowCopyStatus -eq 'Ok')) 
        return $result                    
     } -PassThru
    }# New-InfosCliches
     
     
    function Get-ShadowCopies{
     #Attention dépendance sur $DriveLetters
     param($Server)
     
      #propriété calculé
      $property=@{Name='InstallDate';Expression={[datetime]::ParseExact($_.InstallDate.Split(".")[0], "yyyyMMddHHmmss", $null)}}
     
       #groupe les clichés
      $GrpCliches=Get-WmiObject -Class "Win32_shadowcopy" -ComputerName $Server| 
       Select $property, VolumeName,Status|Group-Object VolumeName
     
      #récupère le dernier cliché de chaque volume
      foreach ($CurrentGrp in $GrpCliches)
      {
        $ShdCp=$CurrentGrp.Group|sort-object InstallDate -Descending|Select-Object -First 1
         #On ajoute le nom du drive et on émet l'objet
        $DriveName =$DriveLetters.$($ShdCp.VolumeName)
        $ShdCp|Add-member -name DriveName  -MemberType noteproperty -Value $DriveName -PassThru
      } 
    }
     
    Function Check-ShadowCopies{
     param($Servers)         
      $CurrentDate=(Get-Date).Addhours(-$backupday)
      foreach ($Server in $Servers)
      {
     
          $DriveLetters = Get-DriveLetters -Server $Server
           #@() = on crée tjr un tableau
          $ShadowCopies=@(Get-ShadowCopies -Server $Server) 
     
          $ServerDrives=foreach ($Drive in $DriveLetters.GetEnumerator()) {New-InfosCliche -DriveName $Drive.Value }
          foreach ($Current in $ServerDrives )
          {
            $SnapShot=$ShadowCopies|
                       Where-Object {$_.DriveName -eq $Current.DriveName}|
                       Select-Object -First 1
            if ($null -ne $SnapShot)
            {
              $Current.VolumeName=$SnapShot.VolumeName
              $Current.InstallDate=$SnapShot.InstallDate
              $Current.isShadowCopy=$True
              $Current.isInThePeriod=$SnapShot.InstallDate -ge $CurrentDate
              $Current.ShadowCopyStatus =$SnapShot.Status
              # on laisse Etat en boolean
              $Current.Etat=$Current.IsSnapshotLessThanPeriod()
            }
          }#Foreach $ServersDrives
          Write-Host "Server: $server"
          $ServerDrives
     }#Foreach $Servers
    }
     
    $servers=@('.')
    Check-ShadowCopies $servers
    La recherche dans 2 listes n'est pas terrible (jointure) et la requêtre WMI sur les snapshopt pourrait être amélioréé.
    Il n'y a ni tests ni gestion d'erreur.

  19. #19
    Membre habitué
    Homme Profil pro
    Technicien
    Inscrit en
    Février 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Février 2018
    Messages : 12
    Par défaut
    Alors la chapeau, ton programme est exactement ce dont j'avais besoin.

    En y regardant du plus près à ce que tu as fais, ça devient beaucoup plus claire et compréhensible, et je me sens capable de pouvoir le refaire.

    En revanche quand j'essaie de sortie les informations de la fonction Check-ShadowCopy je récupère un fichier txt vierge mais ça je ne sais pas si c'est normal ou non ( je ne pense pas du tout que ça le soit).

    J'utilise la fonction comme avant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $checkshadowcopy = Check-Shadowcopies
    $checkshadowcopy | Out-File C:\Users\xxx\Desktop\test.txt
    Invoke-Item ' C:\Users\xxx\Desktop\test.txt
    ou encore

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $checkshadowcopy = Check-Shadowcopies $servers
    $checkshadowcopy | Out-File C:\Users\xxx\Desktop\test.txt
    Invoke-Item ' C:\Users\xxx\Desktop\test.txt
    les xxx correspondant à mon user.

    et encore merci

  20. #20
    Membre habitué
    Homme Profil pro
    Technicien
    Inscrit en
    Février 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Février 2018
    Messages : 12
    Par défaut
    C'est bon en faite j'ai résolus mon problème tout seul

    Merci énormément Laurent, grâce à toi je ne me ferais pas taper sur les doigts

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WS 2012 R2] Clichés instantanés disparus
    Par zimeau dans le forum Windows Serveur
    Réponses: 0
    Dernier message: 07/10/2016, 10h41
  2. [WS 2008 R2] Problème clichés instantanés VSS
    Par bubba2a dans le forum Windows Serveur
    Réponses: 5
    Dernier message: 29/09/2011, 21h40
  3. [WS 2003] Cliché instantané (shadow copy)
    Par souf954 dans le forum Windows Serveur
    Réponses: 1
    Dernier message: 16/08/2011, 11h45
  4. [WS 2003] Problème cliché instantané
    Par med_med dans le forum Windows Serveur
    Réponses: 3
    Dernier message: 28/03/2011, 09h16
  5. retablir une version des cliché instantané sur win 2k3
    Par passion_info dans le forum Windows Serveur
    Réponses: 1
    Dernier message: 17/03/2009, 14h16

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