<#
.NOTES
===========================================================================
Created on: 29/11/2016 13:45
Created by: David MASSON
Organization: Direction du Numérique - Université de Haute Alsace
Filename: UserDataManagement.ps1
===========================================================================
.DESCRIPTION
A description of the file.
#>
# Effacement de la console
clear
# Import des modules nécessaires
Import-Module ActiveDirectory
Import-Module DFSN
# Fonction de gestion des logs
Function AddLog
{
param([string]$User,[string]$LogName,[string]$Source,[string]$EntryType,[string]$EventId,[string]$Category,[string]$Message,[string]$Name,[string]$Path,[string]$FileSystemRights,[string]$AccessControlType,[string]$InheritanceFlags,[string]$PropagationFlags,[string]$Target,[string]$Description,[string]$WrongTarget)
$Column = New-Object psobject
$Column | Add-Member -Name User -MemberType NoteProperty -Value $User
$Column | Add-Member -Name LogName -MemberType NoteProperty -Value $LogName
$Column | Add-Member -Name Source -MemberType NoteProperty -Value $Source
$Column | Add-Member -Name EntryType -MemberType NoteProperty -Value $EntryType
$Column | Add-Member -Name EventId -MemberType NoteProperty -Value $EventId
$Column | Add-Member -Name Category -MemberType NoteProperty -Value $Category
$Column | Add-Member -Name Message -MemberType NoteProperty -Value $Message
$Column | Add-Member -Name Name -MemberType NoteProperty -Value $Name
$Column | Add-Member -Name Path -MemberType NoteProperty -Value $Path
$Column | Add-Member -Name FileSystemRights -MemberType NoteProperty -Value $FileSystemRights
$Column | Add-Member -Name AccessControlType -MemberType NoteProperty -Value $AccessControlType
$Column | Add-Member -Name InheritanceFlags -MemberType NoteProperty -Value $InheritanceFlags
$Column | Add-Member -Name PropagationFlags -MemberType NoteProperty -Value $PropagationFlags
$Column | Add-Member -Name Target -MemberType NoteProperty -Value $Target
$Column | Add-Member -Name Description -MemberType NoteProperty -Value $Description
$Column | Add-Member -Name Directory -MemberType NoteProperty -Value $WrongTarget
return $Column
}
# Variable globale de gestion des logs
$Global:LogTab = @()
# Import de la structure de référence
[xml]$XmlDocument = Get-Content -Path C:\DNUM\Scripts\DataStructure.xml
# Environnement
$Domain = "labo.local"
$Fileserver1 = "data1"
# Unité d'organistion concernées
$DN_DNUM = "OU=AER,OU=DNUM,DC=labo,DC=local"
$DN_SC = "OU=Services_Centraux,DC=labo,DC=local"
$BaseDN = @($DN_DNUM,$DN_SC)
Try
{
# Démarrage
$DNumEventLog = "User Data Management"
Write-EventLog -LogName Application -Source $DNumEventLog -EntryType Information -EventId 0 -Category 0 -Message "UserDataManagement : Démarrage du traitement de la gestion des répertoires personnels"
if (Test-Path "C:\DNUM\Logs\*")
{
Remove-Item "C:\DNUM\Logs\*"
}
Else
{
}
# Constitution d'une liste d'utilisateurs
Foreach ($DN in $BaseDN)
{
$UserList = Get-ADUser -Filter * -SearchBase $DN
# Traitement par utilisateur
foreach ($User in $UserList)
{
# Effacement des données du tableau de gestion des logs
$Global:LogTab.Clear()
# Définition des propriétés utilisateur
$Mail = $User.UserPrincipalName
$SamAccountName = $User.SamAccountName
Write-Host "Execution pour"$Mail
# Gestion de l'arborescence
foreach ($Item in $XmlDocument.DataStructureConfiguration.PhysicalFolderDefinition.FolderDef)
{
# Déclaration des variables
$Name = $ExecutionContext.InvokeCommand.ExpandString($Item.Name)
$Path = $ExecutionContext.InvokeCommand.ExpandString($Item.Path)
# Audit de l'arborescence
If (Test-Path $Path)
{
$Message = "[INFORMATION] Répertoire présent : " + $Path
$LogTab+=AddLog -User $SamAccountName -LogName "Application" -Source $DNumEventLog -EntryType "Information" -EventId "0" -Category "0" -Message $Message -Name $Name -Path $Path
}
Else
{
$Message = "[WARNING] Répertoire absent : " + $Path + ". Le nouveau répertoire va être créé"
$LogTab+=AddLog -User $SamAccountName -LogName "Application" -Source $DNumEventLog -EntryType "Warning" -EventId "1" -Category "0" -Message $Message -Name $Name -Path $Path
# Création d'un répertoire
New-Item -ItemType Directory -Path $Path
$Message = "[INFORMATION] Nouveau répertoire crée :" + $Path
$LogTab+=AddLog -User $SamAccountName -LogName "Application" -Source $DNumEventLog -EntryType "Information" -EventId "1" -Category "0" -Message $Message -Name $Name -Path $Path
}
}
# Test de restitution des logs par utilisateur
#Foreach ($Event in $LogTab)
# {
# Write-Output $Event.Name | Where-Object {$Event.User -like "user01"} | Out-File C:\DNUM\Logs.txt -Append
# }
# Gestion des permissions NTFS
# $Path : Chemin du répertoire
# $SamAccountName : UID de l'utilisateur
# $FileSystemRights : Définit les droits d'accès à utiliser lors de la création de règles d'accès et d'audit
# $InheritanceFlags : Indicateurs d’héritage spécifient la sémantique d’héritage des entrées de contrôle d’accès
# $PropagationFlags : Spécifie comment les entrées de contrôle d’accès sont propagées aux objets enfants
# $AccessControlType : Spécifie si la règle de contrôle d'accès est autorisée ou refusée
foreach ($Item in $XmlDocument.DataStructureConfiguration.NtfsPermissions.NtfsPermission)
{
# Déclaration des variables
$Name = $ExecutionContext.InvokeCommand.ExpandString($Item.Name)
$Path = $ExecutionContext.InvokeCommand.ExpandString($Item.Path)
$FileSystemRights = $ExecutionContext.InvokeCommand.ExpandString($Item.FileSystemRights)
$AccessControlType = $ExecutionContext.InvokeCommand.ExpandString($Item.AccessControlType)
$InheritanceFlags = $ExecutionContext.InvokeCommand.ExpandString($Item.InheritanceFlags)
$PropagationFlags = $ExecutionContext.InvokeCommand.ExpandString($Item.PropagationFlags)
# Audit des permissions NTFS
$AuditAcl = ((Get-Item $Path).GetAccessControl
('Access')).Access
| Where-Object {$_.IdentityReference
-eq "LABO\$SamAccountName"}
if (($AuditAcl.FileSystemRights -eq $FileSystemRights) -and ($AuditAcl.InheritanceFlags -eq $InheritanceFlags) -and ($AuditAcl.PropagationFlags -eq $PropagationFlags) -and ($AuditAcl.AccessControlType -eq $AccessControlType))
{
$Message = "[INFORMATION] Les permissions NFTS sont correctes pour le dossier : " + $Path
$LogTab+=AddLog -User $SamAccountName -LogName "Application" -Source $DNumEventLog -EntryType "Information" -EventId "2" -Category "1" -Message $Message -Name $Name -Path $Path -FileSystemRights $FileSystemRights -AccessControlType $AccessControlType -InheritanceFlags $InheritanceFlags -PropagationFlags $PropagationFlags
}
Else
{
$Message = "[WARNING] Les permissions NFTS sont incorrectes pour le dossier : " + $Path + ". Les permissions vont étre corrigées"
$LogTab+=AddLog -User $SamAccountName -LogName "Application" -Source $DNumEventLog -EntryType "Warning" -EventId "3" -Category "1" -Message $Message -Name $Name -Path $Path -FileSystemRights $FileSystemRights -AccessControlType $AccessControlType -InheritanceFlags $InheritanceFlags -PropagationFlags $PropagationFlags
# Application des permissions NTFS
$acl = Get-Acl $Path
$acl.Access
| Where-Object {$_.IdentityReference
-eq "LABO\$SamAccountName"} | ForEach-Object {$acl.RemoveAccessRuleSpecific
($_)}
$acl.SetAccessRuleProtection($false,$true)
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule($SamAccountName,$FileSystemRights, $InheritanceFlags, $PropagationFlags, $AccessControlType)
$acl.AddAccessRule($rule)
Set-Acl $Path $acl
$Message = "[INFORMATION] Les permissions NFTS ont été modifiées pour le dossier : " + $Path
$LogTab+=AddLog -User $SamAccountName -LogName "Application" -Source $DNumEventLog -EntryType "Information" -EventId "3" -Category "1" -Message $Message -Name $Name -Path $Path -FileSystemRights $FileSystemRights -AccessControlType $AccessControlType -InheritanceFlags $InheritanceFlags -PropagationFlags $PropagationFlags
}
}
# Gestion des liens DFS
if ([String]::IsNullOrEmpty($(Get-DfsnFolder -Path \\$Domain\Users\$SamAccountName\*)))
{
foreach ($Item in $XmlDocument.DataStructureConfiguration.DfsFolders.DfsFolder)
{
# Déclaration des variables
$Path = $ExecutionContext.InvokeCommand.ExpandString($Item.Path)
$Target = $ExecutionContext.InvokeCommand.ExpandString($Item.Target)
$Description = $ExecutionContext.InvokeCommand.ExpandString($Item.Description)
$Message = "[WARNING] Le lien DFS : " + $Path + " est manquant pour la cible : " + $Target + ". Le lien va être créé."
$LogTab+=AddLog -User $SamAccountName -LogName "Application" -Source $DNumEventLog -EntryType "Warning" -EventId "4" -Category "2" -Message $Message -Name $Name -Path $Path -FileSystemRights $FileSystemRights -AccessControlType $AccessControlType -InheritanceFlags $InheritanceFlags -PropagationFlags $PropagationFlags -Target $Target -Description $Description
New-DfsnFolder -Path $Path -TargetPath $Target -EnableTargetFailback $True -Description $Description
$Message = "[INFORMATION] Le lien DFS : " + $Path + " a été créé pour la cible : " + $Target
$LogTab+=AddLog -User $SamAccountName -LogName "Application" -Source $DNumEventLog -EntryType "Information" -EventId "4" -Category "2" -Message $Message -Name $Name -Path $Path -FileSystemRights $FileSystemRights -AccessControlType $AccessControlType -InheritanceFlags $InheritanceFlags -PropagationFlags $PropagationFlags -Target $Target -Description $Description
}
}
Else
{
foreach ($Item in $XmlDocument.DataStructureConfiguration.DfsFolders.DfsFolder)
{
# Déclaration des variables
$Path = $ExecutionContext.InvokeCommand.ExpandString($Item.Path)
$Target = $ExecutionContext.InvokeCommand.ExpandString($Item.Target)
$Description = $ExecutionContext.InvokeCommand.ExpandString($Item.Description)
$WrongTarget = (Get-DfsnFolderTarget -Path $Path).TargetPath
if ($WrongTarget -notlike $Target)
{
$Message = "[WARNING] La cible : " + $WrongTarget + " du lien DFS : " + $Path + " n'est pas conforme. Cet évènement déclenche le remplacement de la cible par : " + $Target
$LogTab+=AddLog -User $SamAccountName -LogName "Application" -Source $DNumEventLog -EntryType "Warning" -EventId "5" -Category "2" -Message $Message -Name $Name -Path $Path -FileSystemRights $FileSystemRights -AccessControlType $AccessControlType -InheritanceFlags $InheritanceFlags -PropagationFlags $PropagationFlags -Target $Target -Description $Description -Directory $WrongTarget
Remove-DfsnFolderTarget -Path $Path -TargetPath $WrongTarget -Force
New-DfsnFolder -Path $Path -TargetPath $Target -EnableTargetFailback $True -Description $Description
$Message = "[INFORMATION] La cible : " + $WrongTarget + " du lien DFS : " + $Path + " a été remplacée par la cible : " + $Target
$LogTab+=AddLog -User $SamAccountName -LogName "Application" -Source $DNumEventLog -EntryType "Information" -EventId "5" -Category "2" -Message $Message -Name $Name -Path $Path -FileSystemRights $FileSystemRights -AccessControlType $AccessControlType -InheritanceFlags $InheritanceFlags -PropagationFlags $PropagationFlags -Target $Target -Description $Description -Directory $WrongTarget
}
Else
{
$Message = "[INFORMATION] Le lien DFS : " + $Path + " ayant pour la cible : " + $Target + " est conforme"
$LogTab+=AddLog -User $SamAccountName -LogName "Application" -Source $DNumEventLog -EntryType "Information" -EventId "6" -Category "2" -Message $Message -Name $Name -Path $Path -FileSystemRights $FileSystemRights -AccessControlType $AccessControlType -InheritanceFlags $InheritanceFlags -PropagationFlags $PropagationFlags -Target $Target -Description $Description -Directory $WrongTarget
}
}
}
# Début de génération des Logs
# Fichiers de Log dans C:\DNUM\Logs
Write-Output "Courriel : $Mail" | Out-File "C:\DNUM\Logs\$SamAccountName.txt" -Append
Write-Output "ARBORESCENCE :" | Out-File "C:\DNUM\Logs\$SamAccountName.txt" -Append
Foreach ($Event in $LogTab)
{
Write-Output $Event.Message | Where-Object {$Event.User -like $SamAccountName} | Where-Object {$Event.Category -like "0"} | Out-File "C:\DNUM\Logs\$SamAccountName.txt" -Append
}
Write-Output "PERMISSIONS NTFS :" | Out-File "C:\DNUM\Logs\$SamAccountName.txt" -Append
Foreach ($Event in $LogTab)
{
Write-Output $Event.Message | Where-Object {$Event.User -like $SamAccountName} | Where-Object {$Event.Category -like "1"} | Out-File "C:\DNUM\Logs\$SamAccountName.txt" -Append
}
Write-Output "LIENS DFS :" | Out-File "C:\DNUM\Logs\$SamAccountName.txt" -Append
Foreach ($Event in $LogTab)
{
Write-Output $Event.Message | Where-Object {$Event.User -like $SamAccountName} | Where-Object {$Event.Category -like "2"} | Out-File "C:\DNUM\Logs\$SamAccountName.txt" -Append
}
# Observateur d'évènement
Foreach ($Event in $LogTab)
{
if ($Event.EntryType -eq "Warning")
{
Write-Host $Event.Message
Write-EventLog -LogName $Event.LogName -Source $Event.Source -EntryType $Event.EntryType -EventId $Event.EventId -Category $Event.Category -Message $Event.Message
}
}
# Courriel d'alerte
# Fin de génération des Logs
}
}
}
Catch
{
$Message = "UserDataManagement : Exception : " + $_.Exception.Message
+ " / " + $_.Exception.ItemName
Write-EventLog -LogName Application -Source $DNumEventLog -EntryType Error -EventId 0 -Category 0 -Message $Message
Write-Host $Message
}
Finally
{
Write-EventLog -LogName Application -Source $DNumEventLog -EntryType Information -EventId 0 -Category 0 -Message "UserDataManagement : fin du traitement de la gestion des répertoires personnels"
}