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 :

gestion fichier CSV : Script d'audit PARC PC des Admins locaux + listing CSV


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2014
    Messages : 3
    Par défaut gestion fichier CSV : Script d'audit PARC PC des Admins locaux + listing CSV
    Bonjour Amis développeurs,

    J'ai un petit soucis avec un script POWERSHELL, j'ai cherché en vain sur le forum alors je viens glaner quelques avis de personnes un peu plus expérimentées que moi

    Bon je m'explique, j'ai réalisé un petit script exécuté via GPO (logon user) qui audit le poste de l'utilisateur afin de lister les administrateurs locaux.
    Il va alors mettre à jour un .CSV réseau afin d'ajouter une ligne dédiée au poste (composée du "computername","date","admin users").

    Tout fonctionne bien seulement parfois le fichier perd la totalité des lignes enregistrées les jours précédents (Comme ci quelqu'un l'avait supprimé). Je me demande si cela n'est pas dû à 2 logins simultanés (à la seconde prêt du moins durant le traitement CSV) ce qui fait que mon "get-content" ne récupère aucune valeur (genre va voir "ailleurs", fichier en cours d'exécution...) mais c'est blizzard j'ai parfois des saisis de 2 provenances différentes à la même "heure/minutes/secondes" donc ca doit pas être le cas.

    Quelqu'un aurait-il une idée genre libérer le fichier CSV après le get-content ? Tester s'il est utilisé avant ? Utiliser une autre méthode que get-content ? Je ne me vois pas faire une copie provisoire car je perdrai des entrées également....

    Voici le bout de script concerné et le CSV (Si vous souhaitez le script complet je peut le mettre bien sûr) :

    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
    $global:Members = ""
    $ListingDate = Get-Date -format 'dd/MM/yyyy HH:mm:ss'			
    $CptName = $env:computername
    $ListingCSVALL = "\\...\Listing_All_PC_PROD.csv"
    ############################### Export Function Members ###############################################
    function Get-Members($computername,$groupname){
         $computer = [ADSI]("WinNT://$computername,computer") 
         $group=$computer.psbase.children.find($groupname) 
         $group.psbase.invoke("Members") | 
             ForEach-Object{
    			$Member = $_.GetType().InvokeMember("Name", ‘GetProperty’, $null, $_, $null)
    			$global:Members = $global:Members + $Member + " / "	
             }
    }
    ############################# END Export Function Members ##############################################
    
    ################################## BODY SCRIPT ###################################################
    $OSLanguage = (Get-Wmiobject Win32_OperatingSystem).OSLanguage		# Find OS Language for variable initialization ($AdmGroup destiny to Get-Members Function)
    if ($OSLanguage -eq 1036){							# If Os language is on French
    	$AdmGroup = "Administrateurs"
    }
    else{									# Or not
    	$AdmGroup = "Administrators"
    }
    Get-Members $CptName $AdmGroup						# Export members with Get-Members Function
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Phase 2 : global report Generation or update ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
    
    $Listing = get-content $ListingCSVALL  | where { -not ($_ -like "$CptName*")}
    set-content $ListingCSVALL $Listing							# Export in CSV listing without actually computer
    Add-content -path $ListingCSVALL -Value "$CptName;$ListingDate;$global:Members"	# Update CSV Listin with actually computer

    Le CSV pour donner une idée de la fréquence (les date/heure sont les véridiques par contre j'ai viré des info entreprise, vous comprendrez ... :

    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
    
    PC1;05/10/2015 09:13:03;Administrateur / GRP AD / Domain Admins / GRP AD / 
    PC2;05/10/2015 09:13:11;Administrateur / Domain Admins / GRP AD / toto / 
    PC3;05/10/2015 09:13:56;Administrateur / Domain Admins / GRP AD /  
    PC4;05/10/2015 09:14:32;Administrateur / Domain Admins / User / adminTemp / 
    PC5;05/10/2015 09:14:51;Administrateur / Domain Admins / GRP AD /  
    PC6;05/10/2015 09:15:22;Administrateur / Domain Admins / 
    PC7;05/10/2015 09:15:39;Administrateur / Domain Admins / 
    PC8;05/10/2015 09:17:04;Administrateur / Domain Admins / S-1-5-21-2346172643-988803912-3779244660-15844 / 
    PC9;05/10/2015 09:18:15;Administrateur / Domain Admins / 
    PC10;05/10/2015 09:18:43;Administrateur / Domain Admins /  
    PC11;05/10/2015 09:19:07;Administrateur / Domain Admins / 
    PC12;05/10/2015 09:40:28;Administrateur / a /
    PC13;05/10/2015 09:40:31;Administrateur / Domain Admins / 
    PC14;05/10/2015 09:40:31;Administrator /

    Bon si une âme charitable peut m'aider

    THX !

  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
    Billets dans le blog
    1
    Par défaut
    Salut,
    j'ai un doute sur la gestion de ton fichier, cette ligne peut renvoyer $null :
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    $Listing = get-content $ListingCSVALL  | where { -not ($_ -like "$CptName*")}
    Place des assertions dans ton code afin de vérifier si ton code fait ce qu'il est censé faire.

  3. #3
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2014
    Messages : 3
    Par défaut
    Salut Laurent,

    Merci pour ta réponse Par contre je ne comprends pas vraiment, que veux-tu dire par "placer des assertions" ? Le code fonctionne en soit c'est juste que parfois le fichier ($ListingCSVALL) est vidé de son contenu ??

    En faite dans mon cas je ne pense pas que cette ligne peut renvoyer $null car c'est un fichier de plusieurs centaines de lignes unique.
    Notre parc est composé de pas mal de PC et le principe de cette commande est de mettre à jour que la ligne correspondant au PC qui exécute le script (Contrôle via la variable $CptName).

    Si le fichier comporte une précédente entrée du PC (ligne) alors $Listing ne la prend pas pour ensuite ajouter une nouvelle ligne (en gros Suppression/création)...

  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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par 0boulot Voir le message
    que veux-tu dire par "placer des assertions" ?
    Valider ce que tu supposes.
    Un exemple :
    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
     
    function ConvertTo-PSD1Type {
    # Renvoi le PsdType d'un fichier PSD1 
     param (
       $InputObject
     )
      if ($null -eq $InputObject )
      { [PsdType]::Indeterminate }
      elseif ($InputObject.pstypenames[0] -eq 'Deserialized.System.Management.Automation.PSModuleInfo')
      { [PsdType]::Manifest }
      elseif ($InputObject -is [System.Collections.HashTable])
      { [PsdType]::LocalizedData }
      else
      { 
        Throw "ConvertTo-PSD1Type: bug assertion erronée - $($InputObject.GetType().FullName) $inputobject" 
      }  
    }#ConvertTo-PSD1Type
    Ici je suppose trois cas, un quatrième provoquera une erreur. Il y a donc une erreur d'analyse.

    Citation Envoyé par 0boulot Voir le message
    En faite dans mon cas je ne pense pas que cette ligne peut renvoyer $null car c'est un fichier de plusieurs centaines de lignes unique.
    Si le code n'est pas en cause, celle-ci est ailleurs
    Dans ce cas, je vois pas ce qu'on peut faire pour t'aider.

  5. #5
    Membre chevronné Avatar de pitchalov
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 340
    Par défaut
    Bonjour,

    J'ai déjà constaté ce phénomène sur d'autres langages de scripting (vbscript ou autoit par exemple) : ces langages ne proposaient pas de fonctionnalité de lock d'un fichier durant l'écriture, et 2 écritures concurrentes en mode append supprimaient le contenu du fichier.
    M'étant toujours cassé les dents à essayer de trouver une solution au problème, j'ai fini par chercher des moyens de le contourner.

    Je n'ai jamais regardé si en PowerShell cette fonctionnalité de lock de fichier existait, mais si c'est le cas, c'est vers cette solution qu'il faudrait se tourner.

    Sinon, voici 2 exemples de contournement que j'ai déjà mis en place :
    1. Utilisation d'un fichier de lock externe (pas fiable à 100%), mais mieux que sans rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Tant que le fichier de lock est présent
      Attendre
    Fin Tant que
    Création d'un fichier lock
    Ecriture dans le fichier en mode append
    Suppression du fichier de lock
    2. Supprimer l'accès concurrent à un fichier unique : créer un fichier unique par écriture, puis concaténer quotidiennement (ou manuellement au besoin) l'ensemble des fichiers uniques dans un fichier global.
    (Autre possibilité : écrire dans un fichier global quotidien, différent chaque jour --> Si des données sont perdues, il ne manquera que 24H max de données)

    Bonne continuation

  6. #6
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2014
    Messages : 3
    Par défaut
    Bonjour messieurs,

    Merci pour l'aide apportée ! Bon le script fonctionne correctement car j'ai placé un envoi de mail à chaque exécution avec les variables concernées histoire de voir si le CSV perd son contenu, sur quel PC, si 2 pc entre en conflit ... Mais rien, aucune perte pour le moment malgré des exécution simultanées à la seconde prêt donc je ne sais pas pourquoi il se vide de temps en temps ^^

    Pitchalov, Oui en effet je cherche également à locker le fichier mais des entrées risques de se perdre également car il y à environs 300 saisies par jour, principalement le matin (et oui login users )... pareil pour la création d'un fichier temporaire qui supprimerait en finalité l'original.

    La solution n°2 semble la plus appropriée car le script génère actuellement des fichiers nominatifs en plus du fichier global qui n'est qu'un récap dédiée à une analyse plus confortable...
    Je vais donc opter pour cette solution, cela donnerai :


    - Login User/exécution script via GPO
    - Mise à jour du fichier nominatif PC (100 entrées max).
    - Parcourt de tous les fichiers nominatifs afin d'enregistrer la dernière ligne de chacun dans un variable dédiée.
    - Enregistrement variable dans un fichier unique global (écrase l'original)...
    C'est dommage car les délais d'exécutions vont être plus important, c'est pas très optimisé ! Surtout que je fais la même chose en filtrant les adm anormaux, les login Users et les logins par PC...

    Merci messieurs ! je laisse tout de même le post ouvert 2/3 jours dès fois que

Discussions similaires

  1. [Batch] Problème: Remplacer un caractère d'un fichier .csv (Script batch)
    Par littlebear dans le forum Scripts/Batch
    Réponses: 7
    Dernier message: 04/06/2012, 16h57
  2. [XL-2003] Gestion fichier avec Scripting.FileSystemObject
    Par dev_php51 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/03/2011, 08h54
  3. Script avec gestion d'erreur pour loader des data depuis un csv
    Par olive_le_malin dans le forum Requêtes
    Réponses: 9
    Dernier message: 10/04/2009, 18h04
  4. [CSV] script de gestion de fichier csv
    Par jeff74 dans le forum Langage
    Réponses: 1
    Dernier message: 06/11/2008, 11h25
  5. Problème de gestion fichiers
    Par glutock dans le forum ASP
    Réponses: 2
    Dernier message: 08/04/2004, 11h55

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