GrpPrdAPPexportSQL.ps1 : Différence entre versions

De Ensuelma
Aller à : navigation, rechercher
(Page créée avec « ''Ce script permet d'extraire les informations des groupes d'appartenance des utilisateurs reliés aux applications missions (maisons) de l'Active Directory de la RAMQ et... »)
 
 
Ligne 4 : Ligne 4 :
 
  #Concepteur: Frédéric Côté (fcote@outlook.fr)
 
  #Concepteur: Frédéric Côté (fcote@outlook.fr)
 
  #Réréfence: http://blog.briankmarsh.com/postgresql-powershell-part-1/
 
  #Réréfence: http://blog.briankmarsh.com/postgresql-powershell-part-1/
 
+
 
  #Variables
 
  #Variables
 
  #Dépot de l'exécution LOG
 
  #Dépot de l'exécution LOG
$log="C:\temp\GrpPrdAPPexport.log"
+
$log="C:\temp\GrpPrdAPPexport.log"
$temps=(date).DateTime
+
$temps=(date).DateTime
 
+
 
  #Fonction pour générer le log
 
  #Fonction pour générer le log
Function LogWrite
+
Function LogWrite
{
+
{
  Param ([string]$logstring)
+
    Param ([string]$logstring)
 
+
 
   Add-content $Log -value $logstring
 
   Add-content $Log -value $logstring
}
+
}
 
+
 
  # 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,
 
           [string]$dbServer = "localhost",  # Serveur BD (IP ou hostname)
 
           [string]$dbServer = "localhost",  # Serveur BD (IP ou hostname)
Ligne 27 : Ligne 27 :
 
           [string]$dbPass  = "invposte"    # Mot de Passe pour l'utilisateur de $dbUser
 
           [string]$dbPass  = "invposte"    # Mot de Passe pour l'utilisateur de $dbUser
 
         )
 
         )
 
+
 
     $conn = New-Object System.Data.Odbc.OdbcConnection
 
     $conn = New-Object System.Data.Odbc.OdbcConnection
 
     $conn.ConnectionString = "Driver={PostgreSQL Unicode(x64)};Server=$dbServer;Port=5432;Database=$dbName;Uid=$dbUser;Pwd=$dbPass;"
 
     $conn.ConnectionString = "Driver={PostgreSQL Unicode(x64)};Server=$dbServer;Port=5432;Database=$dbName;Uid=$dbUser;Pwd=$dbPass;"
Ligne 36 : Ligne 36 :
 
     $conn.close()
 
     $conn.close()
 
     $ds.Tables[0]
 
     $ds.Tables[0]
}
+
}
 
  # 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,
 
           [string]$dbServer = "localhost",  # Serveur BD (IP ou hostname)
 
           [string]$dbServer = "localhost",  # Serveur BD (IP ou hostname)
Ligne 46 : Ligne 46 :
 
           [string]$dbPass  = "invposte"    # Mot de Passe pour l'utilisateur de $dbUser
 
           [string]$dbPass  = "invposte"    # Mot de Passe pour l'utilisateur de $dbUser
 
         )
 
         )
 
+
 
     $conn = New-Object System.Data.Odbc.OdbcConnection
 
     $conn = New-Object System.Data.Odbc.OdbcConnection
 
     $conn.ConnectionString= "Driver={PostgreSQL Unicode(x64)};Server=$dbServer;Port=5432;Database=$dbName;Uid=$dbUser;Pwd=$dbPass;"
 
     $conn.ConnectionString= "Driver={PostgreSQL Unicode(x64)};Server=$dbServer;Port=5432;Database=$dbName;Uid=$dbUser;Pwd=$dbPass;"
Ligne 60 : Ligne 60 :
 
     }
 
     }
 
     $conn.close()
 
     $conn.close()
}
+
}
 
+
#------------------------------------------------------------------------------------------
+
  #------------------------------------------------------------------------------------------
##Création de la Table 'xxx'
+
  ##Création de la Table 'xxx'
$NomTable = 'GrpPrdAPP'
+
$NomTable = 'GrpPrdAPP'
$CreationTableADUID=@"
+
$CreationTableADUID=@"
CREATE TABLE "GrpPrdAPP" (
+
CREATE TABLE "GrpPrdAPP" (
    "GroupeAPP" TEXT,
+
    "GroupeAPP" TEXT,
    "Description" TEXT,
+
    "Description" TEXT,
    "UID" TEXT,
+
    "UID" TEXT,
    "Lieu" TEXT,
+
    "Lieu" TEXT,
    "Type" TEXT,
+
    "Type" TEXT,
    "PPP" TEXT
+
    "PPP" 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'"))   
{
+
{
 
     $CT = $True
 
     $CT = $True
 
     # Création de la nouvelle table
 
     # Création de la nouvelle table
Ligne 88 : Ligne 88 :
 
         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
 
  #----------Source des données-----------
 
  #----------Source des données-----------
$ADGroupesAPPsPROD=Get-ADGroup -SearchBase "OU=NDS,OU=Production,DC=ADPROD,DC=RAMQ,DC=GOV" -Filter * -Properties * #Get-ADGroup -Filter {name -like "GGAPI*"} -Properties *
+
$ADGroupesAPPsPROD=Get-ADGroup -SearchBase "OU=NDS,OU=Production,DC=ADPROD,DC=RAMQ,DC=GOV" -Filter * -Properties * #Get-ADGroup -Filter {name -like "GGAPI*"} -Properties *
$APPsPrd = ForEach($grpAPP in $ADGroupesAPPsPROD)
+
$APPsPrd = ForEach($grpAPP in $ADGroupesAPPsPROD)
{
+
{
 
     ForEach($ADMembre in $grpAPP.Members)
 
     ForEach($ADMembre in $grpAPP.Members)
 
     {
 
     {
Ligne 120 : Ligne 120 :
 
     Write-Output ([PSCustomObject]$jobData)
 
     Write-Output ([PSCustomObject]$jobData)
 
     }
 
     }
}
+
}
$APPsPrd = $APPsPrd | select GroupeAPP,Description,UID,Lieu,Type,PPP
+
$APPsPrd = $APPsPrd | select GroupeAPP,Description,UID,Lieu,Type,PPP
 
  #----------Traitement des données
 
  #----------Traitement des données
Foreach ($item in $APPsPrd)
+
Foreach ($item in $APPsPrd)
{
+
{
 
     $dbQuery = $Null
 
     $dbQuery = $Null
 
+
 
     # Vérification si la valeure n'existe pas déjà
 
     # Vérification si la valeure n'existe pas déjà
 
     $exists = Get-ODBCData -query "SELECT * from `"$NomTable`" WHERE `"GroupeAPP`" LIKE '$($item.GroupeAPP)' AND `"UID`" LIKE '$($item.UID)';"
 
     $exists = Get-ODBCData -query "SELECT * from `"$NomTable`" WHERE `"GroupeAPP`" LIKE '$($item.GroupeAPP)' AND `"UID`" LIKE '$($item.UID)';"
Ligne 145 : Ligne 145 :
 
             }
 
             }
 
         }
 
         }
 
+
 
         # Si les valeurs ne sont pas identiques, on doit mettre à jour
 
         # Si les valeurs ne sont pas identiques, on doit mettre à jour
 
         If (!$identical)
 
         If (!$identical)
 
         {
 
         {
 
             #Update ces valeurs
 
             #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 GroupeAPP: $($item.GroupeAPP) La différence est au niveau: $diffProps"
+
             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 GroupeAPP:  
 +
$($item.GroupeAPP) La différence est au niveau: $diffProps"
 
             $dbQuery = "UPDATE `"$NomTable`" SET "
 
             $dbQuery = "UPDATE `"$NomTable`" SET "
 
             Foreach ($diffProp in $diffProps)
 
             Foreach ($diffProp in $diffProps)
Ligne 171 : Ligne 172 :
 
             #$dbQuery = $dbQuery.Substring(0,$dbQuery.Length - 1) + " WHERE `"SamAccountName`" LIKE '$($item.SamAccountName)' AND `"Enabled`" LIKE '$($item.Enabled)';"
 
             #$dbQuery = $dbQuery.Substring(0,$dbQuery.Length - 1) + " WHERE `"SamAccountName`" LIKE '$($item.SamAccountName)' AND `"Enabled`" LIKE '$($item.Enabled)';"
 
             $dbQuery = $dbQuery + "`"Etat`" = 'MAJ' WHERE `"GroupeAPP`" LIKE '$($item.GroupeAPP)' AND `"Enabled`" LIKE '$($item.UID)';"
 
             $dbQuery = $dbQuery + "`"Etat`" = 'MAJ' WHERE `"GroupeAPP`" LIKE '$($item.GroupeAPP)' AND `"Enabled`" LIKE '$($item.UID)';"
 
+
 
         }
 
         }
 
     }
 
     }
Ligne 177 : Ligne 178 :
 
     Else
 
     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
 
         # 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 ('"
 
         $dbQuery = "INSERT INTO public.`"$NomTable`" (`"$($props -join '", "')`") VALUES ('"
 
+
 
         # Passe à travers chacune des propriétés et ajoute la valeur correspondante
 
         # Passe à travers chacune des propriétés et ajoute la valeur correspondante
 
         Foreach ($property in $props)
 
         Foreach ($property in $props)
Ligne 199 : Ligne 200 :
 
             #    Write-Host "ATTENTION PLUS D'UN VALEUR! $($item.$property), utilisation de la 1ère valeur"
 
             #    Write-Host "ATTENTION PLUS D'UN VALEUR! $($item.$property), utilisation de la 1ère valeur"
 
             #    $dbQuery += [string]$($item.$property | Select -First 1)+"', '"
 
             #    $dbQuery += [string]$($item.$property | Select -First 1)+"', '"
 
+
 
             #}
 
             #}
 
             Else
 
             Else
Ligne 206 : Ligne 207 :
 
             }
 
             }
 
         }
 
         }
 
+
 
+
 
+
 
         # Finalisation de la requête
 
         # Finalisation de la requête
 
         If($CT)
 
         If($CT)
Ligne 221 : Ligne 222 :
 
         }
 
         }
 
     }
 
     }
 
+
 
     #Exécution de la requête
 
     #Exécution de la requête
 
     If ($dbQuery)
 
     If ($dbQuery)
Ligne 227 : Ligne 228 :
 
         $output = Set-ODBCData -query $dbQuery
 
         $output = Set-ODBCData -query $dbQuery
 
     }
 
     }
}
+
}

Version actuelle datée du 20 décembre 2022 à 20:20

Ce script permet d'extraire les informations des groupes d'appartenance des utilisateurs reliés aux applications missions (maisons) de l'Active Directory de la RAMQ et de les injecter dans un tableau dans une BD. COPIER et COLLER ces informations dans un script nommé GrpPrdAPPexportSQL.ps1

#RAMQ REQUETE SQL (PostgreSQL) **** Déversement de l'AD Groupes Applicatif Mission (OU NDS sous production) ****
#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\GrpPrdAPPexport.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 = 'GrpPrdAPP'
$CreationTableADUID=@"
CREATE TABLE "GrpPrdAPP" (
    "GroupeAPP" TEXT,
    "Description" TEXT,
    "UID" TEXT,
    "Lieu" TEXT,
    "Type" TEXT,
    "PPP" 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-----------
$ADGroupesAPPsPROD=Get-ADGroup -SearchBase "OU=NDS,OU=Production,DC=ADPROD,DC=RAMQ,DC=GOV" -Filter * -Properties * #Get-ADGroup -Filter {name -like "GGAPI*"} -Properties *
$APPsPrd = ForEach($grpAPP in $ADGroupesAPPsPROD)
{
   ForEach($ADMembre in $grpAPP.Members)
   {
   $jobData = @{
       'GroupeAPP' = $grpAPP.Name
       'Description' = $grpAPP.Description
       'UID' = (Get-ADUser $ADMembre).SamAccountName
       'Lieu' = If($grpAPP.Name.Contains('_Q_')){
                   "Québec"
                   }
                   ElseIf($grpAPP.Name.Contains('_M_')){
                   "Montréal"
                   };
       'PPP' = $grpAPP.Name.Split('_')[2]
       'Type' = If($grpAPP.Name.Split('_').count -eq 4){$grpAPP.Name.Split('_')[3]}
       }
   Write-Output ([PSCustomObject]$jobData)
   }
}
$APPsPrd = $APPsPrd | select GroupeAPP,Description,UID,Lieu,Type,PPP
#----------Traitement des données
Foreach ($item in $APPsPrd)
{
   $dbQuery = $Null

   # Vérification si la valeure n'existe pas déjà
   $exists = Get-ODBCData -query "SELECT * from `"$NomTable`" WHERE `"GroupeAPP`" LIKE '$($item.GroupeAPP)' AND `"UID`" LIKE '$($item.UID)';"
   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 GroupeAPP: 
$($item.GroupeAPP) 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.GroupeAPP) 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 `"GroupeAPP`" LIKE '$($item.GroupeAPP)' AND `"Enabled`" LIKE '$($item.UID)';"

       }
   }
   # 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.GroupeAPP) 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
   }
}