Résolu Script de récupération d'information de poste puis export-csv des résultats

Plus d'informations
il y a 7 mois 1 semaine #33719 par kren
Bonjour à tous,

Je rencontre une difficulté au niveau de l'export-csv pour quelques variables seulement. Les variables seules fonctionnent bien.

Voici le script de base:

###############################################################################################
# Script Extraction information pc
# Version : 1.0
# Date : 05/12/2023
# Auteur : xxxxxx
###############################################################################################

# Récupération date
$DATE=Get-Date -Format "yyyyMMdd_HHmmss"

# Nom Machine
$Computer=[system.environment]::MachineName

# Récupération version OS
$OS=(Get-WmiObject -class Win32_OperatingSystem).Caption


# Vérification Pare-feu actif ou non
$Parefeu =Get-NetFirewallProfile | Select-Object Name,Enabled  


# Récupération des users PC profil admin
$UserAdmin=Get-LocalGroupMember -Group "Administrateurs" | Select -Property Name

# Info processeur
$ProcessInfo = Get-CimInstance CIM_Processor

# Info Bios
$BiosInfo = Get-WmiObject -Class Win32_BIOS | Select -Property SMBIOSBIOSVersion , Manufacturer , Name , SerialNumber

# Info disques
$computerHDD = Get-CimInstance Win32_LogicalDisk -Filter "DeviceID = 'C:'"
$computerHDDCapacity = ("{0:N2}" -f ($computerHDD.Size/1GB) + "GB")
$computerHDDSpace = ("{0:P2}" -f ($computerHDD.FreeSpace/$computerHDD.Size) + " Free (" + "{0:N2}" -f ($computerHDD.FreeSpace/1GB) + "GB)")

# Vérification des MAJ Windows Update
$Update=(New-Object -com "Microsoft.Update.AutoUpdate"). Results | Select-Object LastSearchSuccessDate,LastInstallationSuccessDate

# Récupération Ip et addresse Mac
$NetConf = Get-CimInstance -ClassName Win32_NetworkAdapterConfiguration | where { $_.IPAddress -ne $null } |
    select MacAddress,
    @{N="IPAddress";E={ $_.IPAddress | where { ([ipaddress]($_)).AddressFamily -eq 'InterNetwork'  }}},
    Description | Select-Object MacAddress, IPAddress, Description
    


    
# Information RAM
$computerSystem = Get-CimInstance CIM_ComputerSystem
$computerRAM = ("{0:N2}" -f ($computerSystem.TotalPhysicalMemory/1GB) + "GB")


# Create Object

$Computerobject = new-object psobject -Property  ([ordered]@{
'PC' = $Computer
'OS-Version' = $OS
'Windows-Update' = $Update
'Processeur' = $ProcessInfo.name
'Bios' = $BiosInfo
'User-Administrateur' = $UserAdmin
'RAM' = $ComputerRAM
'Disque C:(Capacite)' = $computerHDDCapacity
'Disque C: (Freespace)' = $computerHDDSpace
'NetConf' = $NetIP
'Parefeu' = $Parefeu
})

$Computerobject | export-csv .\file.csv -NoTypeInformation -append

Voici le résultat de sortie:

"PC","OS-Version","Windows-Update","Processeur","Bios","User-Administrateur","RAM","Disque C:(Capacite)","Disque C: (Freespace)","NetConf","Parefeu"
"MON-PC","Microsoft Windows 10 Professionnel","@{LastSearchSuccessDate=05/12/2023 10:06:31; LastInstallationSuccessDate=05/12/2023 10:06:22}","Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz","@{SMBIOSBIOSVersion=E1799IMS.31A; Manufacturer=American Megatrends Inc.; Name=E1799IMS.31A; SerialNumber=9S71799D31285ZHA000016}","System.Object[]","15,92GB","475,77GB","25,65 % Free (122,06GB)",,"System.Object[]"

Pour information il me manque les infos des variables : $UserAdmin   $NetIP et  $Parefeu, j'obtiens "System.Object[]" pour $UserAdmin et  $Parefeu et j'obtiens , , pour $NetIP

J'étais partis de mon script de base qui fait l'export vers un .html et qui fonctionne bien mais j'ai besoin du nouveau script avec sortie csv.


Voici le script de base (sortie html " pour ceux qui veulent:


###############################################################################################
# Script Extraction information pc
# Version : 1.0
# Date : 01/12/2023
# Auteur :
###############################################################################################


#CSS codes
$header = @"
<style>

    h1 {

        font-family: Arial, Helvetica, sans-serif;
        color: #e68a00;
        font-size: 28px;

    }

    
    h2 {

        font-family: Arial, Helvetica, sans-serif;
        color: #000099;
        font-size: 16px;

    }

    
    
   table {
        font-size: 12px;
        border: 0px;
        font-family: Arial, Helvetica, sans-serif;
    }
    
    td {
        padding: 4px;
        margin: 0px;
        border: 0;
    }
    
    th {
        background: #395870;
        background: linear-gradient(#49708f, #293f50);
        color: #fff;
        font-size: 11px;
        text-transform: uppercase;
        padding: 10px 15px;
        vertical-align: middle;
    }

    tbody tr:nth-child(even) {
        background: #f0f0f2;
    }
    


    #CreationDate {

        font-family: Arial, Helvetica, sans-serif;
        color: #ff3300;
        font-size: 12px;

    }



    .StopStatus {

        color: #ff0000;
    }
    
 
    .RunningStatus {

        color: #008000;
    }




</style>
"@
# Récupération date
$DATE=Get-Date -Format "yyyyMMdd_HHmmss"

# Récupération version OS
$OS=(Get-WmiObject -class Win32_OperatingSystem).Caption

# Nom Machine
$Computer=[system.environment]::MachineName

# Nom Machine pour rapport HTML
$ComputerName = "<h1>Nom Machine: $env:computername</h1>"

# Vérification Pare-feu actif ou non
$Parefeu=Get-NetFirewallProfile | ConvertTo-Html -As List -Property Name,Enabled -Fragment -PreContent "<h2>Etat du Pare-feu Windows:</h2>"

# Récupération des users PC profil admin
$UserAdmin=Get-LocalGroupMember -Group "Administrateurs" | ConvertTo-Html -As List -Property ObjectClass,Name,PrincipalSource -Fragment -PreContent "<h2>Utilisateurs avec profil administrateurs:</h2>"

#Dernier changement de mot de passe user:
#$mdpchange="net user %username%" | cmd

# Info système d'exploitation
$OSinfo = Get-CimInstance -Class Win32_OperatingSystem | ConvertTo-Html -As List -Property Version,Caption,BuildNumber,Manufacturer -Fragment -PreContent "<h2>Systeme d'exploitation:</h2>"

# Info processeur
$ProcessInfo = Get-CimInstance -ClassName Win32_Processor | ConvertTo-Html -As List -Property DeviceID,Name,Caption,MaxClockSpeed,SocketDesignation,Manufacturer -Fragment -PreContent "<h2>Information Processeur:</h2>"

# Info Bios
$BiosInfo = Get-CimInstance -ClassName Win32_BIOS | ConvertTo-Html -As List -Property SMBIOSBIOSVersion,Manufacturer,Name,SerialNumber -Fragment -PreContent "<h2>Information Bios:</h2>"

# Info disques
$DiscInfo = Get-CimInstance -ClassName Win32_LogicalDisk -Filter "DriveType=3" | ConvertTo-Html -As List -Property DeviceID,{$_.Size /1GB},{$_.FreeSpace /1GB} -Fragment -PreContent "<h2>Information Disque:</h2>"

# Vérification des MAJ Windows Update
$Update=(New-Object -com "Microsoft.Update.AutoUpdate"). Results | ConvertTo-Html -As List -Property LastSearchSuccessDate,LastInstallationSuccessDate -Fragment -PreContent "<h2>Windows Update - Dernieres informations:</h2>"

# Récupération Ip et addresse Mac
$NetConf = Get-CimInstance -ClassName Win32_NetworkAdapterConfiguration | where { $_.IPAddress -ne $null } |
    select MacAddress,
    @{N="IPAddress";E={ $_.IPAddress | where { ([ipaddress]($_)).AddressFamily -eq 'InterNetwork'  }}},
    Description | ConvertTo-Html -As Table -Property MacAddress, IPAddress, Description -Fragment -PreContent "<h2>IP Information:</h2>"
    
# Information RAM    
$Ram=Get-CimInstance -ClassName 'Cim_PhysicalMemory' | ConvertTo-Html -As Table -Property Manufacturer,{$_.Capacity /1GB},BankLabel -Fragment -PreContent "<h2>Information RAM:</h2>"

# Fusion des informations Hôte dans un seul rapport HTML
$Report = ConvertTo-HTML -Body "$ComputerName $OSinfo $NetConf $Parefeu $Update $UserAdmin $Ram $ProcessInfo $BiosInfo $DiscInfo" -Head $header -Title "Rapport Information PC" -PostContent "<p id='CreationDate'>Date de creation: $(Get-Date)</p>"

# Génération du rapport dans un fichier HTML
$Report | Out-File .\$Computer-$DATE.html








Merci d'avance pour votre aide.

Cordialement


 

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

Plus d'informations
il y a 7 mois 1 semaine #33721 par Fabien
Bonjour,

La variable $NetIP n'existe pas, il faut la remplacer par $NetConf
Ensuite pour les deux autres variables, il faut convertir l'objet en String comme ceci :
#Convertir l'objet en String et supprimer les espaces au début et à la fin
$($UserAdmin | Out-String).Trim()
$($Parefeu | Out-string).Trim()

Fabien
Les utilisateur(s) suivant ont remercié: kren

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

Plus d'informations
il y a 7 mois 1 semaine #33727 par kren
Bonjour Fabien, merci pour votre retour, j'arrive désormais à avoir le résultat qui s'affiche dans l'export.

Je ne sais pas si j'ai bien mis votre formule par contre car le résultat apparaît comme ceci:

"PC","OS-Version","Windows-Update","Processeur","Bios","RAM","Disque C:(Capacite)","Disque C: (Freespace)","User-Administrateur","NetConf","Parefeu"
"MON-PC","Microsoft Windows 10 Professionnel","@{LastSearchSuccessDate=05/12/2023 21:55:15; LastInstallationSuccessDate=05/12/2023 10:06:22}","Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz","@{SMBIOSBIOSVersion=E1799IMS.31A; Manufacturer=American Megatrends Inc.; Name=E1799IMS.31A; SerialNumber=9S71799D31285ZHA000016}","15,92GB","475,77GB","25,69 % Free (122,21GB)","Name
----
MON-PC\Administrateur
MON-PC\jk
MON-PC\nc
MON-PC\tet","MacAddress IPAddress Description


00:50:56:C0:00:01 192.168.150.1 VMware Virtual Ethernet Adapter for VMnet1
00:50:56:C0:00:08 192.168.220.1 VMware Virtual Ethernet Adapter for VMnet8
28:C6:3F:A8:9A:80 192.168.1.73 Intel(R) Dual Band Wireless-AC 3168
00:15:5D:98:02:3E 172.28.160.1 Hyper-V Virtual Ethernet Adapter
0A:00:27:00:00:04 169.254.94.97 VirtualBox Host-Only Ethernet Adapter
02:50:20:6B:1C:12 26.93.192.109 Famatech Radmin VPN Ethernet Adapter","Name Enabled
----
Domain True
Private True
Public True"


Voici la partie du script que j'ai modifié:

# Create Object

$Computerobject = new-object psobject -Property ([ordered]@{
'PC' = $Computer
'OS-Version' = $OS
'Windows-Update' = $Update
'Processeur' = $ProcessInfo.name
'Bios' = $BiosInfo
'RAM' = $ComputerRAM
'Disque C:(Capacite)' = $computerHDDCapacity
'Disque C: (Freespace)' = $computerHDDSpace
'User-Administrateur' = $($UserAdmin | Out-String).Trim()
'NetConf' = $($NetConf | Out-String).Trim()
'Parefeu' = $($Parefeu | Out-String).Trim()
})


Savez-vous comment avoir le résultat des 3 dernières valeurs sur la même ligne que les variables précédentes?

L'idée est d'avoir une seule ligne sous les entêtes dans le fichier csv.

Merci encore pour votre aide

Cordialement

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

Plus d'informations
il y a 7 mois 1 semaine #33730 par Fabien
Il faut changer $($NetConf | Out-String).Trim() par $NetConf
Si tu veux avoir tout le résultat sur une seule ligne, voici le changement à faire :
# Récupération date
$DATE=Get-Date -Format "yyyyMMdd_HHmmss"

# Nom Machine
$Computer=[system.environment]::MachineName

# Récupération version OS
$OS=(Get-WmiObject -class Win32_OperatingSystem).Caption


# Vérification Pare-feu actif ou non
$Parefeu = Get-NetFirewallProfile | select Name, Enabled

# Récupérer les informations spécifiques
$Firewall = "Domain={0}; Private={1}; Public={2}" -f ($Parefeu | ? {$_.Name -eq "Domain"}).Enabled, ($Parefeu | ? {$_.Name -eq "Private"}).Enabled, ($Parefeu | ? {$_.Name -eq "Public"}).Enabled



# Récupération des users PC profil admin
$UserAdmin = (Get-LocalGroupMember -Group "Administrateurs" | Select-Object -ExpandProperty Name) -join "; "

# Info processeur
$ProcessInfo = Get-CimInstance CIM_Processor

# Info Bios
$BiosInfo = Get-WmiObject -Class Win32_BIOS | Select -Property SMBIOSBIOSVersion , Manufacturer , Name , SerialNumber

# Info disques
$computerHDD = Get-CimInstance Win32_LogicalDisk -Filter "DeviceID = 'C:'"
$computerHDDCapacity = ("{0:N2}" -f ($computerHDD.Size/1GB) + "GB")
$computerHDDSpace = ("{0:P2}" -f ($computerHDD.FreeSpace/$computerHDD.Size) + " Free (" + "{0:N2}" -f ($computerHDD.FreeSpace/1GB) + "GB)")

# Vérification des MAJ Windows Update
$Update=(New-Object -com "Microsoft.Update.AutoUpdate"). Results | Select-Object LastSearchSuccessDate,LastInstallationSuccessDate

# Récupération Ip et addresse Mac
$NetConf = Get-CimInstance -ClassName Win32_NetworkAdapterConfiguration | where { $_.IPAddress -ne $null } |
    select MacAddress,
    @{N="IPAddress";E={ $_.IPAddress | where { ([ipaddress]($_)).AddressFamily -eq 'InterNetwork'  }}},
    Description | Select-Object MacAddress, IPAddress, Description
    


    
# Information RAM
$computerSystem = Get-CimInstance CIM_ComputerSystem
$computerRAM = ("{0:N2}" -f ($computerSystem.TotalPhysicalMemory/1GB) + "GB")


# Create Object

$Computerobject = new-object psobject -Property ([ordered]@{
'PC' = $Computer
'OS-Version' = $OS
'Windows-Update' = $Update
'Processeur' = $ProcessInfo.name
'Bios' = $BiosInfo
'RAM' = $ComputerRAM
'Disque C:(Capacite)' = $computerHDDCapacity
'Disque C: (Freespace)' = $computerHDDSpace
'User-Administrateur' = $UserAdmin 
'NetConf' = $NetConf
'Parefeu' = $Firewall
})

$Computerobject | export-csv .\file.csv -NoTypeInformation -append
Les utilisateur(s) suivant ont remercié: kren

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

Plus d'informations
il y a 7 mois 1 semaine #33734 par kren
Bonjour Fabien, merci pour ton retour. Pour la récupération des users profil admin et le parefeu c'est parfait j'ai exactement le retour attendu.

Il me reste un dernier point le $NetConf:

Voici le resultat de la variable $Netconf dans Powershell:
Résultat pour mon pc=

MacAddress IPAddress Description


00:50:56:C0:XX:XX 192.168.XX.1 VMware Virtual Ethernet Adapter for VMnet1
00:50:56:C0:XX:XX 192.168.XX.1 VMware Virtual Ethernet Adapter for VMnet8
28:C6:3F:A8:XX:XX 192.168.XX.33 Intel(R) Dual Band Wireless-AC 3168
00:15:5D:4B:XX:XX 172.20.XX.1 Hyper-V Virtual Ethernet Adapter
0A:00:27:00:XX:XX 169.254.XX.97 VirtualBox Host-Only Ethernet Adapter

C'est le seul point qui s'affiche en "System.Object[]" dans le fichier csv.

Comment l'afficher sur la même ligne. J'ai tenté la méthode appliquée pour le user admin mais sans résultat ?

Merci encore pour les résultats apportés.
:)

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

Plus d'informations
il y a 7 mois 1 semaine #33736 par Fabien
Bonjour,

J'ai fait le test sur ma machine et je n'ai qu'une seule interface ethernet avec une adresse IP.
Je ne comprenais pas trop ton résultat mais voilà comment le corriger. 
# Récupération Ip et addresse Mac
$NetConf = Get-CimInstance -ClassName Win32_NetworkAdapterConfiguration | where { $_.IPAddress -ne $null } |
    select MacAddress,
    @{N="IPAddress";E={ $_.IPAddress | where { ([ipaddress]($_)).AddressFamily -eq 'InterNetwork'  }}},
    Description

# Créer un tableau pour stocker chaque ligne formatée
$tableauLignes = @()

# Parcourir chaque élément dans $NetConf et formater la ligne
foreach ($element in $NetConf) {
    $ligne = "MacAddress={0},IPAddress={1},Description={2}" -f $element.MacAddress, $element.IPAddress, $element.Description
    $tableauLignes += $ligne
}

# Joindre les lignes avec un point-virgule
$NetResult = $tableauLignes -join ";"

C'est un peu le même principe que pour le Parefeu.
Il suffit de remplacer la variable $Netconf par $NetResult dans l'export en CSV.

Fabien
Les utilisateur(s) suivant ont remercié: kren

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

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