UIDexportSQL.ps1
#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)" }
}
- 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 #####
- 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 }
}