Modification NRD3 - Customsettings & Join-Domain Combiné NRD2-NRD3

This commit is contained in:
2026-05-24 21:10:56 +02:00
parent 049b03b4d4
commit e1d8d77a6b
2 changed files with 293 additions and 131 deletions
+52 -17
View File
@@ -3,29 +3,27 @@ Priority= DefaultGateway, SetSiteCode, ByLaptop, ByRole, Model, Init, MachineMod
Properties= SiteCode, Salle, Role, Prefix, PosteType, OSDComputerNumber, MachineModel, MyCustomProperty, ModelAlias Properties= SiteCode, Salle, Role, Prefix, PosteType, OSDComputerNumber, MachineModel, MyCustomProperty, ModelAlias
; , OSDSendMailFrom, OSDSendMailToPri, OSDSendMailToSec, OSDSendMailSubject, OSDSendMailBody, OSDSendMailSMTPServer, OSDSendMailIncludeBDDLog ; , OSDSendMailFrom, OSDSendMailToPri, OSDSendMailToSec, OSDSendMailSubject, OSDSendMailBody, OSDSendMailSMTPServer, OSDSendMailIncludeBDDLog
;UserExit=SiteCode.vbs
; ========================================================= ; =========================================================
; MAPPING RESEAU -> SITE ; MAPPING RESEAU -> SITE
; ========================================================= ; =========================================================
[DefaultGateway] [DefaultGateway]
192.168.82.6 = S0082 10.127.0.254=S1009
10.126.193.254=S2073 10.126.193.254=S2073
10.126.207.254=S2074 10.126.207.254=S2074
10.126.209.254=S2074 10.126.209.254=S2074
10.126.221.254=S2075 10.126.225.254=S2075
10.126.223.254=S2075 10.126.227.254=S2075
10.126.235.254=S2076 ; OK
10.126.237.254=S2076 10.127.241.254=S2076
10.126.249.254=S2077 ; OK
10.126.251.254=S2077 10.127.1.254=S2077
10.126.7.254=S2078 10.126.7.254=S2078
10.126.9.254=S2078 10.126.9.254=S2078
@@ -63,8 +61,9 @@ Properties= SiteCode, Salle, Role, Prefix, PosteType, OSDComputerNumber, Machine
10.126.161.254=S2089 10.126.161.254=S2089
10.126.163.254=S2089 10.126.163.254=S2089
10.126.175.254=S2090 ; OK
10.126.177.254=S2090 10.127.209.254=S2090
10.127.211.254=S2090
10.126.189.254=S2091 10.126.189.254=S2091
10.126.191.254=S2091 10.126.191.254=S2091
@@ -72,8 +71,9 @@ Properties= SiteCode, Salle, Role, Prefix, PosteType, OSDComputerNumber, Machine
10.126.203.254=S2092 10.126.203.254=S2092
10.126.205.254=S2092 10.126.205.254=S2092
10.126.217.254=S2093 ; OK Vlan 120-121
10.126.219.254=S2093 10.128.17.254=S2093
10.128.19.254=S2093
10.126.231.254=S2094 10.126.231.254=S2094
10.126.233.254=S2094 10.126.233.254=S2094
@@ -84,59 +84,88 @@ Properties= SiteCode, Salle, Role, Prefix, PosteType, OSDComputerNumber, Machine
10.126.3.254=S2096 10.126.3.254=S2096
10.126.5.254=S2096 10.126.5.254=S2096
; OK
10.134.49.254=S3147
192.168.82.6=SITKO
; ========================================================= ; =========================================================
; PARAMETRES PAR SITE ; PARAMETRES PAR SITE
; ========================================================= ; =========================================================
[S0082] [SITKO]
SiteCode=sitko
SiteCode=s0082 SLShare=\\192.168.82.189\MDT$\logs
SLShareDynamicLogging=\\192.168.82.189\MDT$\Logs\%OSDComputerName%
[S1009] [S1009]
SiteCode=s1009 SiteCode=s1009
[S1027] [S1027]
SiteCode=s1027 SiteCode=s1027
[S2073] [S2073]
SiteCode=s2073 SiteCode=s2073
SLShare=\\\MDT$\logs
SLShareDynamicLogging=\\\MDT$\Logs\%OSDComputerName%
[S2074] [S2074]
SiteCode=s2074 SiteCode=s2074
[S2075] [S2075]
SiteCode=s2075 SiteCode=s2075
SLShare=\\10.126.224.129\MDT$\logs
SLShareDynamicLogging=\\10.126.224.129\MDT$\Logs\%OSDComputerName%
[S2076] [S2076]
SiteCode=s2076 SiteCode=s2076
[S2077] [S2077]
SiteCode=s2077 SiteCode=s2077
[S2078] [S2078]
SiteCode=s2078 SiteCode=s2078
[S2079] [S2079]
SiteCode=s2079 SiteCode=s2079
[S2080] [S2080]
SiteCode=s2080 SiteCode=s2080
[S2081] [S2081]
SiteCode=s2081 SiteCode=s2081
[S2082] [S2082]
SiteCode=s2082 SiteCode=s2082
@@ -224,6 +253,10 @@ SiteCode=s2095
SiteCode=s2096 SiteCode=s2096
[S3147]
SiteCode=s3147
; ========================================================= ; =========================================================
; DETECTION AUTOMATIQUE TYPE POSTE ; DETECTION AUTOMATIQUE TYPE POSTE
; ========================================================= ; =========================================================
@@ -283,9 +316,11 @@ MachineModel=#Left("%Model%",4)#
[Default] [Default]
OSInstall=Y OSInstall=Y
AdminPassword=crhdf!@2026
SkipComputerName=NO SkipComputerName=NO
SkipDomainMembership=YES SkipDomainMembership=YES
SkipAdminPassword=YES SkipAdminPassword=YES
@@ -1,16 +1,24 @@
<# <#
Join-Domain-USB.ps1 Join-Domain.ps1 (COMBINE NRD2 + NRD3)
Ce script fonctionne pour les deux secteurs NRD2 (s20XX) et NRD3 (s31XX/s3147).
Usage: placer ce script sur la clé USB avec (optionnel) key.bin + pwd.sec Usage: placer ce script sur la clé USB avec (optionnel) key.bin + pwd.sec
- key.bin : clé symétrique (base64) - key.bin : clé symétrique (base64)
- pwd.sec : mot de passe chiffré (ConvertFrom-SecureString -Key) - pwd.sec : mot de passe chiffré (ConvertFrom-SecureString -Key)
Logs -> %SystemRoot%\Logs (ex: C:\Windows\Logs) Logs -> %SystemRoot%\Logs (ex: C:\Windows\Logs)
Appelé depuis MDT via ZTIPowerShell.wsf avec paramètre -path
#> #>
# -----------------------
# Paramètres MDT
# -----------------------
param(
[string]$path = $null # Reçu de MDT: chemin du script
)
# ----------------------- # -----------------------
# Configuration utilisateur # Configuration utilisateur
# ----------------------- # -----------------------
$user_migration_edu = "EDU\ajoutpc" $user_migration_edu = "EDU\ajoutpc"
$secteur = "NRD2"
# Noms de fichiers # Noms de fichiers
$keyFileName = "key.bin" $keyFileName = "key.bin"
@@ -18,12 +26,13 @@ $pwdFileName = "pwd.sec"
$logPrefix = "migration-log" $logPrefix = "migration-log"
# ----------------------- # -----------------------
# Déterminer le dossier du script (fonctionne si lancé depuis clé ou ailleurs) # Déterminer le dossier du script (priorité au paramètre MDT)
# ----------------------- # -----------------------
# $PSScriptRoot fonctionne quand le script est exécuté depuis un fichier,
# sinon on essaie de récupérer via MyInvocation; sinon on prend le répertoire courant.
$scriptDir = $null $scriptDir = $null
if ($PSScriptRoot) { if (-not [string]::IsNullOrWhiteSpace($path)) {
$scriptDir = $path
Write-Output "[DEBUG] Utilisation du chemin MDT (-path) : $scriptDir"
} elseif ($PSScriptRoot) {
$scriptDir = $PSScriptRoot $scriptDir = $PSScriptRoot
} else { } else {
try { try {
@@ -38,27 +47,49 @@ if (-not $scriptDir) { $scriptDir = (Get-Location).Path }
$keyPath = Join-Path -Path $scriptDir -ChildPath $keyFileName $keyPath = Join-Path -Path $scriptDir -ChildPath $keyFileName
$pwdPath = Join-Path -Path $scriptDir -ChildPath $pwdFileName $pwdPath = Join-Path -Path $scriptDir -ChildPath $pwdFileName
# Emplacement des logs : dossier "Logs" de Windows $ScriptVersion = '2026-05-22.1-combined'
function Log-FileAcl {
param([string]$Path)
try {
if (-not (Test-Path -Path $Path)) { Write-LogMessage "Fichier absent pour ACL : $Path" -Type "WARNING"; return }
$acl = Get-Acl -Path $Path
$entries = $acl.Access | ForEach-Object { "$($_.IdentityReference.Value):$($_.FileSystemRights)" }
Write-LogMessage "ACL pour $Path : $($entries -join '; ')" -Type "INFO"
$current = [Security.Principal.WindowsIdentity]::GetCurrent().Name
$hasRead = $false
foreach ($r in $acl.Access) {
if ($r.IdentityReference.Value -eq $current -or $r.IdentityReference.Value -match 'Administrators' -or $r.IdentityReference.Value -match 'SYSTEM') {
if ($r.FileSystemRights -band [System.Security.AccessControl.FileSystemRights]::FullControl -or
$r.FileSystemRights -band [System.Security.AccessControl.FileSystemRights]::Modify -or
$r.FileSystemRights -band [System.Security.AccessControl.FileSystemRights]::ReadAndExecute -or
$r.FileSystemRights -band [System.Security.AccessControl.FileSystemRights]::ReadData -or
$r.FileSystemRights -band [System.Security.AccessControl.FileSystemRights]::ReadAttributes -or
$r.FileSystemRights -band [System.Security.AccessControl.FileSystemRights]::ReadExtendedAttributes) {
$hasRead = $true
}
}
}
if (-not $hasRead) { Write-LogMessage "Attention: L'identite courante ($current) ne semble pas avoir de droit de lecture sur $Path" -Type "WARNING" }
} catch {
Write-LogMessage "Impossible de lire ACL pour $Path : $_" -Type "WARNING"
}
}
$windowsLogsDir = Join-Path -Path $env:windir -ChildPath "Logs" $windowsLogsDir = Join-Path -Path $env:windir -ChildPath "Logs"
if (-not (Test-Path -Path $windowsLogsDir)) { if (-not (Test-Path -Path $windowsLogsDir)) {
New-Item -Path $windowsLogsDir -ItemType Directory -Force | Out-Null New-Item -Path $windowsLogsDir -ItemType Directory -Force | Out-Null
} }
$logFilePath = Join-Path -Path $windowsLogsDir -ChildPath ("$logPrefix-$(Get-Date -Format 'yyyy-MM-dd').log") $logFilePath = Join-Path -Path $windowsLogsDir -ChildPath ("$logPrefix-$(Get-Date -Format 'yyyy-MM-dd').log")
# -----------------------
# Helpers
# -----------------------
function Assert-RunAsAdministrator { function Assert-RunAsAdministrator {
$currentIdentity = [Security.Principal.WindowsIdentity]::GetCurrent() $currentIdentity = [Security.Principal.WindowsIdentity]::GetCurrent()
$principal = New-Object System.Security.Principal.WindowsPrincipal($currentIdentity) $principal = New-Object System.Security.Principal.WindowsPrincipal($currentIdentity)
$isAdmin = $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) $isAdmin = $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
$isSystem = $currentIdentity.Name -eq 'NT AUTHORITY\SYSTEM' $isSystem = $currentIdentity.Name -eq 'NT AUTHORITY\SYSTEM'
Write-LogMessage "Identite courante : $($currentIdentity.Name). IsAdmin=$isAdmin IsSystem=$isSystem"
Write-LogMessage "Identité courante : $($currentIdentity.Name). IsAdmin=$isAdmin IsSystem=$isSystem"
if (-not ($isAdmin -or $isSystem)) { if (-not ($isAdmin -or $isSystem)) {
throw "Le script doit être exécuté avec des privilèges élevés. Exécution automatique MDT non interactive attendue." throw "Le script doit etre execute avec des privileges eleves. Execution automatique MDT non interactive attendue."
} }
} }
@@ -70,40 +101,86 @@ function Write-LogMessage {
Write-Output $entry Write-Output $entry
} }
Write-LogMessage "Version du script Join-Domain : $ScriptVersion" -Type "INFO"
function Set-RestrictiveAcl { function Set-RestrictiveAcl {
param([string]$Path) param([string]$Path)
try { try {
$acl = Get-Acl -Path $Path $acl = Get-Acl -Path $Path
$acl.SetAccessRuleProtection($true, $false) $acl.SetAccessRuleProtection($true, $false)
# Remove existing explicit rules (best-effort) $sidAdmins = New-Object System.Security.Principal.SecurityIdentifier('S-1-5-32-544')
$acl.Access | ForEach-Object { $acl.RemoveAccessRule($_) } $acctAdmins = $sidAdmins.Translate([System.Security.Principal.NTAccount])
$admin = New-Object System.Security.Principal.NTAccount("BUILTIN\Administrators") $acctSystem = New-Object System.Security.Principal.NTAccount("NT AUTHORITY\SYSTEM")
$system = New-Object System.Security.Principal.NTAccount("NT AUTHORITY\SYSTEM") $ruleAdmin = New-Object System.Security.AccessControl.FileSystemAccessRule($acctAdmins,"FullControl","None","Allow")
$ruleAdmin = New-Object System.Security.AccessControl.FileSystemAccessRule($admin,"FullControl","None","Allow") $ruleSystem = New-Object System.Security.AccessControl.FileSystemAccessRule($acctSystem,"FullControl","None","Allow")
$ruleSystem = New-Object System.Security.AccessControl.FileSystemAccessRule($system,"FullControl","None","Allow") $acl.ResetAccessRule($ruleAdmin)
$acl.AddAccessRule($ruleAdmin)
$acl.AddAccessRule($ruleSystem) $acl.AddAccessRule($ruleSystem)
try {
$current = [Security.Principal.WindowsIdentity]::GetCurrent().Name
$acctCurrent = New-Object System.Security.Principal.NTAccount($current)
$ruleCurrent = New-Object System.Security.AccessControl.FileSystemAccessRule($acctCurrent,"FullControl","None","Allow")
$acl.AddAccessRule($ruleCurrent)
} catch {}
Set-Acl -Path $Path -AclObject $acl Set-Acl -Path $Path -AclObject $acl
} catch { } catch {
# sur certaines clés USB, Set-Acl échoue; on ignore mais logguer
Write-LogMessage "Impossible d'appliquer ACL restrictive sur $Path : $_" -Type "WARNING" Write-LogMessage "Impossible d'appliquer ACL restrictive sur $Path : $_" -Type "WARNING"
} }
} }
# ----------------------- function Get-ValidIPAddressesWMI {
# Elevation $validIPs = @()
# ----------------------- try {
Assert-RunAsAdministrator $adapters = Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter "IPEnabled=True" -ErrorAction SilentlyContinue
foreach ($adapter in $adapters) {
if ($adapter.IPAddress) {
foreach ($ip in $adapter.IPAddress) {
if ($ip -and -not ($ip -like '169.254.*') -and -not ($ip -like '0.*') -and -not ($ip -like '127.*')) {
$validIPs += (New-Object PSObject -Property @{IPAddress = $ip})
}
}
}
}
if ($validIPs.Count -gt 0) { return $validIPs }
} catch {
Write-LogMessage "Erreur WMI lors de la recuperation des IPs : $_" -Type "WARNING"
}
try {
$netIPs = Get-NetIPAddress -AddressFamily IPv4 -ErrorAction SilentlyContinue | Where-Object { $_.IPAddress -and -not ($_.IPAddress -like '169.254.*') -and -not ($_.IPAddress -like '0.*') -and -not ($_.IPAddress -like '127.*') }
if ($netIPs) {
return $netIPs | ForEach-Object { New-Object PSObject -Property @{IPAddress = $_.IPAddress} }
}
} catch {
Write-LogMessage "Fallback Get-NetIPAddress a echoue : $_" -Type "WARNING"
}
return @()
}
# Créer fichier log si absent function Test-ValidIPAvailable {
try {
$ips = Get-ValidIPAddressesWMI
if ($ips -and $ips.Count -gt 0) {
foreach ($ip in $ips) { Write-LogMessage "IP detectee : $($ip.IPAddress)" -Type "INFO" }
return $true
} else {
Write-LogMessage "Aucune adresse IPv4 valide detectee." -Type "WARNING"
return $false
}
} catch {
Write-LogMessage "Erreur lors de la verification IP : $_" -Type "WARNING"
return $false
}
}
Assert-RunAsAdministrator
if (-not (Test-Path -Path $logFilePath)) { New-Item -Path $logFilePath -ItemType File -Force | Out-Null } if (-not (Test-Path -Path $logFilePath)) { New-Item -Path $logFilePath -ItemType File -Force | Out-Null }
Write-LogMessage "Dossier script : $scriptDir" Write-LogMessage "========== DEMARRAGE SCRIPT JOIN-DOMAIN =========="
Log-FileAcl -Path $keyPath
Log-FileAcl -Path $pwdPath
Write-LogMessage "Parametres recus de MDT : -path \"$path\"" -Type "INFO"
Write-LogMessage "Dossier script detecte : $scriptDir"
Write-LogMessage "Chemin key : $keyPath" Write-LogMessage "Chemin key : $keyPath"
Write-LogMessage "Chemin mot de passe : $pwdPath" Write-LogMessage "Chemin mot de passe : $pwdPath"
# -----------------------
# Gestion clé et mot de passe (dans dossier du script / clé USB)
# -----------------------
function New-SymmetricKeyFile { function New-SymmetricKeyFile {
param([string]$OutPath) param([string]$OutPath)
$rng = New-Object System.Security.Cryptography.RNGCryptoServiceProvider $rng = New-Object System.Security.Cryptography.RNGCryptoServiceProvider
@@ -128,7 +205,7 @@ function Get-SymmetricKeyBytes {
function New-EncryptedPasswordFile { function New-EncryptedPasswordFile {
param([string]$KeyFile, [string]$PwdFile, [string]$UserName) param([string]$KeyFile, [string]$PwdFile, [string]$UserName)
Write-Host "Fichier mot de passe chiffré absent. Initialisation..." Write-Host "Fichier mot de passe chiffre absent. Initialisation..."
$plain = Read-Host -AsSecureString "Saisir le mot de passe pour $UserName (sera chiffré et stocké sur la clé)" $plain = Read-Host -AsSecureString "Saisir le mot de passe pour $UserName (sera chiffré et stocké sur la clé)"
$keyBytes = Get-SymmetricKeyBytes -KeyFile $KeyFile $keyBytes = Get-SymmetricKeyBytes -KeyFile $KeyFile
if (-not $keyBytes) { $keyBytes = New-SymmetricKeyFile -OutPath $KeyFile } if (-not $keyBytes) { $keyBytes = New-SymmetricKeyFile -OutPath $KeyFile }
@@ -138,29 +215,27 @@ function New-EncryptedPasswordFile {
Write-LogMessage "Fichier mot de passe chiffré créé sur la clé : $PwdFile" Write-LogMessage "Fichier mot de passe chiffré créé sur la clé : $PwdFile"
} }
# Si absent, le script ne peut pas fonctionner en mode automatique
if (-not (Test-Path -Path $pwdPath) -or -not (Test-Path -Path $keyPath)) { if (-not (Test-Path -Path $pwdPath) -or -not (Test-Path -Path $keyPath)) {
Write-LogMessage "Fichiers requis manquants : $keyPath ou $pwdPath" -Type "ERROR" Write-LogMessage "Fichiers requis manquants : $keyPath ou $pwdPath" -Type "ERROR"
throw "Les fichiers $keyFileName et $pwdFileName sont obligatoires pour une exécution automatique." throw "Les fichiers $keyFileName et $pwdFileName sont obligatoires pour une execution automatique."
} }
# Lire et déchiffrer
$keyBytes = Get-SymmetricKeyBytes -KeyFile $keyPath $keyBytes = Get-SymmetricKeyBytes -KeyFile $keyPath
if (-not $keyBytes) { if (-not $keyBytes) {
Write-LogMessage "Impossible de lire la clé symétrique ($keyPath)." -Type "ERROR" Write-LogMessage "Impossible de lire la cle symetrique ($keyPath)." -Type "ERROR"
throw "Clé symétrique manquante ou illisible." throw "Cle symetrique manquante ou illisible."
} }
try { try {
$encString = Get-Content -Path $pwdPath -Raw $encString = Get-Content -Path $pwdPath -Raw
$securePassword = ConvertTo-SecureString $encString -Key $keyBytes $securePassword = ConvertTo-SecureString $encString -Key $keyBytes
} catch { } catch {
Write-LogMessage "Erreur lors du déchiffrement du mot de passe : $_" -Type "ERROR" Write-LogMessage "Erreur lors du dechiffrement du mot de passe : $_" -Type "ERROR"
throw "Impossible de déchiffrer le mot de passe." throw "Impossible de dechiffrer le mot de passe."
} }
$cred_edu = New-Object System.Management.Automation.PSCredential -ArgumentList $user_migration_edu, $securePassword $cred_edu = New-Object System.Management.Automation.PSCredential -ArgumentList $user_migration_edu, $securePassword
# ----------------------- # -----------------------
# OU / UAI (inchangé) # OU / UAI (fusion des deux secteurs)
# ----------------------- # -----------------------
$OuSites = @{ $OuSites = @{
"009" = "009-Labbe-LaMadeleine"; "027" = "027-VertesFeuilles-StAndreLille"; "073" = "073-StExupery-Halluin"; "009" = "009-Labbe-LaMadeleine"; "027" = "027-VertesFeuilles-StAndreLille"; "073" = "073-StExupery-Halluin";
@@ -170,21 +245,37 @@ $OuSites = @{
"083" = "083-Lavoisier-Roubaix"; "084" = "084-Meersch-Roubaix"; "085" = "085-Esaat-Roubaix"; "083" = "083-Lavoisier-Roubaix"; "084" = "084-Meersch-Roubaix"; "085" = "085-Esaat-Roubaix";
"087" = "087-Corbusier-Tourcoing"; "089" = "089-Gambetta-Tourcoing"; "090" = "090-Colbert-Tourcoing"; "087" = "087-Corbusier-Tourcoing"; "089" = "089-Gambetta-Tourcoing"; "090" = "090-Colbert-Tourcoing";
"091" = "091-Sevigne-Tourcoing"; "092" = "092-Derycke-VilleneuvedAscq"; "093" = "093-Queneau-VilleneuvedAscq"; "091" = "091-Sevigne-Tourcoing"; "092" = "092-Derycke-VilleneuvedAscq"; "093" = "093-Queneau-VilleneuvedAscq";
"094" = "094-Cousteau-Wasquehal"; "095" = "095-Zola-Wattrelos"; "096" = "096-Savary-Wattrelos" "094" = "094-Cousteau-Wasquehal"; "095" = "095-Zola-Wattrelos"; "096" = "096-Savary-Wattrelos"; "147" = "147-Chatelet-Douai"
} }
$OuUAI = @{ $OuUAI = @{
"009" = "0590122M"; "027" = "0592832H"; "073" = "0592850C"; "074" = "0594380R"; "075" = "0590144L"; "009" = "0590122M"; "027" = "0592832H"; "073" = "0592850C"; "074" = "0594380R"; "075" = "0590144L";
"076" = "0597100X"; "077" = "0590143K"; "078" = "0590187H"; "079" = "0590182C"; "080" = "0590184E"; "076" = "0597100X"; "077" = "0590143K"; "078" = "0590187H"; "079" = "0590182C"; "080" = "0590184E";
"081" = "0590185F"; "082" = "0590186G"; "083" = "0590189K"; "084" = "0590181B"; "085" = "0594391C"; "081" = "0590185F"; "082" = "0590186G"; "083" = "0590189K"; "084" = "0590181B"; "085" = "0594391C";
"087" = "0590216P"; "089" = "0590212K"; "090" = "0590214M"; "091" = "0590215N"; "092" = "0594375K"; "087" = "0590216P"; "089" = "0590212K"; "090" = "0590214M"; "091" = "0590215N"; "092" = "0594375K";
"093" = "0594424N"; "094" = "0590249A"; "095" = "0590233H"; "096" = "0595787V" "093" = "0594424N"; "094" = "0590249A"; "095" = "0590233H"; "096" = "0595787V"; "147" = "0590063Y"
} }
# ----------------------- Write-LogMessage "\n=== VERIFICATION RESEAU ==="
# Détection hostname / site et jointure domaine (inchangé mais robuste) if (-not (Test-ValidIPAvailable)) {
# ----------------------- Write-LogMessage "ARRET : Pas d'adresse IP valide. La connexion reseau n'a pas pu etre etablie." -Type "ERROR"
throw "Pas d'IP valide disponible. Impossible de continuer."
}
Write-LogMessage "Verification reseau reussie - Au moins une IP valide detectee." -Type "INFO"
Write-LogMessage "\n=== DETECTION HOSTNAME ET JOINTURE DOMAINE ==="
$hostname = $env:COMPUTERNAME $hostname = $env:COMPUTERNAME
Write-LogMessage "Hostname detecte : $hostname" -Type "INFO"
$secteur = $null
$Site = $null
$Ou_site = $null
$uai = $null
$Ou = $null
$dc = "999-dc01.EDU.HDF"
$joined = $false
if ($hostname -match '^s20(\d{2})') { if ($hostname -match '^s20(\d{2})') {
$secteur = "NRD2"
$siteNumber = $matches[1] $siteNumber = $matches[1]
$siteNumberFormatted = "{0:D3}" -f [int]$siteNumber $siteNumberFormatted = "{0:D3}" -f [int]$siteNumber
if ($OuSites.ContainsKey($siteNumberFormatted)) { if ($OuSites.ContainsKey($siteNumberFormatted)) {
@@ -192,74 +283,110 @@ if ($hostname -match '^s20(\d{2})') {
$Ou_site = $OuSites[$siteNumberFormatted] $Ou_site = $OuSites[$siteNumberFormatted]
$uai = $OuUAI[$siteNumberFormatted] $uai = $OuUAI[$siteNumberFormatted]
$Ou = "OU=Pedagogie,OU=$uai,OU=Parc-Informatique,OU=$Ou_site,OU=$secteur,OU=HDF,DC=EDU,DC=HDF" $Ou = "OU=Pedagogie,OU=$uai,OU=Parc-Informatique,OU=$Ou_site,OU=$secteur,OU=HDF,DC=EDU,DC=HDF"
# $dc = "$Site-dc.EDU.HDF" } else {
$dc = "999-dc01.EDU.HDF" Write-LogMessage "Le numéro de site $siteNumberFormatted n'est pas dans le tableau d'OU définies." -Type "ERROR"
Write-LogMessage "Traitement du site : $Site avec l'OU : $Ou_site" throw "Site inconnu pour NRD2 : $siteNumberFormatted"
try {
$netConfigs = Get-NetIPConfiguration -All -ErrorAction Stop
} catch {
Write-LogMessage "Impossible de récupérer la configuration IP : $_" -Type "ERROR"
throw $_
} }
} elseif ($hostname -match '^s3(\d{3})') {
$secteur = "NRD3"
$siteNumber = $matches[1]
$siteNumberFormatted = "{0:D3}" -f [int]$siteNumber
if ($OuSites.ContainsKey($siteNumberFormatted)) {
$Site = "03-$siteNumberFormatted"
$Ou_site = $OuSites[$siteNumberFormatted]
$uai = $OuUAI[$siteNumberFormatted]
$Ou = "OU=Pedagogie,OU=$uai,OU=Parc-Informatique,OU=$Ou_site,OU=$secteur,OU=HDF,DC=EDU,DC=HDF"
} else {
Write-LogMessage "Le numéro de site $siteNumberFormatted n'est pas dans le tableau d'OU définies." -Type "ERROR"
throw "Site inconnu pour NRD3 : $siteNumberFormatted"
}
} else {
Write-LogMessage "ERREUR : Hostname ne correspond pas au format attendu (s20XX ou s3XXX)." -Type "ERROR"
Write-LogMessage "Format attendu : s2009, s2027, s2073 à s2096 (ex: s2075 pour site 075) ou s3147 pour NRD3." -Type "ERROR"
throw "Hostname invalide : $hostname - Format attendu s20XX ou s3XXX"
}
$joined = $false Write-LogMessage "Site detecte : $Site | OU : $Ou_site | UAI : $uai" -Type "INFO"
foreach ($cfg in $netConfigs) { Write-LogMessage "Chemin LDAP : $Ou" -Type "INFO"
foreach ($addr in $cfg.IPv4Address) {
Write-LogMessage "Recherche d'une interface reseau avec IP valide pour la jointure domaine..." -Type "INFO"
$netConfigs = Get-ValidIPAddressesWMI
if (-not $netConfigs -or $netConfigs.Count -eq 0) {
Write-LogMessage "Aucune interface reseau disponible." -Type "ERROR"
throw "Pas de configuration reseau valide."
}
foreach ($addr in $netConfigs) {
$ipv4 = $addr.IPAddress $ipv4 = $addr.IPAddress
if (-not $ipv4) { continue } if (-not $ipv4) { continue }
Write-LogMessage "IP détectée : $ipv4" Write-LogMessage "Interface trouvee avec IP : $ipv4" -Type "INFO"
$parts = $ipv4.Split('.') $parts = $ipv4.Split('.')
if ($parts.Length -lt 4) { Write-LogMessage "IP $ipv4 non conforme." -Type "WARNING"; continue } if ($parts.Length -lt 4) {
try { $thirdOctet = [int]$parts[2] } catch { Write-LogMessage "Impossible de parser $ipv4" -Type "WARNING"; continue } Write-LogMessage "Format IP invalide : $ipv4" -Type "WARNING"
continue
if ($thirdOctet -ge 192 -and $thirdOctet -le 224) { }
try {
$thirdOctet = [int]$parts[2]
} catch {
Write-LogMessage "Impossible de parser le 3eme octet de $ipv4" -Type "WARNING"
continue
}
if ($thirdOctet -ge 1 -and $thirdOctet -le 254) {
Write-LogMessage "IP $ipv4 est dans les plages autorisees (3eme octet = $thirdOctet). Verification statut domaine..." -Type "INFO"
$isDomain = $false $isDomain = $false
try { try {
$dom = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain() $dom = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
if ($dom -and $dom.Name -eq "EDU.HDF") { $isDomain = $true } if ($dom -and $dom.Name -eq "EDU.HDF") {
} catch { $isDomain = $false } $isDomain = $true
}
} catch {
$isDomain = $false
}
if (-not $isDomain) { if (-not $isDomain) {
Write-LogMessage "Machine n'est pas encore membre du domaine. Preparation de la jointure..." -Type "INFO"
try { try {
$envKey = "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" $envKey = "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
$siteExists = Get-ItemProperty -Path $envKey -Name "site" -ErrorAction SilentlyContinue $siteExists = Get-ItemProperty -Path $envKey -Name "site" -ErrorAction SilentlyContinue
if (-not $siteExists) { if (-not $siteExists) {
New-ItemProperty -Path $envKey -Name "site" -Value $Site -PropertyType String -Force | Out-Null New-ItemProperty -Path $envKey -Name "site" -Value $Site -PropertyType String -Force | Out-Null
Write-LogMessage "Variable d'environnement 'site' créée : $Site" Write-LogMessage "Variable d'environnement 'site' creee : $Site" -Type "INFO"
} else {
Write-LogMessage "Variable d'environnement 'site' deja presente : $(Get-ItemProperty -Path $envKey -Name 'site' -ErrorAction SilentlyContinue).site" -Type "INFO"
}
} catch {
Write-LogMessage "Impossible d'ecrire la variable d'environnement 'site' : $_" -Type "WARNING"
} }
} catch { Write-LogMessage "Impossible d'écrire la variable d'environnement 'site' : $_" -Type "WARNING" }
try { try {
Write-LogMessage "Tentative de suppression du groupe de travail (si applicable)..." -Type "INFO"
Remove-Computer -UnjoinDomaincredential $cred_edu -WorkgroupName "WORKGROUP" -Force -ErrorAction SilentlyContinue Remove-Computer -UnjoinDomaincredential $cred_edu -WorkgroupName "WORKGROUP" -Force -ErrorAction SilentlyContinue
} catch { Write-LogMessage "Remove-Computer NON requis / échoué : $_" -Type "INFO" } Write-LogMessage "Suppression du groupe de travail reussie." -Type "INFO"
} catch {
Write-LogMessage "Pas de groupe de travail a supprimer ou erreur (OK en environnement vierge) : $_" -Type "INFO"
}
try { try {
Write-LogMessage "Jointure du domaine EDU.HDF avec l'OU $Ou_site..." -Type "INFO"
Add-Computer -DomainName "edu.hdf" -Credential $cred_edu -OUPath $Ou -Force -ErrorAction Stop Add-Computer -DomainName "edu.hdf" -Credential $cred_edu -OUPath $Ou -Force -ErrorAction Stop
Write-LogMessage "La machine a été ajoutée au domaine $dc avec succès." Write-LogMessage "SUCCESS : La machine a ete correctement ajoutee au domaine EDU.HDF !" -Type "INFO"
Write-LogMessage "Serveur DC : $dc" -Type "INFO"
Write-LogMessage "Site : $Site" -Type "INFO"
Write-LogMessage "OU : $Ou" -Type "INFO"
$joined = $true $joined = $true
break break
} catch { } catch {
Write-LogMessage "Erreur lors de l'ajout au domaine (interface $ipv4) : $_" -Type "ERROR" Write-LogMessage "ERREUR lors de l'ajout au domaine (interface IP: $ipv4) : $_" -Type "ERROR"
} }
} else { } else {
Write-LogMessage "Machine déjà membre du domaine EDU.HDF." Write-LogMessage "Machine est deja membre du domaine EDU.HDF." -Type "INFO"
$joined = $true $joined = $true
break break
} }
} else { } else {
Write-LogMessage "IP $ipv4 hors des plages autorisées (3ème octet = $thirdOctet)." Write-LogMessage "IP $ipv4 est HORS des plages autorisees (3eme octet = $thirdOctet, doit etre 1-254). Ignoree." -Type "WARNING"
}
} }
if ($joined) { break } if ($joined) { break }
}
if (-not $joined) { Write-LogMessage "Aucune interface IP valide trouvée pour joindre le domaine." -Type "ERROR" }
} else {
Write-LogMessage "Le numéro de site $siteNumberFormatted n'est pas dans le tableau d'OU définies." -Type "ERROR"
}
} else {
Write-LogMessage "Hostname ne correspond pas au format attendu (ex: s2009, s2027, s2073 à s2096)." -Type "ERROR"
} }
if (-not $joined) {
Write-LogMessage "Traitement terminé." Write-LogMessage "ERREUR : Aucune interface IP valide n'a permis la jointure au domaine." -Type "ERROR"
throw "Jointure au domaine échouée : pas d'interface IP valide."
}
Write-LogMessage "\n========== FIN SCRIPT JOIN-DOMAIN =========="
Write-LogMessage "Traitement du script terminé avec succès." -Type "INFO"