UIDexportSQL.ps1 : Différence entre versions
(3 révisions intermédiaires par le même utilisateur non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
− | < | + | ''Ce script permet d'extraire les informations 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é UIDexportSQL.ps1''<br> |
− | #Projet Windows 10 | + | #RAMQ REQUETE SQL (PostgreSQL) **** Déversement de l'AD Utilisateurs **** |
− | #Concepteur: Frédéric Côté (fcote@outlook.fr) | + | #Projet Windows 10 |
− | #Réréfence: http://blog.briankmarsh.com/postgresql-powershell-part-1/ | + | #Concepteur: Frédéric Côté (fcote@outlook.fr) |
+ | #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\UIDexport.log" | $log="C:\temp\UIDexport.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 | ||
{ | { | ||
Ligne 18 : | Ligne 18 : | ||
} | } | ||
− | # Requêtes pour PostgreSQL 'obtenir les infos' | + | # Requêtes pour PostgreSQL 'obtenir les infos' |
function Get-ODBCData{ | function Get-ODBCData{ | ||
param( | param( | ||
Ligne 37 : | Ligne 37 : | ||
$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( | ||
Ligne 62 : | Ligne 62 : | ||
} | } | ||
− | #------------------------------------------------------------------------------------------ | + | #------------------------------------------------------------------------------------------ |
− | ##Création de la Table 'xxx' | + | ##Création de la Table 'xxx' |
$NomTable = 'ADUID' | $NomTable = 'ADUID' | ||
$CreationTableADUID=@" | $CreationTableADUID=@" | ||
Ligne 97 : | Ligne 97 : | ||
} | } | ||
} | } | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | ##### 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----------- |
$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 | + | #----------Traitement des données |
Foreach ($item in $ADUtilisateurs) | Foreach ($item in $ADUtilisateurs) | ||
{ | { |
Version actuelle datée du 26 juin 2018 à 14:55
Ce script permet d'extraire les informations 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é 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)" }
}
##### 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 }
}