UIDexportSQL.ps1 : Différence entre versions
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 : | ||
} | } | ||
} | } | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | ##### 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 }
}