SCCMexportSQL.ps1 : Différence entre versions

De Ensuelma
Aller à : navigation, rechercher
 
(Une révision intermédiaire par le même utilisateur non affichée)
Ligne 31 : Ligne 31 :
 
  #Les Fonctions SQL
 
  #Les Fonctions SQL
 
  # Requêtes pour PostgreSQL 'obtenir les infos'
 
  # Requêtes pour PostgreSQL 'obtenir les infos'
function Get-ODBCData{   
+
Function Get-ODBCData{   
 
     param(
 
     param(
 
           [string]$query,
 
           [string]$query,
Ligne 50 : Ligne 50 :
 
}
 
}
 
  # Requêtes pour PostgreSQL 'définir les infos'
 
  # Requêtes pour PostgreSQL 'définir les infos'
function Set-ODBCData{   
+
Function Set-ODBCData{   
 
     param(
 
     param(
 
           [string]$query,
 
           [string]$query,
Ligne 77 : Ligne 77 :
 
  #------------------------------------------------------------------------------------------
 
  #------------------------------------------------------------------------------------------
 
  ##Création de la Table 'xxx'
 
  ##Création de la Table 'xxx'
$NomTable = 'SCCM'
+
$NomTable = 'SCCM'
$CreationTableSCCM=@"
+
$CreationTableSCCM=@"
CREATE TABLE "SCCM" (
+
CREATE TABLE "SCCM" (
"Poste" TEXT,
+
    "Poste" TEXT,
"Utilisateur" TEXT,
+
    "Utilisateur" TEXT,
"Logiciel" TEXT,
+
    "Logiciel" TEXT,
"Version" TEXT,
+
    "Version" TEXT,
 
     "OS" TEXT,
 
     "OS" TEXT,
 
     "PosteID" TEXT,
 
     "PosteID" TEXT,
 
     "Etat" TEXT
 
     "Etat" TEXT
)
+
)
;
+
;
"@
+
"@
if (!(Get-ODBCData -query "SELECT relname FROM pg_class WHERE relname='$NomTable'"))   
+
if (!(Get-ODBCData -query "SELECT relname FROM pg_class WHERE relname='$NomTable'"))   
{
+
{
 
     # Création de la nouvelle table
 
     # Création de la nouvelle table
 
     try
 
     try
Ligne 101 : Ligne 101 :
 
         Write-Host -ForegroundColor Red "ERROR! $($_.Exception)"
 
         Write-Host -ForegroundColor Red "ERROR! $($_.Exception)"
 
     }
 
     }
}
+
}
 
  ##### ALIMENTATION DE LA BD #####
 
  ##### ALIMENTATION DE LA BD #####
  
 
  # Requête pour obtenir les colonnes de la table
 
  # Requête pour obtenir les colonnes de la table
$query  = "SELECT * FROM information_schema.columns WHERE table_schema = 'public' AND table_name = '$NomTable';"
+
$query  = "SELECT * FROM information_schema.columns WHERE table_schema = 'public' AND table_name = '$NomTable';"
$columns = Get-ODBCData -query $query
+
$columns = Get-ODBCData -query $query
 
  # Déversement des noms de colonnes dans un tableau
 
  # Déversement des noms de colonnes dans un tableau
$props  = $columns.column_name
+
$props  = $columns.column_name
  
 
  #CHECK ET ALIMENTE
 
  #CHECK ET ALIMENTE
Ligne 114 : Ligne 114 :
 
  #La Capture (importation des données Excel)
 
  #La Capture (importation des données Excel)
 
  #Emplacement du dépot de fichier
 
  #Emplacement du dépot de fichier
$Depot="\\adprod\donnees\DepoTransfert\FrédéricCôté" #"C:\Temp" #Cible: "\\adprod\donnees\DepoTransfert\FrédéricCôté"
+
$Depot="\\adprod\donnees\DepoTransfert\FrédéricCôté" #"C:\Temp" #Cible: "\\adprod\donnees\DepoTransfert\FrédéricCôté"
$W10=(Get-ChildItem "$Depot\ExportAppsW10*").FullName | sort LastWriteTime | select -last 1
+
$W10=(Get-ChildItem "$Depot\ExportAppsW10*").FullName | sort LastWriteTime | select -last 1
$W7=(Get-ChildItem "$Depot\ExportAppsW7*").FullName | sort LastWriteTime | select -last 1
+
$W7=(Get-ChildItem "$Depot\ExportAppsW7*").FullName | sort LastWriteTime | select -last 1
  
 
  #----------Traitement des données--------
 
  #----------Traitement des données--------
$LesW = (Import-Csv -Delimiter ',' -Path $W10 -Header a,b,c,d,e,f,g,Poste,i,Domaine,Utilisateur,OS,Logiciel,Version | select Poste,Utilisateur,Logiciel,Version,@{n='OS';e={Ostype ($_.OS)}},@{n='PosteID';e={[string]($_.Poste.Substring(1,6))}}) + (Import-Csv -Delimiter ',' -Path $W7 -Header a,b,c,d,e,f,g,Poste,i,Domaine,Utilisateur,OS,Logiciel,Version | select Poste,Utilisateur,Logiciel,Version,@{n='OS';e={Ostype ($_.OS)}},@{n='PosteID';e={[string]($_.Poste.Substring(1,6))}})
+
$LesW = (Import-Csv -Delimiter ',' -Path $W10 -Header a,b,c,d,e,f,g,Poste,i,Domaine,Utilisateur,OS,Logiciel,Version | select Poste,Utilisateur,Logiciel,Version,@{n='OS';e={Ostype ($_.OS)}},@{n='PosteID';e={[string]($_.Poste.Substring(1,6))}}) + (Import-Csv -Delimiter ',' -Path $W7 -Header a,b,c,d,e,f,g,Poste,i,Domaine,Utilisateur,OS,Logiciel,Version | select Poste,Utilisateur,Logiciel,Version,@{n='OS';e={Ostype ($_.OS)}},@{n='PosteID';e={[string]($_.Poste.Substring(1,6))}})
  
 
Foreach ($item in $LesW)
 
Foreach ($item in $LesW)

Version actuelle datée du 26 juin 2018 à 15:03

Le script ci-dessous permet d'injecter les données exportées par SCCM dans un fichier texte (.csv) de la RAMQ, dans une BD (PostgreSQL), une table est créée si elle n'existe pas. COPIER et COLLER ce script dans un fichier SCCMexportSQL.ps1

#RAMQ REQUETE SQL (PostgreSQL) **** Déversement de SCCM à partir d'un fichier ****
#Projet Windows 10
#Concepteur: Frédéric Côté (fcote@outlook.fr)
#Réréfence PostgreSQL: http://blog.briankmarsh.com/postgresql-powershell-part-1/
#Référence OLEDB MS Excel: https://blogs.technet.microsoft.com/pstips/2014/06/02/get-excel-data-without-excel/
#Variables
#Dépot de l'exécution LOG

$log="C:\temp\SCCMexport.log" $temps=(date).DateTime

#Fonction pour les OS

Function Ostype {

   Param ([string]$OS)
   Switch ($OS)
   {
      'Microsoft Windows NT Workstation 6.1' { 'W7' }
      'Microsoft Windows NT Workstation 10.0' { 'W10' }
      'Microsoft Windows NT Workstation 10.0 (Tablet Edition)' { 'W10' }
   }

}

#Fonction pour générer le log

Function LogWrite {

  Param ([string]$logstring)
  Add-content $Log -value $logstring

}

#Les Fonctions SQL
# Requêtes pour PostgreSQL 'obtenir les infos'

Function Get-ODBCData{

   param(
         [string]$query,
         [string]$dbServer = "localhost",   # Serveur BD (IP ou hostname)
         [string]$dbName   = "invposte",    # Nom de la BD
         [string]$dbUser   = "invposte",    # Utisateur défini dans la BD
         [string]$dbPass   = "invposte"     # Mot de Passe pour l'utilisateur de $dbUser
        )
   $conn = New-Object System.Data.Odbc.OdbcConnection
   $conn.ConnectionString = "Driver={PostgreSQL Unicode(x64)};Server=$dbServer;Port=5432;Database=$dbName;Uid=$dbUser;Pwd=$dbPass;"
   $conn.open()
   $cmd = New-object System.Data.Odbc.OdbcCommand($query,$conn)
   $ds = New-Object system.Data.DataSet
   (New-Object system.Data.odbc.odbcDataAdapter($cmd)).fill($ds) | out-null
   $conn.close()
   $ds.Tables[0]

}

# Requêtes pour PostgreSQL 'définir les infos'

Function Set-ODBCData{

   param(
         [string]$query,
         [string]$dbServer = "localhost",   # Serveur BD (IP ou hostname)
         [string]$dbName   = "invposte",    # Nom de la BD
         [string]$dbUser   = "invposte",    # Utisateur défini dans la BD
         [string]$dbPass   = "invposte"     # Mot de Passe pour l'utilisateur de $dbUser
        )
   $conn = New-Object System.Data.Odbc.OdbcConnection
   $conn.ConnectionString= "Driver={PostgreSQL Unicode(x64)};Server=$dbServer;Port=5432;Database=$dbName;Uid=$dbUser;Pwd=$dbPass;"
   $cmd = new-object System.Data.Odbc.OdbcCommand($query,$conn)
   $conn.open()
   Try
   {
       $cmd.ExecuteNonQuery()
   }
   Catch
   {
       Throw "REQUÊTE ERRONÉE: $query"
       Write-Host "REQUÊTE ERRONÉE: $query"
   }
   $conn.close()

}

#------------------------------------------------------------------------------------------
##Création de la Table 'xxx'
$NomTable = 'SCCM'
$CreationTableSCCM=@"
CREATE TABLE "SCCM" (
   "Poste" TEXT,
   "Utilisateur" TEXT,
   "Logiciel" TEXT,
   "Version" TEXT,
   "OS" TEXT,
   "PosteID" TEXT,
   "Etat" TEXT
)
;
"@
if (!(Get-ODBCData -query "SELECT relname FROM pg_class WHERE relname='$NomTable'"))  
{
   # Création de la nouvelle table
   try
   {
       $output = Set-ODBCData -query $CreationTableSCCM
   }
   catch
   {
       Write-Host -ForegroundColor Red "ERROR! $($_.Exception)"
   }
}
##### ALIMENTATION DE LA BD #####
# Requête pour obtenir les colonnes de la table
$query   = "SELECT * FROM information_schema.columns WHERE table_schema = 'public' AND table_name = '$NomTable';"
$columns = Get-ODBCData -query $query
# Déversement des noms de colonnes dans un tableau
$props   = $columns.column_name
#CHECK ET ALIMENTE
#----------Source des données-----------
#La Capture (importation des données Excel)
#Emplacement du dépot de fichier
$Depot="\\adprod\donnees\DepoTransfert\FrédéricCôté" #"C:\Temp" #Cible: "\\adprod\donnees\DepoTransfert\FrédéricCôté"
$W10=(Get-ChildItem "$Depot\ExportAppsW10*").FullName | sort LastWriteTime | select -last 1
$W7=(Get-ChildItem "$Depot\ExportAppsW7*").FullName | sort LastWriteTime | select -last 1
#----------Traitement des données--------
$LesW = (Import-Csv -Delimiter ',' -Path $W10 -Header a,b,c,d,e,f,g,Poste,i,Domaine,Utilisateur,OS,Logiciel,Version | select Poste,Utilisateur,Logiciel,Version,@{n='OS';e={Ostype ($_.OS)}},@{n='PosteID';e={[string]($_.Poste.Substring(1,6))}}) + (Import-Csv -Delimiter ',' -Path $W7 -Header a,b,c,d,e,f,g,Poste,i,Domaine,Utilisateur,OS,Logiciel,Version | select Poste,Utilisateur,Logiciel,Version,@{n='OS';e={Ostype ($_.OS)}},@{n='PosteID';e={[string]($_.Poste.Substring(1,6))}})

Foreach ($item in $LesW) {

   $dbQuery = $Null
   # Vérification si la valeure n'existe pas déjà
   $exists = Get-ODBCData -query "SELECT * from `"$NomTable`" WHERE `"Poste`" LIKE '$($item.Poste)' AND `"Logiciel`" LIKE '$($item.Logiciel)';"
   If ($exists)
   {
       # Si c'est identique
       $identical = $true
       $diffProps = @()
       
       # Va à l'intérieur de chaque valeur des propriétés et les compare
       Foreach ($prop in $($exists |gm -MemberType Properties |select -ExpandProperty Name))
       {
           # Si cet item et l'entrée existante ne sont pas identiques 
           If (($item.$prop | Select -First 1) -notlike $exists.$prop)
           {
               $identical = $false
               $diffProps += $prop
           }
       }
       # Si les valeurs ne sont pas identiques, on doit mettre à jour
       If (!$identical)
       {
           #Update ces valeurs
           Write-Host -ForegroundColor Magenta "[$temps] Cet item existe déjà, cependant les propriétés sont différentes. On doit mettre à jour ces valeurs pour la table $NomTable à la ligne contenant le Poste: $($item.Poste) La différence est au niveau: $diffProps"
           $dbQuery = "UPDATE `"$NomTable`" SET "
           Foreach ($diffProp in $diffProps)
           {
               If ($item.$diffProp -match "'")
               {
               Write-Host -ForegroundColor Green "[$temps] Ooops, on retrouve un `"'`" : $($item.$diffProp)"
               $dbQuery += "`"$diffProp`" = '"+$($item.$diffProp).Replace("'","°")+"',"
               }
               ElseIf ($item.$diffProp -like "")
               {
               Write-Host -ForegroundColor Green "[$temps] Ooops, on retrouve un champs vide du compte : $($item.Poste) sur la propriété: $diffProp)"
               $dbQuery += "`"$diffProp`" = NULL,"
               }
               Else
               {
               $dbQuery += "`"$diffProp`" = '$($item.$diffProp)',"
               }
           }
           #$dbQuery = $dbQuery.Substring(0,$dbQuery.Length - 1) + " WHERE `"Poste`" LIKE '$($item.Poste)' AND `"Logiciel`" LIKE '$($item.Logiciel)';"
           $dbQuery = $dbQuery + "`"Etat`" = 'MAJ' WHERE `"Poste`" LIKE '$($item.Poste)' AND `"Logiciel`" LIKE '$($item.Logiciel)';"
       }
   }
   # Si les valeurs n'existe pas dans la base de données, alors on l'ajoute...
   Else
   {
       # Préparation de la requête de démarrage pour insérer les valeurs dans la table avec les bonnes propriétés/colonnes
       $dbQuery = "INSERT INTO public.`"$NomTable`" (`"$($props -join '", "')`") VALUES ('"
       # Passe à travers chacune des propriétés et ajoute la valeur correspondante
       Foreach ($property in $props)
       {
           If ($item.$property -match "'")
           {
               Write-Host -ForegroundColor Green "[$temps] Ooops, on retrouve un `"'`" : $($item.$property)"
               $dbQuery += $($item.$property).Replace("'","°")+"', '"
           }
           ElseIf ($item.$property -like "")
           {
               Write-Host -ForegroundColor Green "[$temps] Ooops, on retrouve un champs vide du compte : $($item.Poste) sur la propriété: $property"
               $dbQuery = $dbQuery.Substring(0,$dbQuery.Length - 1)
               $dbQuery += "NULL, '"
           }
           Else
           {
               $dbQuery += [string]$($item.$property)+"', '"
           }
       }


       # Finalisation de la requête
       $dbQuery = $dbQuery.Substring(0,$dbQuery.Length - 3)
       $dbQuery = $dbQuery + ");"
   }
   #Exécution de la requête
   If ($dbQuery)
   {
       $output = Set-ODBCData -query $dbQuery
   }

}