Gestion d'Identité et Nomenclature d'Appareils Entreprise sur macOS
Implémentez une gestion d'identité et de nomenclature d'appareils de niveau entreprise sur votre déploiement MacFleet avec des conventions de nomenclature standardisées, un provisioning automatisé et une validation d'identité complète. Ce tutoriel fournit des solutions pour maintenir une identification cohérente des appareils et une présence réseau.
Comprendre l'Identité des Appareils macOS
Les appareils macOS ont trois composants de nomenclature distincts qui affectent l'identification et le comportement réseau :
- Nom d'Ordinateur - Nom convivial affiché dans les préférences Partage et Finder
- Nom d'Hôte Local - Identifiant réseau avec suffixe ".local" pour Bonjour/mDNS
- Nom d'Hôte - Nom d'hôte réseau principal utilisé dans terminal et services réseau
- Nom NetBIOS - Identifiant de compatibilité réseau Windows
Opérations de Nomenclature d'Appareils de Base
Changer le Nom d'Ordinateur
#!/bin/bash
# Définir le nom d'ordinateur
scutil --set ComputerName "$ComputerName"
echo "Nom d'ordinateur défini à : $ComputerName"
Changer le Nom d'Hôte Local
#!/bin/bash
# Définir le nom d'hôte local pour la découverte Bonjour/mDNS
scutil --set LocalHostName "$LocalHostName"
echo "Nom d'hôte local défini à : $LocalHostName"
Changer le Nom d'Hôte
#!/bin/bash
# Définir le nom d'hôte principal pour les services réseau
# Exemple : Votre-iMac.domaine.com
scutil --set HostName "$HostName"
echo "Nom d'hôte défini à : $HostName"
Vider le Cache DNS
#!/bin/bash
# Vider le cache DNS après les changements de nom
sudo dscacheutil --flushcache
echo "Cache DNS vidé avec succès"
Normes de Nomenclature d'Entreprise
Script de Convention de Nomenclature Standardisée
#!/bin/bash
# Outil de Nomenclature d'Appareils Entreprise MacFleet
# Implémente des conventions de nomenclature standardisées dans la flotte
# Configuration
CONFIG_FILE="/etc/macfleet/naming_policy.conf"
LOG_FILE="/var/log/macfleet_naming.log"
REPORT_DIR="/var/log/macfleet_reports"
# Créer les répertoires
mkdir -p "$(dirname "$CONFIG_FILE")" "$(dirname "$LOG_FILE")" "$REPORT_DIR"
# Politique de nomenclature par défaut
cat > "$CONFIG_FILE" 2>/dev/null << 'EOF' || true
# Politique de Nomenclature d'Appareils MacFleet
# Version : 2.0
# Format de Convention de Nomenclature
# Modèle : {PREFIXE}-{LOCALISATION}-{TYPE}-{SEQUENCE}
# Exemple : MF-PAR-MBP-001
# Paramètres d'Organisation
ORG_PREFIX="MF"
DOMAIN_SUFFIX="macfleet.local"
ENABLE_AUTO_NAMING=true
VALIDATE_NAMES=true
# Codes de Localisation
LOCATION_CODES="PAR,LYO,MRS,LIL,STR,NAN,BOR,TOU"
DEFAULT_LOCATION="PAR"
# Mapping des Types d'Appareils
# Format : IDENTIFIANT_MODELE:CODE_COURT
DEVICE_TYPES=(
"MacBookPro:MBP"
"MacBookAir:MBA"
"iMac:iMac"
"iMacPro:iMP"
"MacPro:MP"
"Macmini:MM"
"MacStudio:MS"
)
# Paramètres Réseau
ENABLE_NETBIOS=true
SYNC_ALL_NAMES=true
FLUSH_DNS_AFTER_CHANGE=true
EOF
# Charger la configuration
source "$CONFIG_FILE" 2>/dev/null || true
# Fonction de journalisation
log_action() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}
# Obtenir les informations du modèle d'appareil
get_device_model() {
local model_identifier
model_identifier=$(system_profiler SPHardwareDataType | grep "Model Identifier" | awk -F: '{print $2}' | xargs)
# Mapper le modèle au type d'appareil
for mapping in "${DEVICE_TYPES[@]}"; do
local model_pattern="${mapping%:*}"
local type_code="${mapping#*:}"
if [[ "$model_identifier" == *"$model_pattern"* ]]; then
echo "$type_code"
return 0
fi
done
# Fallback par défaut
echo "MAC"
}
# Obtenir le code de localisation depuis la saisie utilisateur ou configuration
get_location_code() {
local location="$1"
if [[ -z "$location" ]]; then
location="$DEFAULT_LOCATION"
fi
# Valider le code de localisation
if [[ ",$LOCATION_CODES," == *",$location,"* ]]; then
echo "$location"
else
echo "$DEFAULT_LOCATION"
log_action "AVERTISSEMENT : Localisation invalide '$location', utilisation par défaut '$DEFAULT_LOCATION'"
fi
}
# Générer un numéro de séquence
generate_sequence() {
local prefix="$1"
local sequence_file="/var/lib/macfleet/sequences/${prefix}.seq"
mkdir -p "$(dirname "$sequence_file")"
if [[ -f "$sequence_file" ]]; then
local current_seq
current_seq=$(cat "$sequence_file")
((current_seq++))
else
current_seq=1
fi
printf "%03d" "$current_seq" > "$sequence_file"
printf "%03d" "$current_seq"
}
# Générer un nom d'appareil standardisé
generate_device_name() {
local location="$1"
local custom_suffix="$2"
local device_type
device_type=$(get_device_model)
local location_code
location_code=$(get_location_code "$location")
local base_prefix="${ORG_PREFIX}-${location_code}-${device_type}"
if [[ -n "$custom_suffix" ]]; then
echo "${base_prefix}-${custom_suffix}"
else
local sequence
sequence=$(generate_sequence "$base_prefix")
echo "${base_prefix}-${sequence}"
fi
}
# Valider la conformité de nomenclature
validate_device_name() {
local name="$1"
local errors=()
# Validation de longueur
if [[ ${#name} -gt 15 ]]; then
errors+=("Nom trop long (max 15 caractères pour compatibilité NetBIOS)")
fi
# Validation de caractères
if [[ "$name" =~ [^A-Za-z0-9\-] ]]; then
errors+=("Caractères invalides (seuls alphanumériques et tirets autorisés)")
fi
# Validation de format
if [[ ! "$name" =~ ^[A-Z]{2,4}-[A-Z]{2,4}-[A-Z]{2,4}-[0-9]{3}$ ]] && [[ "$VALIDATE_NAMES" == "true" ]]; then
errors+=("Le nom ne correspond pas au format standard de l'organisation")
fi
if [[ ${#errors[@]} -eq 0 ]]; then
return 0
else
printf '%s\n' "${errors[@]}"
return 1
fi
}
# Appliquer les noms d'appareils avec validation
apply_device_names() {
local computer_name="$1"
local hostname="$2"
local local_hostname="$3"
echo "=== Application des Noms d'Appareils ==="
# Valider tous les noms
local validation_errors=0
if ! validate_device_name "$computer_name"; then
echo "❌ Validation du nom d'ordinateur échouée"
((validation_errors++))
fi
if [[ -n "$hostname" ]] && ! validate_device_name "${hostname%%.*}"; then
echo "❌ Validation du nom d'hôte échouée"
((validation_errors++))
fi
if [[ -n "$local_hostname" ]] && ! validate_device_name "$local_hostname"; then
echo "❌ Validation du nom d'hôte local échouée"
((validation_errors++))
fi
if [[ $validation_errors -gt 0 ]] && [[ "$VALIDATE_NAMES" == "true" ]]; then
echo "⚠️ Validation des noms échouée, abandon des changements"
return 1
fi
# Appliquer le nom d'ordinateur
if [[ -n "$computer_name" ]]; then
scutil --set ComputerName "$computer_name"
echo "✅ Nom d'ordinateur : $computer_name"
log_action "Nom d'ordinateur changé en : $computer_name"
fi
# Appliquer le nom d'hôte
if [[ -n "$hostname" ]]; then
scutil --set HostName "$hostname"
echo "✅ Nom d'hôte : $hostname"
log_action "Nom d'hôte changé en : $hostname"
fi
# Appliquer le nom d'hôte local
if [[ -n "$local_hostname" ]]; then
scutil --set LocalHostName "$local_hostname"
echo "✅ Nom d'hôte local : $local_hostname"
log_action "Nom d'hôte local changé en : $local_hostname"
fi
# Appliquer le nom NetBIOS si activé
if [[ "$ENABLE_NETBIOS" == "true" ]] && [[ -n "$computer_name" ]]; then
defaults write /Library/Preferences/SystemConfiguration/com.apple.smb.server NetBIOSName "$computer_name"
echo "✅ Nom NetBIOS : $computer_name"
log_action "Nom NetBIOS changé en : $computer_name"
fi
# Vider le cache DNS
if [[ "$FLUSH_DNS_AFTER_CHANGE" == "true" ]]; then
sudo dscacheutil --flushcache
echo "✅ Cache DNS vidé"
log_action "Cache DNS vidé après changements de noms"
fi
return 0
}
# Auto-génération et application des noms
auto_provision_device() {
local location="$1"
local custom_suffix="$2"
echo "=== Provisioning Automatique des Noms d'Appareils ==="
if [[ "$ENABLE_AUTO_NAMING" != "true" ]]; then
echo "❌ Nomenclature automatique désactivée dans la politique"
return 1
fi
# Générer le nom de base
local base_name
base_name=$(generate_device_name "$location" "$custom_suffix")
# Créer toutes les variantes de nomenclature
local computer_name="$base_name"
local local_hostname="$base_name"
local hostname="${base_name}.${DOMAIN_SUFFIX}"
echo "Noms générés :"
echo " Nom d'Ordinateur : $computer_name"
echo " Nom d'Hôte Local : $local_hostname"
echo " Nom d'Hôte : $hostname"
echo ""
# Appliquer les noms
apply_device_names "$computer_name" "$hostname" "$local_hostname"
}
# Obtenir l'identité actuelle de l'appareil
get_current_identity() {
echo "=== Identité Actuelle de l'Appareil ==="
local computer_name
computer_name=$(scutil --get ComputerName 2>/dev/null || echo "Non Défini")
local hostname
hostname=$(scutil --get HostName 2>/dev/null || echo "Non Défini")
local local_hostname
local_hostname=$(scutil --get LocalHostName 2>/dev/null || echo "Non Défini")
local netbios_name
netbios_name=$(defaults read /Library/Preferences/SystemConfiguration/com.apple.smb.server NetBIOSName 2>/dev/null || echo "Non Défini")
echo "Nom d'Ordinateur : $computer_name"
echo "Nom d'Hôte : $hostname"
echo "Nom d'Hôte Local : $local_hostname"
echo "Nom NetBIOS : $netbios_name"
echo "Numéro de Série : $(system_profiler SPHardwareDataType | grep "Serial Number" | awk -F: '{print $2}' | xargs)"
echo "Modèle : $(system_profiler SPHardwareDataType | grep "Model Identifier" | awk -F: '{print $2}' | xargs)"
}
# Générer un rapport de conformité
generate_naming_report() {
local report_file="$REPORT_DIR/device_naming_$(date +%Y%m%d_%H%M%S).json"
echo "=== Génération du Rapport de Conformité de Nomenclature ==="
local computer_name hostname local_hostname netbios_name
computer_name=$(scutil --get ComputerName 2>/dev/null || echo "")
hostname=$(scutil --get HostName 2>/dev/null || echo "")
local_hostname=$(scutil --get LocalHostName 2>/dev/null || echo "")
netbios_name=$(defaults read /Library/Preferences/SystemConfiguration/com.apple.smb.server NetBIOSName 2>/dev/null || echo "")
# Vérifier la conformité
local computer_compliant="false"
local hostname_compliant="false"
local naming_compliant="false"
if validate_device_name "$computer_name" >/dev/null 2>&1; then
computer_compliant="true"
fi
if [[ -n "$hostname" ]] && validate_device_name "${hostname%%.*}" >/dev/null 2>&1; then
hostname_compliant="true"
fi
if [[ "$computer_compliant" == "true" ]] && [[ "$hostname_compliant" == "true" ]]; then
naming_compliant="true"
fi
# Créer le rapport JSON
cat > "$report_file" << EOF
{
"type_rapport": "conformite_nomenclature_appareil",
"horodatage": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
"infos_appareil": {
"nom_hote": "$(hostname)",
"numero_serie": "$(system_profiler SPHardwareDataType | grep "Serial Number" | awk -F: '{print $2}' | xargs)",
"identifiant_modele": "$(system_profiler SPHardwareDataType | grep "Model Identifier" | awk -F: '{print $2}' | xargs)",
"version_macos": "$(sw_vers -productVersion)"
},
"noms_actuels": {
"nom_ordinateur": "$computer_name",
"nom_hote": "$hostname",
"nom_hote_local": "$local_hostname",
"nom_netbios": "$netbios_name"
},
"conformite": {
"nom_ordinateur_conforme": $computer_compliant,
"nom_hote_conforme": $hostname_compliant,
"conformite_globale": $naming_compliant,
"version_politique": "2.0"
},
"parametres_politique": {
"prefixe_org": "$ORG_PREFIX",
"suffixe_domaine": "$DOMAIN_SUFFIX",
"nomenclature_auto_activee": $ENABLE_AUTO_NAMING,
"validation_activee": $VALIDATE_NAMES
}
}
EOF
echo "Rapport de nomenclature sauvegardé dans : $report_file"
log_action "Rapport de nomenclature d'appareil généré : $report_file"
}
# Fonction principale avec gestion d'arguments
main() {
log_action "=== Outil de Nomenclature d'Appareils MacFleet Démarré ==="
case "${1:-status}" in
"auto-provision")
auto_provision_device "$2" "$3"
;;
"set-names")
apply_device_names "$2" "$3" "$4"
;;
"validate")
get_current_identity
echo ""
if validate_device_name "$2" 2>/dev/null; then
echo "✅ Le nom '$2' est conforme"
else
echo "❌ Validation du nom '$2' échouée :"
validate_device_name "$2"
fi
;;
"report")
generate_naming_report
;;
"status"|*)
get_current_identity
;;
esac
log_action "=== Opération de nomenclature d'appareil terminée ==="
}
# Exécuter la fonction principale
main "$@"
Gestion d'Identité Avancée
Synchronisation d'Identité Réseau
#!/bin/bash
# Synchroniser tous les composants de nomenclature pour la cohérence
sync_network_identity() {
echo "=== Synchronisation d'Identité Réseau ==="
# Obtenir le nom d'ordinateur actuel comme source
local source_name
source_name=$(scutil --get ComputerName 2>/dev/null)
if [[ -z "$source_name" ]]; then
echo "❌ Aucun nom d'ordinateur défini, impossible de synchroniser"
return 1
fi
# Générer des noms cohérents
local clean_name
clean_name=$(echo "$source_name" | tr '[:upper:]' '[:lower:]' | tr ' ' '-')
local local_hostname="$clean_name"
local hostname="${clean_name}.local"
echo "Synchronisation de l'identité depuis : $source_name"
echo "Nom d'Hôte Local : $local_hostname"
echo "Nom d'Hôte : $hostname"
# Appliquer les noms synchronisés
scutil --set LocalHostName "$local_hostname"
scutil --set HostName "$hostname"
# Mettre à jour NetBIOS
defaults write /Library/Preferences/SystemConfiguration/com.apple.smb.server NetBIOSName "$source_name"
# Vider le cache DNS
sudo dscacheutil --flushcache
echo "✅ Identité réseau synchronisée"
}
sync_network_identity
Provisioning d'Appareils en Masse
#!/bin/bash
# Nomenclature d'appareils en masse pour déploiement de flotte
bulk_provision_devices() {
local csv_file="$1"
local report_file="/tmp/bulk_naming_$(date +%Y%m%d_%H%M%S).csv"
echo "=== Provisioning d'Appareils en Masse ==="
echo "Serie,Nom_Ordinateur,Nom_Hote,Statut,Horodatage" > "$report_file"
# Lire le fichier CSV avec les affectations d'appareils
# Format : Serie,Localisation,SuffixePersonnalise
while IFS=',' read -r serial location suffix; do
# Ignorer l'en-tête
[[ "$serial" == "Serie" ]] && continue
local current_serial
current_serial=$(system_profiler SPHardwareDataType | grep "Serial Number" | awk -F: '{print $2}' | xargs)
if [[ "$current_serial" == "$serial" ]]; then
echo "Traitement de l'appareil : $serial"
# Générer les noms pour cet appareil
local device_name
device_name=$(generate_device_name "$location" "$suffix")
local computer_name="$device_name"
local hostname="${device_name}.macfleet.local"
# Appliquer les noms
if apply_device_names "$computer_name" "$hostname" "$device_name"; then
echo "$serial,$computer_name,$hostname,SUCCES,$(date)" >> "$report_file"
echo "✅ Provisionné avec succès : $computer_name"
else
echo "$serial,$computer_name,$hostname,ECHEC,$(date)" >> "$report_file"
echo "❌ Échec du provisioning : $computer_name"
fi
break
fi
done < "$csv_file"
echo "Rapport de provisioning en masse : $report_file"
}
# Exemple d'utilisation :
# bulk_provision_devices "/chemin/vers/affectations_appareils.csv"
Validation d'Identité et Conformité
Script de Validation Complète
#!/bin/bash
# Validation complète de l'identité d'appareil
validate_device_identity() {
echo "=== Validation de l'Identité d'Appareil ==="
local issues=0
local warnings=0
# Obtenir tous les noms actuels
local computer_name hostname local_hostname
computer_name=$(scutil --get ComputerName 2>/dev/null)
hostname=$(scutil --get HostName 2>/dev/null)
local_hostname=$(scutil --get LocalHostName 2>/dev/null)
# Validation du nom d'ordinateur
if [[ -z "$computer_name" ]]; then
echo "❌ Nom d'ordinateur non défini"
((issues++))
elif ! validate_device_name "$computer_name" >/dev/null 2>&1; then
echo "⚠️ Format de nom d'ordinateur non conforme : $computer_name"
((warnings++))
else
echo "✅ Nom d'ordinateur conforme : $computer_name"
fi
# Validation du nom d'hôte
if [[ -z "$hostname" ]]; then
echo "⚠️ Nom d'hôte non défini"
((warnings++))
elif ! validate_device_name "${hostname%%.*}" >/dev/null 2>&1; then
echo "⚠️ Format de nom d'hôte non conforme : $hostname"
((warnings++))
else
echo "✅ Nom d'hôte conforme : $hostname"
fi
# Validation du nom d'hôte local
if [[ -z "$local_hostname" ]]; then
echo "⚠️ Nom d'hôte local non défini"
((warnings++))
elif ! validate_device_name "$local_hostname" >/dev/null 2>&1; then
echo "⚠️ Format de nom d'hôte local non conforme : $local_hostname"
((warnings++))
else
echo "✅ Nom d'hôte local conforme : $local_hostname"
fi
# Vérification de cohérence
if [[ -n "$computer_name" && -n "$local_hostname" ]]; then
local expected_local
expected_local=$(echo "$computer_name" | tr '[:upper:]' '[:lower:]' | tr ' ' '-')
if [[ "$local_hostname" != "$expected_local" ]]; then
echo "⚠️ Noms non synchronisés (Ordinateur : $computer_name, Local : $local_hostname)"
((warnings++))
fi
fi
# Validation de connectivité réseau
echo ""
echo "=== Test d'Identité Réseau ==="
# Tester la résolution Bonjour
if ping -c 1 "${local_hostname}.local" >/dev/null 2>&1; then
echo "✅ Résolution Bonjour fonctionnelle"
else
echo "⚠️ Résolution Bonjour échouée"
((warnings++))
fi
# Tester la résolution du nom d'hôte
if [[ -n "$hostname" ]] && ping -c 1 "$hostname" >/dev/null 2>&1; then
echo "✅ Résolution de nom d'hôte fonctionnelle"
elif [[ -n "$hostname" ]]; then
echo "⚠️ Résolution de nom d'hôte échouée"
((warnings++))
fi
# Résumé
echo ""
echo "=== Résumé de Validation ==="
echo "Problèmes : $issues"
echo "Avertissements : $warnings"
if [[ $issues -eq 0 && $warnings -eq 0 ]]; then
echo "✅ Identité d'appareil entièrement conforme"
return 0
elif [[ $issues -eq 0 ]]; then
echo "⚠️ Identité d'appareil a des avertissements mais est fonctionnelle"
return 1
else
echo "❌ Identité d'appareil a des problèmes critiques"
return 2
fi
}
validate_device_identity
Intégration des Services Réseau
DNS et Services d'Annuaire
#!/bin/bash
# Mettre à jour les entrées DNS et services d'annuaire
update_network_services() {
echo "=== Mise à Jour des Services Réseau ==="
# Obtenir les noms actuels
local computer_name hostname
computer_name=$(scutil --get ComputerName 2>/dev/null)
hostname=$(scutil --get HostName 2>/dev/null)
# Mettre à jour mDNSResponder
echo "Redémarrage de mDNSResponder..."
sudo launchctl kickstart -k system/com.apple.mDNSResponder
# Mettre à jour l'enregistrement NetBIOS
if [[ -n "$computer_name" ]]; then
echo "Mise à jour de l'enregistrement NetBIOS..."
defaults write /Library/Preferences/SystemConfiguration/com.apple.smb.server NetBIOSName "$computer_name"
sudo launchctl kickstart -k system/com.apple.smbd
fi
# Vider tous les caches
echo "Vidage des caches système..."
sudo dscacheutil --flushcache
sudo killall -HUP mDNSResponder
# Mettre à jour Open Directory si lié
if dsconfigldap -v >/dev/null 2>&1; then
echo "Mise à jour de l'enregistrement Open Directory..."
sudo dsconfigldap -f
fi
echo "✅ Services réseau mis à jour"
}
update_network_services
Notes de Configuration Importantes
Utilitaire de Configuration Système (scutil)
La commande scutil
gère la configuration système macOS :
- ComputerName - Nom d'appareil visible par l'utilisateur
- HostName - Nom d'hôte réseau principal
- LocalHostName - Identifiant Bonjour/mDNS
- NetBIOSName - Compatibilité réseau Windows
Bonnes Pratiques pour l'Entreprise
-
Convention de Nomenclature Standardisée
- Utiliser un format cohérent :
ORG-LOCALISATION-TYPE-SEQUENCE
- Garder les noms sous 15 caractères pour compatibilité NetBIOS
- Éviter les caractères spéciaux et espaces
- Utiliser un format cohérent :
-
Considérations Réseau
- Assurer des noms uniques dans les segments réseau
- Tester la résolution DNS après changements
- Coordonner avec les administrateurs réseau
-
Gestion de Flotte
- Implémenter un provisioning automatisé
- Maintenir des bases de données de nomenclature
- Audit de conformité régulier
- Sauvegarder la configuration avant changements
-
Implications de Sécurité
- Les noms d'appareils peuvent révéler la structure organisationnelle
- Considérer les exigences de confidentialité
- Implémenter des contrôles d'accès pour les changements de nomenclature
Dépannage des Problèmes Courants
- Changements de noms non effectifs - Redémarrer les services réseau ou redémarrer
- Conflits Bonjour - Assurer des valeurs LocalHostName uniques
- Problèmes de résolution DNS - Vider le cache et redémarrer mDNSResponder
- Problèmes réseau Windows - Vérifier la configuration du nom NetBIOS
N'oubliez pas de tester les changements de nomenclature de manière approfondie et de coordonner avec les administrateurs réseau avant l'implémentation dans votre déploiement MacFleet.