Question Optimisation et gestion des erreurs.

Plus d'informations
il y a 13 ans 2 jours #14396 par Dwelatha
Bonjour à tous,

Je me suis mis à Powershell depuis une bonne semaine et je sollicite votre aide concernant un souci que je rencontre sur le bout de code suivant.

Le script en question, doit aller chercher un certain nombre d'information concernant l'antivirus et l'OS sur des postes de travail, serveurs.

Le code:
[code:1]Function GetRegInfo
{
# HKLM\SOFTWARE\McAfee\DesktopProtection
$key=\"SOFTWARE\McAfee\DesktopProtection\"
$regkey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, $strComputer)
$regKey = $regKey.OpenSubKey($key)

$Product = $regKey.GetValue(\"Product\"«»)
$c.Cells.Item($intRow,7) = $Product

$productver = $regKey.GetValue(\"szProductVer\"«»)

if ($productver -ge \"8.8.0.975\"«»){
$c.Cells.Item($intRow,8) = $productver
$c.Cells.Item($intRow,8).Interior.ColorIndex = 4
} Elseif ($productver -eq \"8.8.0.849\"«») {
$c.Cells.Item($intRow,8) = $productver
$c.Cells.Item($intRow,8).Interior.ColorIndex = 44
} Else {
$c.Cells.Item($intRow,8) = $productver
$c.Cells.Item($intRow,8).Interior.ColorIndex = 3
}

$key1=\"SOFTWARE\McAfee\Vscore\On Access Scanner\McShield\"
$regkey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, $strComputer)
$regKey = $regKey.OpenSubKey($key1)

$key2=\"SOFTWARE\McAfee\AVEngine\"
$regkey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, $strComputer)
$regKey = $regKey.OpenSubKey($key2)

# HKLM\Software\McAfee\Vscore\On Acess Scanner\McShield (Pour les versions antérieures à VSE 8.8)
$ScanEngine = $regKey.GetValue(\"EngineVersionMajor\"«»)
$c.Cells.Item($intRow,9) = $ScanEngine

# HKLM\Software\McAfee\AVEngine (pour les versions VSE 8.8)
$ScanEngine = $regKey.GetValue(\"EngineVersionMajor\"«»)
$c.Cells.Item($intRow,9) = $ScanEngine

# HKLM\Software\McAfee\Vscore\On Acess Scanner\McShield (pour les versions antérieures à VSE 8.8)
$VirDefVer = $regKey.GetValue(\"AVDatVersion\"«»)
$c.Cells.Item($intRow,10) = $VirDefVer

# HKLM\Software\McAfee\AVEngine (pour les versions VSE 8.8)
$VirDefVer = $regKey.GetValue(\"AVDatVersion\"«»)
$c.Cells.Item($intRow,10) = $VirDefVer

$key2=\"SOFTWARE\Network Associates\ePolicy Orchestrator\Agent\"
$regkey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, $strComputer)
$regKey = $regKey.OpenSubKey($key2)

# HKLM\Software\Network Associates\ePolicy Orchestrator\Agent / # Split du fqdn server
$ServerList = $regKey.GetValue(\"ePOServerList\"«») -split{$_ -eq \".\" -or $_ -eq \"|\"}
$c.Cells.Item($intRow,11) = $ServerList

# HKLM\Software\Network Associates\ePolicy Orchestrator\Agent
$AgentGUID = $regKey.GetValue(\"AgentGUID\"«»)
$c.Cells.Item($intRow,12) = $AgentGUID

$key3=\"SOFTWARE\Network Associates\ePolicy Orchestrator\Application Plugins\CMNUPD__3000\"
$regkey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, $strComputer)
$regKey = $regKey.OpenSubKey($key3)

# HKLM\SOFTWARE\Network Associates\ePolicy Orchestrator\Application Plugins\CMNUPD__3000
$AgentVersion = $regKey.GetValue(\"Version\"«»)

if ($AgentVersion -ge \"4.6.0.3122\"«»){
$c.Cells.Item($intRow,13) = $AgentVersion
$c.Cells.Item($intRow,13).Interior.ColorIndex = 4
}Elseif ($AgentVersion -eq \"4.6.0.2935\"«»){
$c.Cells.Item($intRow,13) = $AgentVersion
$c.Cells.Item($intRow,13).Interior.ColorIndex = 44
} Else {
$c.Cells.Item($intRow,13) = $AgentVersion
$c.Cells.Item($intRow,13).Interior.ColorIndex = 3
}
}

#$erroractionpreference = \"SilentlyContinue\"

# Création de l'objet excel
$a = New-Object -comobject Excel.Application
$a.visible = $True
$b = $a.Workbooks.Add()
$c = $b.Worksheets.Item(1)

# Création des cellules contenant les titres
$c.Cells.Item(1,1) = \"Nom de machine\"
$c.Cells.Item(1,2) = \"Systeme d'exploitation\"
$c.Cells.Item(1,3) = \"Service Pack\"
$c.Cells.Item(1,4) = \"Domaine\"
$c.Cells.Item(1,5) = \"Architecture\"
$c.Cells.Item(1,6) = \"Utilisateur connecté\"
$c.Cells.Item(1,7) = \"Produit Antivirus\"
$c.Cells.Item(1,8) = \"Version Antivirus\"
$c.Cells.Item(1,9) = \"Version du moteur d'analyse\"
$c.Cells.Item(1,10) = \"Version du fichier DAT\"
$c.Cells.Item(1,11) = \"Serveur EPO\"
$c.Cells.Item(1,12) = \"AgentGUID\"
$c.Cells.Item(1,13) = \"Version de l'Agent\"
$c.Cells.Item(1,14) = \"Statut Ping\"
$c.Cells.Item(1,15) = \"Uptime\"
$c.Cells.Item(1,16) = \"Adresse IP\"
$c.Cells.Item(1,17) = \"Date du report\"

$d = $c.UsedRange
$d.Interior.ColorIndex = 19
$d.Font.ColorIndex = 11
$d.Font.Bold = $True

$intRow = 2

# Lecture du fichier d'entrée
$colComputers = get-content c:\temp\test.txt

foreach ($strComputer in $colComputers)
{
# Test ping
$Ping = new-object System.Net.NetworkInformation.Ping
$Reply = $ping.send($strComputer,10)
if ($Reply.status –eq “Success”) {
$c.Cells.Item($intRow, 14) = “En ligne”
$c.Cells.Item($intRow, 14).Interior.ColorIndex = 4
} Else {
$c.Cells.Item($intRow, 14) = \"Hors ligne\"
$c.Cells.Item($intRow, 14).Interior.ColorIndex = 3
}
$Reply = \"\"

$OS = get-wmiobject Win32_OperatingSystem -computername $strComputer
$Computer = get-wmiobject Win32_computerSystem -computername $strComputer
$IP = get-wmiobject Win32_NetworkAdapterConfiguration -computername $strComputer | Where{$_.IPEnabled –eq $true}

$c.Cells.Item($intRow,1) = $strComputer.ToUpper()
$c.Cells.Item($intRow,2) = $OS.Caption
$c.Cells.Item($intRow,3) = $OS.CSDVersion
$c.Cells.Item($intRow,4) = $Computer.Domain
$c.Cells.Item($intRow,5) = $Computer.SystemType
$c.Cells.Item($intRow,6) = $Computer.Username
$c.Cells.Item($intRow,15) = [System.Management.ManagementDateTimeconverter]::ToDateTime($OS.LastBootUpTime)

GetRegInfo

# Récupération de(s) IP active(s) sur les postes.
Foreach ($IPConfig in $IP)
{
if ($Ipconfig.IPaddress) {
Foreach ($addr in $Ipconfig.Ipaddress | where {$_ -notmatch \":\"})
{
$c.Cells.Item($intRow,16) = $addr
}
}

$c.Cells.Item($intRow,17) = Get-date
$intRow = $intRow + 1
}
}

# On redimensionne les colonnes du fichier excel.
$d.EntireColumn.AutoFit()

# On enregistre le fichier dans la directory ci-dessous.
$b.SaveAs(\"C:\temp\Versioning McAfee $(get-date -f dd-MM-yyyy-H-m).xls\"«»)
$b.close()
$a.Quit()
$a = $null
$b = $null
$c = $null
cls[/code:1]

A l'heure actuelle il fonctionne mais je le trouve super long, surtout quand je dois vérifier plus de 600 machines par exemple. Il met beaucoup de temps.

Ce que j'aimerai faire, c'est Ping de la machine, si elle ne réponds pas, on passe à la suivante tout en consignant la machine \"off line\" dans mon fichier excel.

J'ai essayé avec un:
[code:1]If (-not (test-connection -computername $strComputer -Count 1 -Quiet)) {
$c.Cells.Item($intRow, 14) = \"Hors ligne\"
$c.Cells.Item($intRow, 14).Interior.ColorIndex = 3
Continue
} Else {
$c.Cells.Item($intRow, 14) = “En ligne”
$c.Cells.Item($intRow, 14).Interior.ColorIndex = 4
}[/code:1]

à la place de
[code:1]$Ping = new-object System.Net.NetworkInformation.Ping
$Reply = $ping.send($strComputer,10)
if ($Reply.status –eq “Success”) {
$c.Cells.Item($intRow, 14) = “En ligne”
$c.Cells.Item($intRow, 14).Interior.ColorIndex = 4
} Else {
$c.Cells.Item($intRow, 14) = \"Hors ligne\"
$c.Cells.Item($intRow, 14).Interior.ColorIndex = 3
}
$Reply = \"\"[/code:1]

Mais le soucis, c'est qu'il ne me garde pas les machines offline dans le fichier excel. De plus je crois qu'il fait les requêtes WMI, vérifie les clés de registre quand même :dry:

Le second point concernant l'optimisation de la fonction GetRegInfo. Je ne rencontre aucun problème sur des postes en 32 bits mais par contre les machines en 64 bits ne me retourne aucune info.
Normal me direz vous car les clés ne se trouve pas au même endroit.

Clé en 32 bits
[code:1]$key=\"SOFTWARE\McAfee\DesktopProtection\"[/code:1]

Clé en 64 bits
[code:1]$key=\"SOFTWARE\wow6432node\McAfee\DesktopProtection\"[/code:1]

Selon vous, qu'elle serait la façon la plus optimisée pour récupérer ces informations ?

Vous remerciant par avance pour le temps que vous me consacrerez.

Bonne soirée.


Message édité par: Dwelatha, à: 21/03/13 16:45

Message édité par: Dwelatha, à: 21/03/13 16:47<br><br>Message édité par: Dwelatha, à: 21/03/13 18:28
Pièces jointes :

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 13 ans 2 jours #14398 par Laurent Dardenne
Salut,
pour ton pb de performance utilise des jobs, mais si c'est la solution que tu retiens ta fonction GetRegInfo ne devrait renvoyer que des objets, car telle qu'elle est tu ne peux pas l'insérer dans un job.
Si tu émets des objets, tu peux les convertir en CSV puis les sauvegarder sur disque. Ensuite cela peux faciliter l'insertion dans Excel et en cas de crash d'Excel tu auras un point de reprise.

Et une fois que cette mécanique sera conçue tu pourras la réutiliser sans trop d'efforts. Tu me diras, l'usage du futur permet pas mal de choses ;)

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 13 ans 2 jours #14399 par JONDON Cyril
Une remarque comme ça en passant si tu veux récupérer des informations d'une appli 32 bits sur des postes 32bits et 64 bits et que tu ne veux pas gérer
cette fameuse clé HKLM\Software\Wow6432Node sur les postes 64 Bits

Utilise une console Powershell 32 Bits (même si la clé Wow6432Node existe c'est la même que HKLM\Software

Console Powershell (x86)
[code:1]PS HKLM:\software&gt; (gi *).count
85

PS HKLM:\software&gt; cd wow6432node

PS HKLM:\software\wow6432node&gt; (gi *).Count
85[/code:1]

Console Powershell (x64)
[code:1]PS HKLM:\software&gt; (gi *).Count
35

PS HKLM:\software&gt; cd wow6432node

PS HKLM:\software\wow6432node&gt; (gi *).Count
85

PS HKLM:\software\wow6432node&gt; [/code:1]

D'ailleurs c'est une particularité powershell car avec un regedit 32 Bits la clé Wow6432Node bien entendu n'est pas connu.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 13 ans 2 jours #14402 par Dwelatha
Bonsoir,

Merci pour vos réponses.

Concernant ton idée Laurent, tu parles bien des jobs asynchrones lancés depuis mon poste ?

Étant néophyte en terme de dev, je sens que mes neurones vont fumer.

Je vais jeter un coup d’œil à tout ça ! merci encore.

Merci pour l'astuce cxvd7391, mais si je comprend bien, il suffirait donc de lancer powershell (ISE ou ligne de commande) depuis un poste 32bits afin de pouvoir récupérer le contenu des clés qui m'intéresse, c'est bien ça ?

Edit: Navré pour le post en doublon :pinch:<br><br>Message édité par: Dwelatha, à: 21/03/13 19:14

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 13 ans 2 jours #14403 par JONDON Cyril
A partir d'un poste 32 bits ou 64 Bits l'essentiel je pensais était de lancer à partir d'une console 32 bits local mais je viens de faire le test sur mon poste à partir d'une console 32Bits et malheureusement à distance c'est un shell 64bits.

Peut être y a t'il une solution pour forcer un shell 32 bits à distance j'ai mis un post la dessus.

Test effectué : à partir d'une Console 32Bits d'un poste 64 Bits vers un poste 64 Bits

[code:1]PS Variable:\&gt; $env:«»ProgramFiles
C:\Program Files (x86)

PS Variable:\&gt; Invoke-command {$env:«»ProgramFiles} -computername TEST-PC -Credential Adservices\Administrateur
C:\Program Files[/code:1]

Si tes commandes à distance ( via invoke-command) s'appyaient sur un shell distant 32 Bits je suis sur que tu n'aurais pas besoin de te soucier de cette clé de registre

Mais voila à distance sur des postes 64 bits ce sera un shell 64 bits pas du 32 bits à moins que ....

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 13 ans 1 jour #14404 par Laurent Dardenne
Dwelatha écrit:

Concernant ton idée Laurent, tu parles bien des jobs asynchrones lancés depuis mon poste ?

Oui.
Dwelatha écrit:

Étant néophyte en terme de dev, je sens que mes neurones vont fumer.

C'est sûr que pour débuter ce n'est pas le mieux, mais au vu du code que tu produis en une semaine je me suis dit que cela semblait à ta portée.

De gérer un parc de 600 machines, c'est à tout à fait dans l'objectif de la création de PS. C'est sûr que cela ne va pas faire tout seul et qu'il te faudra du temps pour le coder , le plus important est de comprendre le mécanisme.

Surtout que dans ton cas ton traitement de base existe et il ne fais que de la collecte de données.
Si tu testes sur 3 machines avec succès, tu peux en mettre 600 en face !

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.060 secondes
Propulsé par Kunena