UIDexportSQL.ps1 : Différence entre versions

De Ensuelma
Aller à : navigation, rechercher
Ligne 1 : Ligne 1 :
<nowiki>#RAMQ REQUETE SQL (PostgreSQL) **** Déversement de l'AD Utilisateurs ****
+
<nowiki>#RAMQ REQUETE SQL (PostgreSQL) **** Déversement de l'AD Utilisateurs ****</nowiki><br>
#Projet Windows 10
+
<nowiki>#Projet Windows 10</nowiki><br>
#Concepteur: Frédéric Côté (fcote@outlook.fr)
+
<nowiki>#Concepteur: Frédéric Côté (fcote@outlook.fr)</nowiki><br>
#Réréfence: http://blog.briankmarsh.com/postgresql-powershell-part-1/
+
<nowiki>#Réréfence: http://blog.briankmarsh.com/postgresql-powershell-part-1/</nowiki><br>
  
#Variables
+
<nowiki>#Variables</nowiki><br>
#Dépot de l'exécution LOG
+
<nowiki>#Dépot de l'exécution LOG</nowiki><br>
</nowiki>
 
 
$log="C:\temp\UIDexport.log"
 
$log="C:\temp\UIDexport.log"
 
$temps=(date).DateTime
 
$temps=(date).DateTime
  
#Fonction pour générer le log
+
<nowiki>#Fonction pour générer le log</nowiki><br>
 
Function LogWrite
 
Function LogWrite
 
{
 
{
Ligne 18 : Ligne 17 :
 
}
 
}
  
# Requêtes pour PostgreSQL 'obtenir les infos'
+
<nowiki># Requêtes pour PostgreSQL 'obtenir les infos'</nowiki><br>
 
function Get-ODBCData{   
 
function Get-ODBCData{   
 
     param(
 
     param(
Ligne 37 : Ligne 36 :
 
     $ds.Tables[0]
 
     $ds.Tables[0]
 
}
 
}
# Requêtes pour PostgreSQL 'définir les infos'
+
<nowiki># Requêtes pour PostgreSQL 'définir les infos'</nowiki><br>
 
function Set-ODBCData{   
 
function Set-ODBCData{   
 
     param(
 
     param(
Ligne 62 : Ligne 61 :
 
}
 
}
  
#------------------------------------------------------------------------------------------
+
<nowiki>#------------------------------------------------------------------------------------------</nowiki><br>
##Création de la Table 'xxx'
+
<nowiki>##Création de la Table 'xxx'</nowiki><br>
 
$NomTable = 'ADUID'
 
$NomTable = 'ADUID'
 
$CreationTableADUID=@"
 
$CreationTableADUID=@"
Ligne 97 : Ligne 96 :
 
     }
 
     }
 
}
 
}
#Mise à jour de la colonne État, afin que les éléments anciens ne soit plus considérés nouveaux
 
#If($CT)
 
#{
 
#    try
 
#    {
 
#        $output = Set-ODBCData -query "UPDATE public.`"ADUID`" SET `"Etat`" = REPLACE(`"Etat`", 'NEUF', NULL);"
 
#    }
 
#    catch
 
#    {
 
#        Write-Host -ForegroundColor Red "ERROR! $($_.Exception)"
 
#    }
 
#}
 
  
##### ALIMENTATION DE LA BD #####
+
<nowiki>##### ALIMENTATION DE LA BD #####</nowiki><br>
  
# Requête pour obtenir les colonnes de la table
+
<nowiki># Requête pour obtenir les colonnes de la table</nowiki><br>
 
$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
+
<nowiki># Déversement des noms de colonnes dans un tableau</nowiki><br>
 
$props  = $columns.column_name
 
$props  = $columns.column_name
  
#CHECK ET ALIMENTE
+
<nowiki>#CHECK ET ALIMENTE</nowiki><br>
#----------Source des données-----------
+
<nowiki>#----------Source des données-----------</nowiki><br>
 
$ADUtilisateurs=Get-ADUser -Filter {Enabled -Eq "True"} -Properties SamAccountName,DisplayName,EmailAddress,Department,Description,Enabled,HomeDirectory,ProfilePath,createTimeStamp,LastLogonDate,modifyTimeStamp,PasswordLastSet | Select SamAccountName,DisplayName,EmailAddress,Department,Description,Enabled,HomeDirectory,ProfilePath,createTimeStamp,LastLogonDate,modifyTimeStamp,PasswordLastSet,@{n='UtilisateurID';e={[string]($_.SamAccountName).Substring(1)}}
 
$ADUtilisateurs=Get-ADUser -Filter {Enabled -Eq "True"} -Properties SamAccountName,DisplayName,EmailAddress,Department,Description,Enabled,HomeDirectory,ProfilePath,createTimeStamp,LastLogonDate,modifyTimeStamp,PasswordLastSet | Select SamAccountName,DisplayName,EmailAddress,Department,Description,Enabled,HomeDirectory,ProfilePath,createTimeStamp,LastLogonDate,modifyTimeStamp,PasswordLastSet,@{n='UtilisateurID';e={[string]($_.SamAccountName).Substring(1)}}
 
     #Au besoin de filtrer que les UID (SamAccountName -like "U*") -And (
 
     #Au besoin de filtrer que les UID (SamAccountName -like "U*") -And (
  
#----------Traitement des données
+
<nowiki>#----------Traitement des données</nowiki><br>
 
Foreach ($item in $ADUtilisateurs)
 
Foreach ($item in $ADUtilisateurs)
 
{
 
{

Version du 26 juin 2018 à 14:18

#RAMQ REQUETE SQL (PostgreSQL) **** Déversement de l'AD Utilisateurs ****
#Projet Windows 10
#Concepteur: Frédéric Côté (fcote@outlook.fr)
#Réréfence: http://blog.briankmarsh.com/postgresql-powershell-part-1/

#Variables
#Dépot de l'exécution LOG
$log="C:\temp\UIDexport.log" $temps=(date).DateTime

#Fonction pour générer le log
Function LogWrite {

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

}

# 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"
   }
   $conn.close()

}

#------------------------------------------------------------------------------------------
##Création de la Table 'xxx'
$NomTable = 'ADUID' $CreationTableADUID=@" CREATE TABLE "ADUID" (

   "SamAccountName" TEXT,
   "DisplayName" TEXT,
   "EmailAddress" TEXT,
   "Department" TEXT,
   "Description" TEXT,
   "Enabled" TEXT,
   "HomeDirectory" TEXT,
   "ProfilePath" TEXT,
   "createTimeStamp" TIMESTAMP,
   "LastLogonDate" TIMESTAMP,
   "modifyTimeStamp" TIMESTAMP,
   "PasswordLastSet" TIMESTAMP,
   "UtilisateurID" TEXT,
   "Etat" TEXT

)

"@ if (!(Get-ODBCData -query "SELECT relname FROM pg_class WHERE relname='$NomTable'")) {

   $CT = $True
   # Création de la nouvelle table
   try
   {
       $output = Set-ODBCData -query $CreationTableADUID
   }
   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-----------
$ADUtilisateurs=Get-ADUser -Filter {Enabled -Eq "True"} -Properties SamAccountName,DisplayName,EmailAddress,Department,Description,Enabled,HomeDirectory,ProfilePath,createTimeStamp,LastLogonDate,modifyTimeStamp,PasswordLastSet | Select SamAccountName,DisplayName,EmailAddress,Department,Description,Enabled,HomeDirectory,ProfilePath,createTimeStamp,LastLogonDate,modifyTimeStamp,PasswordLastSet,@{n='UtilisateurID';e={[string]($_.SamAccountName).Substring(1)}}

   #Au besoin de filtrer que les UID (SamAccountName -like "U*") -And (

#----------Traitement des données
Foreach ($item in $ADUtilisateurs) {

   $dbQuery = $Null
   # Vérification si la valeure n'existe pas déjà
   $exists = Get-ODBCData -query "SELECT * from `"$NomTable`" WHERE `"SamAccountName`" LIKE '$($item.SamAccountName)' AND `"Enabled`" LIKE '$($item.Enabled)';"
   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 UID: $($item.SamAccountName) 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.SamAccountName) sur la propriété: $diffProp)"
               $dbQuery += "`"$diffProp`" = NULL,"
               }
               Else
               {
               $dbQuery += "`"$diffProp`" = '$($item.$diffProp)',"
               }
           }
           #$dbQuery = $dbQuery.Substring(0,$dbQuery.Length - 1) + " WHERE `"SamAccountName`" LIKE '$($item.SamAccountName)' AND `"Enabled`" LIKE '$($item.Enabled)';"
           $dbQuery = $dbQuery + "`"Etat`" = 'MAJ' WHERE `"SamAccountName`" LIKE '$($item.SamAccountName)' AND `"Enabled`" LIKE '$($item.Enabled)';"
       }
   }
   # 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 "") -And ($property -notlike "Etat"))
           {
               Write-Host -ForegroundColor Green "[$temps] Ooops, on retrouve un champs vide du compte : $($item.SamAccountName) sur la propriété: $property"
               $dbQuery = $dbQuery.Substring(0,$dbQuery.Length - 1)
               $dbQuery += "NULL, '"
           }
           #If ($($item.$property).count -gt 1)
           #{
           #    Write-Host "ATTENTION PLUS D'UN VALEUR! $($item.$property), utilisation de la 1ère valeur"
           #    $dbQuery += [string]$($item.$property | Select -First 1)+"', '"
           #}
           Else
           {
               $dbQuery += [string]$($item.$property)+"', '"
           }
       }


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

}