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
+53 -18
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
@@ -324,4 +359,4 @@ _SMSTSPackageName=Deploiment %TaskSequenceName%
Subsection=VM-%ISVM% Subsection=VM-%ISVM%
[VM-TRUE] [VM-TRUE]
; OSDComputerName=#Right(Replace("VM-%macaddress001%",":",""),15)# ; OSDComputerName=#Right(Replace("VM-%macaddress001%",":",""),15)#
@@ -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 {
$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 @()
}
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 Assert-RunAsAdministrator
# Créer fichier log si absent
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 =========="
Write-LogMessage "Chemin key : $keyPath" Log-FileAcl -Path $keyPath
Write-LogMessage "Chemin mot de passe : $pwdPath" 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 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"
$dc = "999-dc01.EDU.HDF"
Write-LogMessage "Traitement du site : $Site avec l'OU : $Ou_site"
try {
$netConfigs = Get-NetIPConfiguration -All -ErrorAction Stop
} catch {
Write-LogMessage "Impossible de récupérer la configuration IP : $_" -Type "ERROR"
throw $_
}
$joined = $false
foreach ($cfg in $netConfigs) {
foreach ($addr in $cfg.IPv4Address) {
$ipv4 = $addr.IPAddress
if (-not $ipv4) { continue }
Write-LogMessage "IP détectée : $ipv4"
$parts = $ipv4.Split('.')
if ($parts.Length -lt 4) { Write-LogMessage "IP $ipv4 non conforme." -Type "WARNING"; continue }
try { $thirdOctet = [int]$parts[2] } catch { Write-LogMessage "Impossible de parser $ipv4" -Type "WARNING"; continue }
if ($thirdOctet -ge 192 -and $thirdOctet -le 224) {
$isDomain = $false
try {
$dom = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
if ($dom -and $dom.Name -eq "EDU.HDF") { $isDomain = $true }
} catch { $isDomain = $false }
if (-not $isDomain) {
try {
$envKey = "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
$siteExists = Get-ItemProperty -Path $envKey -Name "site" -ErrorAction SilentlyContinue
if (-not $siteExists) {
New-ItemProperty -Path $envKey -Name "site" -Value $Site -PropertyType String -Force | Out-Null
Write-LogMessage "Variable d'environnement 'site' créée : $Site"
}
} catch { Write-LogMessage "Impossible d'écrire la variable d'environnement 'site' : $_" -Type "WARNING" }
try {
Remove-Computer -UnjoinDomaincredential $cred_edu -WorkgroupName "WORKGROUP" -Force -ErrorAction SilentlyContinue
} catch { Write-LogMessage "Remove-Computer NON requis / échoué : $_" -Type "INFO" }
try {
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."
$joined = $true
break
} catch {
Write-LogMessage "Erreur lors de l'ajout au domaine (interface $ipv4) : $_" -Type "ERROR"
}
} else {
Write-LogMessage "Machine déjà membre du domaine EDU.HDF."
$joined = $true
break
}
} else {
Write-LogMessage "IP $ipv4 hors des plages autorisées (3ème octet = $thirdOctet)."
}
}
if ($joined) { break }
}
if (-not $joined) { Write-LogMessage "Aucune interface IP valide trouvée pour joindre le domaine." -Type "ERROR" }
} else { } else {
Write-LogMessage "Le numéro de site $siteNumberFormatted n'est pas dans le tableau d'OU définies." -Type "ERROR" Write-LogMessage "Le numéro de site $siteNumberFormatted n'est pas dans le tableau d'OU définies." -Type "ERROR"
throw "Site inconnu pour NRD2 : $siteNumberFormatted"
}
} 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 { } else {
Write-LogMessage "Hostname ne correspond pas au format attendu (ex: s2009, s2027, s2073 à s2096)." -Type "ERROR" 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"
} }
Write-LogMessage "Traitement terminé." Write-LogMessage "Site detecte : $Site | OU : $Ou_site | UAI : $uai" -Type "INFO"
Write-LogMessage "Chemin LDAP : $Ou" -Type "INFO"
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
if (-not $ipv4) { continue }
Write-LogMessage "Interface trouvee avec IP : $ipv4" -Type "INFO"
$parts = $ipv4.Split('.')
if ($parts.Length -lt 4) {
Write-LogMessage "Format IP invalide : $ipv4" -Type "WARNING"
continue
}
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
try {
$dom = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
if ($dom -and $dom.Name -eq "EDU.HDF") {
$isDomain = $true
}
} catch {
$isDomain = $false
}
if (-not $isDomain) {
Write-LogMessage "Machine n'est pas encore membre du domaine. Preparation de la jointure..." -Type "INFO"
try {
$envKey = "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
$siteExists = Get-ItemProperty -Path $envKey -Name "site" -ErrorAction SilentlyContinue
if (-not $siteExists) {
New-ItemProperty -Path $envKey -Name "site" -Value $Site -PropertyType String -Force | Out-Null
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"
}
try {
Write-LogMessage "Tentative de suppression du groupe de travail (si applicable)..." -Type "INFO"
Remove-Computer -UnjoinDomaincredential $cred_edu -WorkgroupName "WORKGROUP" -Force -ErrorAction SilentlyContinue
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 {
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
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
break
} catch {
Write-LogMessage "ERREUR lors de l'ajout au domaine (interface IP: $ipv4) : $_" -Type "ERROR"
}
} else {
Write-LogMessage "Machine est deja membre du domaine EDU.HDF." -Type "INFO"
$joined = $true
break
}
} else {
Write-LogMessage "IP $ipv4 est HORS des plages autorisees (3eme octet = $thirdOctet, doit etre 1-254). Ignoree." -Type "WARNING"
}
if ($joined) { break }
}
if (-not $joined) {
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"