Gestion des Comptes Utilisateurs sur macOS
Maîtrisez la création et la gestion des comptes utilisateurs sur vos appareils MacFleet en utilisant des outils en ligne de commande puissants. Ce tutoriel couvre la création d'utilisateurs administrateurs et standards, la gestion des mots de passe, la configuration des comptes et la gestion avancée du cycle de vie des utilisateurs pour les déploiements en entreprise.
Comprendre la Gestion des Utilisateurs macOS
macOS fournit plusieurs outils en ligne de commande pour la gestion des comptes utilisateurs :
sysadminctl
- Outil moderne de gestion des comptes utilisateurs (macOS 10.10+)dscl
- Utilitaire en ligne de commande des services d'annuaire pour les opérations avancéespasswd
- Gestion et changement des mots de passeid
- Affichage des informations utilisateur et groupewhoami
- Identification de l'utilisateur actuel
Création Basique de Comptes Utilisateurs
Créer un Compte Utilisateur Administrateur
#!/bin/sh
# Définir la variable d'environnement PATH
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
# Configuration utilisateur administrateur
USERNAME="Daniel"
FULLNAME="Daniel.Hector"
PASSWORD="One@Two#8"
PASSWORDHINT="One to Eight"
# Créer un compte utilisateur administrateur
sysadminctl -addUser "$USERNAME" -fullName "$FULLNAME" -password "$PASSWORD" -hint "$PASSWORDHINT" -admin
echo "Compte utilisateur administrateur '$USERNAME' créé avec succès"
Créer un Compte Utilisateur Standard
#!/bin/sh
# Définir la variable d'environnement PATH
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
# Configuration utilisateur standard
USERNAME="Daniel"
FULLNAME="Daniel.Hector"
PASSWORD="One@Two#8"
PASSWORDHINT="One to Eight"
# Créer un compte utilisateur standard (pas de flag -admin)
sysadminctl -addUser "$USERNAME" -fullName "$FULLNAME" -password "$PASSWORD" -hint "$PASSWORDHINT"
echo "Compte utilisateur standard '$USERNAME' créé avec succès"
Création d'Utilisateur Améliorée avec Validation
#!/bin/bash
# Création d'utilisateur améliorée avec validation
create_user_account() {
local username="$1"
local fullname="$2"
local password="$3"
local hint="$4"
local is_admin="${5:-false}"
# Valider les entrées
if [[ -z "$username" || -z "$fullname" || -z "$password" ]]; then
echo "Erreur : Le nom d'utilisateur, le nom complet et le mot de passe sont requis"
return 1
fi
# Vérifier si l'utilisateur existe déjà
if id "$username" &>/dev/null; then
echo "Erreur : L'utilisateur '$username' existe déjà"
return 1
fi
# Définir l'environnement PATH
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
# Construire la commande sysadminctl
local cmd="sysadminctl -addUser \"$username\" -fullName \"$fullname\" -password \"$password\""
if [[ -n "$hint" ]]; then
cmd="$cmd -hint \"$hint\""
fi
if [[ "$is_admin" == "true" ]]; then
cmd="$cmd -admin"
echo "Création d'un utilisateur administrateur : $username"
else
echo "Création d'un utilisateur standard : $username"
fi
# Exécuter la création d'utilisateur
if eval "$cmd"; then
echo "✓ Utilisateur '$username' créé avec succès"
# Afficher les informations utilisateur
echo "Détails de l'utilisateur :"
id "$username"
return 0
else
echo "✗ Échec de la création de l'utilisateur '$username'"
return 1
fi
}
# Exemples d'utilisation
create_user_account "daniel" "Daniel Hector" "SecurePass123!" "Indice de mot de passe" "true"
create_user_account "jane" "Jane Smith" "UserPass456!" "Autre indice" "false"
Gestion Avancée des Utilisateurs
Création d'Utilisateurs en Lot
#!/bin/bash
# Création d'utilisateurs en lot à partir de configuration
batch_create_users() {
local config_file="$1"
if [[ ! -f "$config_file" ]]; then
echo "Erreur : Fichier de configuration introuvable : $config_file"
return 1
fi
echo "=== Création d'Utilisateurs en Lot ==="
local success_count=0
local error_count=0
# Lire le fichier de configuration (format : username,fullname,password,hint,admin)
while IFS=',' read -r username fullname password hint is_admin; do
# Ignorer les lignes vides et les commentaires
[[ -z "$username" || "$username" =~ ^# ]] && continue
echo "Traitement de l'utilisateur : $username"
if create_user_account "$username" "$fullname" "$password" "$hint" "$is_admin"; then
((success_count++))
else
((error_count++))
fi
echo "---"
done < "$config_file"
echo "Création en lot terminée :"
echo "✓ Succès : $success_count utilisateurs"
echo "✗ Erreurs : $error_count utilisateurs"
}
# Créer un fichier de configuration exemple
create_user_config() {
local config_file="/tmp/users_config.csv"
cat > "$config_file" << EOF
# Format : username,fullname,password,hint,admin(true/false)
daniel,Daniel Hector,SecurePass123!,Indice de mot de passe,true
jane,Jane Smith,UserPass456!,Autre indice,false
alex,Alex Johnson,TempPass789!,Mot de passe temporaire,false
admin,Administrateur Système,AdminPass000!,Accès administrateur,true
EOF
echo "Configuration exemple créée : $config_file"
echo "$config_file"
}
# Utilisation
config_file=$(create_user_config)
batch_create_users "$config_file"
Modification de Comptes Utilisateurs
#!/bin/bash
# Modifier les comptes utilisateurs existants
modify_user_account() {
local username="$1"
local action="$2"
local value="$3"
# Vérifier que l'utilisateur existe
if ! id "$username" &>/dev/null; then
echo "Erreur : L'utilisateur '$username' n'existe pas"
return 1
fi
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
case "$action" in
"password")
echo "Changement de mot de passe pour l'utilisateur : $username"
if sysadminctl -resetPasswordFor "$username" -newPassword "$value"; then
echo "✓ Mot de passe changé avec succès"
else
echo "✗ Échec du changement de mot de passe"
return 1
fi
;;
"fullname")
echo "Changement du nom complet pour l'utilisateur : $username"
if dscl . -change "/Users/$username" RealName "$(dscl . -read "/Users/$username" RealName | cut -d: -f2 | xargs)" "$value"; then
echo "✓ Nom complet changé en : $value"
else
echo "✗ Échec du changement de nom complet"
return 1
fi
;;
"admin")
if [[ "$value" == "true" ]]; then
echo "Attribution des privilèges administrateur à : $username"
if dseditgroup -o edit -a "$username" -t user admin; then
echo "✓ Privilèges administrateur attribués"
else
echo "✗ Échec de l'attribution des privilèges administrateur"
return 1
fi
else
echo "Suppression des privilèges administrateur de : $username"
if dseditgroup -o edit -d "$username" -t user admin; then
echo "✓ Privilèges administrateur supprimés"
else
echo "✗ Échec de la suppression des privilèges administrateur"
return 1
fi
fi
;;
"enable")
echo "Activation du compte utilisateur : $username"
if dscl . -create "/Users/$username" AuthenticationAuthority; then
echo "✓ Compte utilisateur activé"
else
echo "✗ Échec de l'activation du compte utilisateur"
return 1
fi
;;
"disable")
echo "Désactivation du compte utilisateur : $username"
if dscl . -delete "/Users/$username" AuthenticationAuthority; then
echo "✓ Compte utilisateur désactivé"
else
echo "✗ Échec de la désactivation du compte utilisateur"
return 1
fi
;;
*)
echo "Erreur : Action inconnue '$action'"
echo "Actions disponibles : password, fullname, admin, enable, disable"
return 1
;;
esac
}
# Exemples d'utilisation
modify_user_account "daniel" "password" "NewSecurePass123!"
modify_user_account "jane" "admin" "true"
modify_user_account "alex" "fullname" "Alexander Johnson"
Suppression de Comptes Utilisateurs
#!/bin/bash
# Supprimer les comptes utilisateurs avec options
delete_user_account() {
local username="$1"
local delete_home="${2:-true}"
local backup_home="${3:-false}"
# Vérifier que l'utilisateur existe
if ! id "$username" &>/dev/null; then
echo "Erreur : L'utilisateur '$username' n'existe pas"
return 1
fi
# Empêcher la suppression d'utilisateurs système critiques
local system_users=("root" "daemon" "nobody" "_www" "_mysql" "_postgresql")
for sys_user in "${system_users[@]}"; do
if [[ "$username" == "$sys_user" ]]; then
echo "Erreur : Impossible de supprimer l'utilisateur système '$username'"
return 1
fi
done
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
echo "Préparation de la suppression de l'utilisateur : $username"
# Sauvegarder le répertoire home si demandé
if [[ "$backup_home" == "true" ]]; then
local backup_dir="/var/backups/deleted_users"
local timestamp=$(date +%Y%m%d_%H%M%S)
local backup_path="$backup_dir/${username}_${timestamp}.tar.gz"
mkdir -p "$backup_dir"
echo "Sauvegarde du répertoire home vers : $backup_path"
if tar -czf "$backup_path" -C "/Users" "$username" 2>/dev/null; then
echo "✓ Répertoire home sauvegardé"
else
echo "⚠ Attention : Échec de la sauvegarde du répertoire home"
fi
fi
# Supprimer le compte utilisateur
local delete_cmd="sysadminctl -deleteUser \"$username\""
if [[ "$delete_home" == "true" ]]; then
delete_cmd="$delete_cmd -secure"
echo "Suppression de l'utilisateur et du répertoire home..."
else
echo "Suppression du compte utilisateur uniquement..."
fi
if eval "$delete_cmd"; then
echo "✓ Utilisateur '$username' supprimé avec succès"
return 0
else
echo "✗ Échec de la suppression de l'utilisateur '$username'"
return 1
fi
}
# Exemples d'utilisation
delete_user_account "testuser" "true" "true" # Supprimer avec home, sauvegarder d'abord
delete_user_account "tempuser" "false" "false" # Supprimer utilisateur seulement, pas de sauvegarde
Système de Gestion d'Utilisateurs en Entreprise
#!/bin/bash
# Outil de Gestion d'Utilisateurs MacFleet
# Gestion complète des comptes utilisateurs pour les appareils de flotte
# Configuration
SCRIPT_VERSION="1.0.0"
LOG_FILE="/var/log/macfleet_users.log"
REPORT_DIR="/etc/macfleet/reports/users"
CONFIG_DIR="/etc/macfleet/users"
BACKUP_DIR="/var/backups/macfleet_users"
# Créer les répertoires s'ils n'existent pas
mkdir -p "$REPORT_DIR" "$CONFIG_DIR" "$BACKUP_DIR"
# Catégories de comptes utilisateurs
declare -A USER_CATEGORIES=(
["administrator"]="admin,full_privileges,system_access"
["developer"]="standard,sudo_group,development_access"
["standard_user"]="standard,basic_privileges,user_access"
["service_account"]="standard,no_login,service_access"
["temporary_user"]="standard,limited_time,restricted_access"
["guest_user"]="standard,guest_privileges,temporary_access"
["kiosk_user"]="standard,kiosk_mode,restricted_access"
["backup_operator"]="standard,backup_privileges,system_access"
["monitoring_user"]="standard,read_only,monitoring_access"
["deployment_user"]="admin,deployment_privileges,automated_access"
)
# Politiques de gestion d'utilisateurs
declare -A USER_POLICIES=(
["password_strength"]="minimum_8_chars,mixed_case,numbers,special_chars"
["password_expiry"]="90_days,180_days,365_days,never"
["account_lockout"]="3_attempts,5_attempts,10_attempts,disabled"
["session_timeout"]="15_minutes,30_minutes,60_minutes,4_hours"
["home_directory"]="local_only,network_shared,encrypted,no_home"
["shell_access"]="/bin/bash,/bin/zsh,/usr/bin/false,/sbin/nologin"
)
# Fonction de journalisation
log_action() {
local message="$1"
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$timestamp] $message" | tee -a "$LOG_FILE"
}
# Création d'utilisateur améliorée avec fonctionnalités d'entreprise
create_enterprise_user() {
local username="$1"
local fullname="$2"
local password="$3"
local category="${4:-standard_user}"
local custom_options="$5"
log_action "Création d'utilisateur d'entreprise : $username (Catégorie : $category)"
# Valider les entrées
if [[ -z "$username" || -z "$fullname" || -z "$password" ]]; then
log_action "ERREUR : Le nom d'utilisateur, le nom complet et le mot de passe sont requis"
return 1
fi
# Vérifier si l'utilisateur existe déjà
if id "$username" &>/dev/null; then
log_action "ERREUR : L'utilisateur '$username' existe déjà"
return 1
fi
# Valider la force du mot de passe
if ! validate_password_strength "$password"; then
log_action "ERREUR : Le mot de passe ne respecte pas les exigences de force"
return 1
fi
# Générer un UID unique
local new_uid=$(get_next_available_uid)
# Créer un compte utilisateur basé sur la catégorie
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
local is_admin="false"
local shell="/bin/bash"
local home_dir="/Users/$username"
# Analyser la configuration de catégorie
IFS=',' read -ra CATEGORY_PARTS <<< "${USER_CATEGORIES[$category]}"
local user_type="${CATEGORY_PARTS[0]}"
local privileges="${CATEGORY_PARTS[1]}"
local access_level="${CATEGORY_PARTS[2]}"
[[ "$user_type" == "admin" ]] && is_admin="true"
[[ "$privileges" == "no_login" ]] && shell="/usr/bin/false"
# Créer le compte utilisateur
local create_cmd="sysadminctl -addUser \"$username\" -fullName \"$fullname\" -password \"$password\" -UID \"$new_uid\""
if [[ "$is_admin" == "true" ]]; then
create_cmd="$create_cmd -admin"
fi
if eval "$create_cmd"; then
log_action "SUCCÈS : Utilisateur '$username' créé avec UID $new_uid"
# Appliquer des configurations supplémentaires
configure_user_environment "$username" "$category" "$custom_options"
# Générer un rapport utilisateur
local report_file="$REPORT_DIR/user_creation_${username}_$(date +%Y%m%d_%H%M%S).json"
generate_user_report "$username" "$report_file"
echo "$report_file"
return 0
else
log_action "ERREUR : Échec de la création de l'utilisateur '$username'"
return 1
fi
}
# Validation de la force du mot de passe
validate_password_strength() {
local password="$1"
local min_length=8
# Vérifier la longueur minimale
if [[ ${#password} -lt $min_length ]]; then
echo "Le mot de passe doit contenir au moins $min_length caractères"
return 1
fi
# Vérifier la présence d'une majuscule
if [[ ! "$password" =~ [A-Z] ]]; then
echo "Le mot de passe doit contenir au moins une majuscule"
return 1
fi
# Vérifier la présence d'une minuscule
if [[ ! "$password" =~ [a-z] ]]; then
echo "Le mot de passe doit contenir au moins une minuscule"
return 1
fi
# Vérifier la présence d'un chiffre
if [[ ! "$password" =~ [0-9] ]]; then
echo "Le mot de passe doit contenir au moins un chiffre"
return 1
fi
# Vérifier la présence d'un caractère spécial
if [[ ! "$password" =~ [^a-zA-Z0-9] ]]; then
echo "Le mot de passe doit contenir au moins un caractère spécial"
return 1
fi
return 0
}
# Obtenir le prochain UID disponible
get_next_available_uid() {
local start_uid=1000
local max_uid=65533
for ((uid=start_uid; uid<=max_uid; uid++)); do
if ! id -u "$uid" &>/dev/null; then
echo "$uid"
return 0
fi
done
echo "65534" # UID de secours
}
# Configurer l'environnement utilisateur basé sur la catégorie
configure_user_environment() {
local username="$1"
local category="$2"
local custom_options="$3"
log_action "Configuration de l'environnement pour l'utilisateur : $username (Catégorie : $category)"
case "$category" in
"developer")
# Ajouter au groupe développeur
dseditgroup -o create -q developer 2>/dev/null
dseditgroup -o edit -a "$username" -t user developer
# Accorder l'accès sudo pour le développement
echo "$username ALL=(ALL) NOPASSWD: /usr/bin/xcodebuild, /usr/local/bin/brew" > "/etc/sudoers.d/$username"
;;
"service_account")
# Désactiver le shell de connexion
dscl . -create "/Users/$username" UserShell /usr/bin/false
# Masquer de la fenêtre de connexion
dscl . -create "/Users/$username" IsHidden 1
;;
"kiosk_user")
# Configurer l'environnement kiosk
setup_kiosk_user "$username"
;;
"temporary_user")
# Définir l'expiration du compte (30 jours)
local expiry_date=$(date -v +30d +%Y-%m-%d)
dscl . -create "/Users/$username" AccountExpires "$expiry_date"
;;
esac
# Appliquer les options personnalisées si fournies
if [[ -n "$custom_options" ]]; then
apply_custom_user_options "$username" "$custom_options"
fi
}
# Configurer l'environnement utilisateur kiosk
setup_kiosk_user() {
local username="$1"
local kiosk_dir="/Users/$username/Desktop"
# Créer l'environnement desktop kiosk
mkdir -p "$kiosk_dir"
# Créer le plist launchd pour le mode kiosk
cat > "/Library/LaunchAgents/com.macfleet.kiosk.$username.plist" << EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.macfleet.kiosk.$username</string>
<key>ProgramArguments</key>
<array>
<string>/System/Applications/Safari.app/Contents/MacOS/Safari</string>
<string>--kiosk</string>
<string>https://company-portal.example.com</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>UserName</key>
<string>$username</string>
</dict>
</plist>
EOF
chown "$username:staff" "/Library/LaunchAgents/com.macfleet.kiosk.$username.plist"
chmod 644 "/Library/LaunchAgents/com.macfleet.kiosk.$username.plist"
}
# Générer un rapport utilisateur
generate_user_report() {
local username="$1"
local report_file="$2"
# Obtenir les informations utilisateur
local user_info=$(id "$username")
local user_groups=$(groups "$username")
local home_dir=$(dscl . -read "/Users/$username" NFSHomeDirectory | cut -d: -f2 | xargs)
local shell=$(dscl . -read "/Users/$username" UserShell | cut -d: -f2 | xargs)
local real_name=$(dscl . -read "/Users/$username" RealName | cut -d: -f2 | xargs)
cat > "$report_file" << EOF
{
"user_report": {
"username": "$username",
"timestamp": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
"hostname": "$(hostname)",
"script_version": "$SCRIPT_VERSION",
"user_details": {
"real_name": "$real_name",
"home_directory": "$home_dir",
"shell": "$shell",
"user_info": "$user_info",
"groups": "$user_groups"
},
"creation_status": "success",
"security_settings": {
"password_policy_applied": true,
"account_restrictions": [],
"group_memberships": []
}
}
}
EOF
log_action "Rapport utilisateur généré : $report_file"
}
# Gestion d'utilisateurs de flotte
manage_fleet_users() {
local action="$1"
local target_spec="$2"
local options="$3"
log_action "Gestion d'utilisateurs de flotte : $action"
case "$action" in
"audit")
audit_fleet_users "$target_spec"
;;
"sync")
sync_fleet_users "$target_spec" "$options"
;;
"cleanup")
cleanup_fleet_users "$target_spec" "$options"
;;
"report")
generate_fleet_user_report
;;
esac
}
# Auditer tous les utilisateurs du système
audit_fleet_users() {
local filter_pattern="$1"
echo "=== Audit des Utilisateurs de Flotte ==="
local audit_report="$REPORT_DIR/fleet_user_audit_$(date +%Y%m%d_%H%M%S).json"
cat > "$audit_report" << EOF
{
"audit_info": {
"timestamp": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
"hostname": "$(hostname)",
"filter_pattern": "$filter_pattern"
},
"user_accounts": [],
"security_summary": {},
"recommendations": []
}
EOF
# Obtenir tous les utilisateurs locaux
local users=($(dscl . -list /Users | grep -v "^_" | grep -v "daemon\|nobody\|root"))
for user in "${users[@]}"; do
if [[ -z "$filter_pattern" || "$user" =~ $filter_pattern ]]; then
# Obtenir les informations utilisateur détaillées
local uid=$(id -u "$user" 2>/dev/null)
local gid=$(id -g "$user" 2>/dev/null)
local groups=$(groups "$user" 2>/dev/null)
local home=$(dscl . -read "/Users/$user" NFSHomeDirectory 2>/dev/null | cut -d: -f2 | xargs)
local shell=$(dscl . -read "/Users/$user" UserShell 2>/dev/null | cut -d: -f2 | xargs)
local last_login=$(last -1 "$user" | head -1 | awk '{print $4, $5, $6, $7}')
# Vérifier si l'utilisateur est administrateur
local is_admin="false"
if dseditgroup -o checkmember -m "$user" admin &>/dev/null; then
is_admin="true"
fi
# Ajouter au rapport
jq --arg user "$user" \
--arg uid "$uid" \
--arg gid "$gid" \
--arg groups "$groups" \
--arg home "$home" \
--arg shell "$shell" \
--arg last_login "$last_login" \
--arg is_admin "$is_admin" \
'.user_accounts += [{
"username": $user,
"uid": $uid,
"gid": $gid,
"groups": $groups,
"home_directory": $home,
"shell": $shell,
"last_login": $last_login,
"is_admin": ($is_admin == "true")
}]' "$audit_report" > "${audit_report}.tmp" && mv "${audit_report}.tmp" "$audit_report"
fi
done
# Générer un résumé de sécurité
local total_users=$(echo "${users[@]}" | wc -w)
local admin_users=$(dseditgroup -o checkmember -m "" admin 2>/dev/null | wc -l)
local inactive_users=0
# Vérifier les utilisateurs inactifs (pas de connexion depuis 90 jours)
for user in "${users[@]}"; do
local last_login_timestamp=$(last -1 "$user" | head -1 | awk '{print $4, $5, $6, $7}')
if [[ -n "$last_login_timestamp" ]]; then
local days_since_login=$(( ($(date +%s) - $(date -j -f "%b %d %H:%M" "$last_login_timestamp" +%s 2>/dev/null || echo 0)) / 86400 ))
if [[ $days_since_login -gt 90 ]]; then
((inactive_users++))
fi
fi
done
jq --argjson total "$total_users" \
--argjson admins "$admin_users" \
--argjson inactive "$inactive_users" \
'.security_summary = {
"total_users": $total,
"admin_users": $admins,
"inactive_users": $inactive,
"security_score": (100 - ($admins * 10) - ($inactive * 5))
}' "$audit_report" > "${audit_report}.tmp" && mv "${audit_report}.tmp" "$audit_report"
log_action "Audit des utilisateurs de flotte terminé : $audit_report"
echo "$audit_report"
}
# Fonction d'exécution principale
main() {
local action="${1:-create}"
local username="${2:-}"
local fullname="${3:-}"
local password="${4:-}"
local options="${5:-}"
log_action "=== Gestion d'Utilisateurs MacFleet Démarrée ==="
log_action "Action : $action, Utilisateur : $username"
case "$action" in
"create")
if [[ -z "$username" || -z "$fullname" || -z "$password" ]]; then
echo "Utilisation : $0 create <username> <fullname> <password> [category]"
exit 1
fi
create_enterprise_user "$username" "$fullname" "$password" "$options"
;;
"modify")
if [[ -z "$username" || -z "$fullname" ]]; then
echo "Utilisation : $0 modify <username> <action> <value>"
exit 1
fi
modify_user_account "$username" "$fullname" "$password"
;;
"delete")
if [[ -z "$username" ]]; then
echo "Utilisation : $0 delete <username> [delete_home] [backup_home]"
exit 1
fi
delete_user_account "$username" "$fullname" "$password"
;;
"audit")
audit_fleet_users "$username"
;;
"fleet")
manage_fleet_users "$username" "$fullname" "$password"
;;
"help")
echo "Utilisation : $0 [action] [options...]"
echo "Actions :"
echo " create <username> <fullname> <password> [category] - Créer utilisateur"
echo " modify <username> <action> <value> - Modifier utilisateur"
echo " delete <username> [delete_home] [backup_home] - Supprimer utilisateur"
echo " audit [pattern] - Auditer utilisateurs"
echo " fleet <action> [pattern] [options] - Gestion de flotte"
echo " help - Afficher cette aide"
echo ""
echo "Catégories : ${!USER_CATEGORIES[*]}"
;;
*)
log_action "ERREUR : Action inconnue : $action"
exit 1
;;
esac
log_action "=== Gestion d'utilisateurs terminée ==="
}
# Exécuter la fonction principale
main "$@"
Tâches Communes de Gestion d'Utilisateurs
Affichage des Informations Utilisateur
#!/bin/bash
# Afficher des informations complètes sur l'utilisateur
show_user_info() {
local username="$1"
if ! id "$username" &>/dev/null; then
echo "L'utilisateur '$username' n'existe pas"
return 1
fi
echo "=== Informations Utilisateur : $username ==="
# Informations utilisateur de base
echo "Informations ID Utilisateur :"
id "$username"
# Appartenance aux groupes
echo -e "\nAppartenance aux Groupes :"
groups "$username"
# Informations répertoire home
local home_dir=$(dscl . -read "/Users/$username" NFSHomeDirectory | cut -d: -f2 | xargs)
echo -e "\nRépertoire Home : $home_dir"
if [[ -d "$home_dir" ]]; then
echo "Taille du répertoire home : $(du -sh "$home_dir" | cut -f1)"
fi
# Shell de connexion
local shell=$(dscl . -read "/Users/$username" UserShell | cut -d: -f2 | xargs)
echo -e "\nShell de Connexion : $shell"
# Statut du compte
echo -e "\nStatut du Compte :"
if dscl . -read "/Users/$username" AuthenticationAuthority &>/dev/null; then
echo "Compte : Activé"
else
echo "Compte : Désactivé"
fi
# Statut administrateur
if dseditgroup -o checkmember -m "$username" admin &>/dev/null; then
echo "Privilèges Administrateur : Oui"
else
echo "Privilèges Administrateur : Non"
fi
# Dernière connexion
echo -e "\nDernière Connexion :"
last -1 "$username" | head -1
}
# Utilisation
show_user_info "daniel"
Gestion des Mots de Passe
#!/bin/bash
# Gestion complète des mots de passe
manage_user_password() {
local username="$1"
local action="$2"
local new_password="$3"
if ! id "$username" &>/dev/null; then
echo "L'utilisateur '$username' n'existe pas"
return 1
fi
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
case "$action" in
"change")
if [[ -z "$new_password" ]]; then
echo "Nouveau mot de passe requis"
return 1
fi
if ! validate_password_strength "$new_password"; then
return 1
fi
if sysadminctl -resetPasswordFor "$username" -newPassword "$new_password"; then
echo "Mot de passe changé avec succès pour l'utilisateur : $username"
# Forcer le changement de mot de passe à la prochaine connexion (optionnel)
# pwpolicy -u "$username" -setpolicy "newPasswordRequired=1"
else
echo "Échec du changement de mot de passe"
return 1
fi
;;
"expire")
echo "Expiration du mot de passe pour l'utilisateur : $username"
if pwpolicy -u "$username" -setpolicy "newPasswordRequired=1"; then
echo "Mot de passe expiré - l'utilisateur doit le changer à la prochaine connexion"
else
echo "Échec de l'expiration du mot de passe"
return 1
fi
;;
"unlock")
echo "Déverrouillage du compte pour l'utilisateur : $username"
if pwpolicy -u "$username" -setpolicy "isDisabled=0"; then
echo "Compte déverrouillé avec succès"
else
echo "Échec du déverrouillage du compte"
return 1
fi
;;
*)
echo "Action de mot de passe inconnue : $action"
echo "Actions disponibles : change, expire, unlock"
return 1
;;
esac
}
# Utilisation
manage_user_password "daniel" "change" "NewSecurePassword123!"
Gestion des Groupes
#!/bin/bash
# Gestion des groupes d'utilisateurs
manage_user_groups() {
local username="$1"
local action="$2"
local group_name="$3"
if ! id "$username" &>/dev/null; then
echo "L'utilisateur '$username' n'existe pas"
return 1
fi
case "$action" in
"add")
echo "Ajout de l'utilisateur '$username' au groupe '$group_name'"
if dseditgroup -o edit -a "$username" -t user "$group_name"; then
echo "✓ Utilisateur ajouté au groupe avec succès"
else
echo "✗ Échec de l'ajout de l'utilisateur au groupe"
return 1
fi
;;
"remove")
echo "Suppression de l'utilisateur '$username' du groupe '$group_name'"
if dseditgroup -o edit -d "$username" -t user "$group_name"; then
echo "✓ Utilisateur supprimé du groupe avec succès"
else
echo "✗ Échec de la suppression de l'utilisateur du groupe"
return 1
fi
;;
"list")
echo "Groupes pour l'utilisateur '$username' :"
groups "$username"
;;
*)
echo "Action de groupe inconnue : $action"
echo "Actions disponibles : add, remove, list"
return 1
;;
esac
}
# Utilisation
manage_user_groups "daniel" "add" "developers"
manage_user_groups "daniel" "list"
Notes Importantes
- Privilèges administrateur requis pour la création et modification d'utilisateurs
- Politiques de mots de passe doivent imposer des mots de passe forts pour la sécurité
- Validation utilisateur - Toujours vérifier les entrées avant de créer des comptes
- Permissions du répertoire home - Assurer la propriété et permissions appropriées
- Sauvegarde des données utilisateur avant les opérations de suppression
- Tester les scripts sur des comptes individuels avant le déploiement en flotte
- Surveiller les activités utilisateur pour la conformité de sécurité