0 votes

Le service OSX avec l'utilisateur personnalisé ne permet pas d'écrire les préférences Java

Ceci est la configuration :

  • OSX Yosemite
  • Service basé sur Java qui est lancé en utilisant un LaunchDaemon
  • Le service est lancé avec un utilisateur personnalisé qui est créé pendant l'installation
  • L'utilisateur a un répertoire personnel personnalisé pour sauvegarder certaines informations, comme les préférences

Voici comment l'utilisateur est créé :

DEAMON_USER="{{daemonUser}}"
HOME_DIRECTORY="{{homeDirectory}}"
SERVICE_DESCRIPTION="{{displayName}}"

# trouver le prochain UID et GID qui est en-dessous de 500, afin que nous puissions créer l'utilisateur du service
# si l'utilisateur ou le groupe existe déjà, il utilisera cet ID existant et fera quand même le reste. Nous pourrions avoir des modifications à apporter.
NEXTUID=$(ID=`dscl . -read "/Users/${DEAMON_USER}" UniqueID 2> /dev/null | awk '{print $2}'` && [ ! -z "$ID" ] && echo "$ID" || dscl . -list /Users UniqueID | awk 'BEGIN{i=0}{if($2>i&&$2<500)i=$2}END{print i+1}')
NEXTGID=$(ID=`dscl . -read "/Groups/${DEAMON_USER}" PrimaryGroupID 2> /dev/null | awk '{print $2}'` && [ ! -z "$ID" ] && echo "$ID" || dscl . -list /Groups PrimaryGroupID | awk 'BEGIN{i=0}{if($2>i&&$2<500)i=$2}END{print i+1}')

echo "Utilisera '${NEXTUID}' comme Identifiant Utilisateur et '${NEXTGID}' comme ID de groupe pour l'Utilisateur '${DEAMON_USER}'"

#########################################################################################################
dscl . -create "/Users/${DEAMON_USER}" UniqueID "${NEXTUID}"
dscl . -create "/Users/${DEAMON_USER}" PrimaryGroupID "${NEXTGID}"
dscl . -create "/Users/${DEAMON_USER}" NFSHomeDirectory "${HOME_DIRECTORY}"

# Impossible de se connecter en tant qu'utilisateur standard
dscl . -create "/Users/${DEAMON_USER}" UserShell /usr/bin/false
dscl . -create "/Users/${DEAMON_USER}" RealName "${SERVICE_DESCRIPTION} Administrateur"

# Mot de passe inutilisable pour les utilisateurs standard
dscl . -create "/Users/${DEAMON_USER}" Password \*
#########################################################################################################

#########################################################################################################
dscl . -create "/Groups/${DEAMON_USER}" PrimaryGroupID "${NEXTGID}"
# Mot de passe inutilisable pour les utilisateurs standard
dscl . -create "/Groups/${DEAMON_USER}" Password \*
#########################################################################################################

# créer le répertoire personnel
mkdir -p "${HOME_DIRECTORY}/Bibliothèque/Préférences" && chown -R "${DEAMON_USER}:${DEAMON_USER}" "${HOME_DIRECTORY}" || true

Le service crée généralement des préférences utilisateur qui sont ensuite stockées dans le répertoire ~/Bibliothèque/Préférences - dans un magasin pris en charge par plist.

Mais pas avec l'utilisateur créé ci-dessus. Les préférences ne sont jamais sauvegardées. Je sais qu'il y a un service qui garde les préférences en synchronisation avec la mémoire et le système de fichiers (il ne fonctionne pas pour le nouvel utilisateur).

La question est : qu'est-ce qui ne va pas avec Java - que faudrait-il faire pour corriger cela - ou avec la manière dont l'utilisateur système est créé.

Même un simple programme Java comme celui-ci ne déclenche pas l'écriture des préférences :

import java.util.prefs.BackingStoreException;
import java.util.prefs.Preferences;
public class prefTest {
    public static void main( String[] args ) throws BackingStoreException {
        System.out.println( System.getProperty( "user.home" ) );
        Preferences userRoot = Preferences.userRoot();
        userRoot.put( "Test", "Value" );
        userRoot.flush();
        System.out.println( userRoot.get( "Test", "DEFAULT" ) );
    }
}

Exécuter ce programme avec l'utilisateur du service produira le mauvais résultat et ne créera pas un fichier de préférences Java pour mettre à jour un existant.

1voto

Il semble que j'ai trouvé une solution par moi-même. John Keates a soulevé quelques bons points qui m'ont incité à consulter un peu plus le web.

J'ai résolu le problème en utilisant les deux lignes suivantes avec le script de création d'utilisateur :

dscl . -delete /Users/_helpdesk PasswordPolicyOptions
dscl . -delete /Users/_helpdesk AuthenticationAuthority

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X