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
}
}