Ne pas connaître le mot de passe complique les choses, mais la solution est peut-être la suivante: est-il possible de masquer temporairement le mot de passe d'un utilisateur? (Et ensuite réinitialisez-le à ce qu'il était auparavant.)
Pour commencer:
Tout d'abord, affichez la fenêtre de connexion. Déconnectez-vous simplement de l'utilisateur actuel, utilisez le changement rapide d'utilisateur ou utilisez SSH:
cd "/ System / Library / CoreServices / Menu Extras / User.menu / Contents / Resources /"
sudo ./CGSession -suspend
Ou, pour passer immédiatement à un utilisateur spécifique, qui affichera probablement la fenêtre de connexion (cela ne fonctionne plus du tout sur mon Leopard 10.5):
sudo ./CGSession -switchToUserID 501
Ce qui est affiché maintenant dépend un peu des Préférences Système, mais supposons que ce soient les icônes des utilisateurs et leurs noms. Pour activer un nom, il faudrait taper les premières lettres. Ensuite, après Retour, l'invite de mot de passe s'affiche. Alternativement, on peut sélectionner n'importe quel nom (comme en appuyant sur la flèche vers le bas), puis appuyer sur Option-Retour pour être invité à la fois pour n'importe quel nom d' utilisateur et son mot de passe. Je ne sais pas comment on peut voir quel écran est affiché, mais gardons cela pour plus tard ...
Donc, pour sélectionner le premier nom d'utilisateur (aléatoire) et appuyez sur Option-Retour, tapez un nom d'utilisateur spécifique, appuyez sur Retour et tapez le mot de passe:
sudo osascript -e 'tell app "Événements système"
code clé 125
retour de frappe en utilisant l'option vers le bas
frappe "le nom d'utilisateur"
délai 1.0
retour de frappe
délai 1.0
frappe "le mot de passe"
délai 1.0
retour de frappe
fin dire
Ce qui précède montre une erreur qui, pour autant que je sache, ne limite pas l'utilisation:
osascript [285]: 3891612: (connectAndCheck) Les applications non fiables ne sont pas
autorisé à se connecter ou à lancer Windows Server avant la connexion.
_RegisterApplication (), Échec de l'établissement de la connexion par défaut à
le WindowServer, _CGSDefaultConnection () est NULL.
Alternativement, utilisez le script spécifique à la langue de " Script la fenêtre de connexion via Apple Remote Desktop " (peut-être qu'un jour les commentaires sur ce site montreront une meilleure solution):
dire au processus "SecurityAgent"
définir la valeur du champ de texte 1 du groupe 1 de la fenêtre 1 sur "le nom d'utilisateur"
définir la valeur du champ de texte 2 du groupe 1 de la fenêtre 1 sur "le mot de passe"
fin dire
cliquez sur le bouton "Connexion" de la fenêtre 1 du processus de candidature "SecurityAgent"
Mais le principal problème est: cela nécessite toujours le mot de passe . Cependant: aucun mot de passe n'est évidemment nécessaire lorsqu'un utilisateur a un mot de passe vide. En fait, pour les mots de passe vides, il suffit de cliquer sur l'icône d'un utilisateur. Donc, si l'envoi de touches à l'aide d'AppleScript est acceptable, alors peut-être "tout" ce qu'il reste à comprendre:
Est-il possible de masquer temporairement le mot de passe d'un utilisateur, pour permettre de démarrer (ou reprendre) la session sans connaître ce mot de passe ...?
Peut-on rendre l'AppleScript à l'abri des erreurs? Comme:
- Comment savoir si la fenêtre de connexion est visible? (peut
stat -f%Su /dev/console
peut- être aider, car cela donne lieuroot
pendant que la fenêtre de connexion est affichée)
- Comment savoir quelle fenêtre de connexion est affichée? (Comme: une montrant des icônes et des noms de connexion, ou une liste déroulante, ou peut-être seulement une invite de mot de passe si quelqu'un a choisi de passer à un utilisateur spécifique?)
- Débarrassez-vous des retards.
- Et ce message d'erreur?
(Remarque pour les tests: lors de l'utilisation du partage d'écran, il semble que la définition de la préférence Lors du contrôle des ordinateurs: Chiffrer les mots de passe et les frappes ne conserve également la connexion que lorsque la fenêtre de connexion s'affiche ou après qu'un utilisateur s'est connecté avec succès. Lors de l'utilisation de Chiffrer tout le réseau données alors mon Mac a besoin de rétablir la connexion de partage d'écran à chaque fois qu'une connexion est affichée ou un utilisateur est activée).
sudo osascript -e 'tell app "System Events" to keystroke "password" & return'
. L'écran étant verrouillé, la saisie d'un nom d'utilisateur et d'un mot de passe administratifs reprend la session de l'autre utilisateur. Mais comment démarrer une session pour n'importe quel utilisateur sans connaître le mot de passe? (Juste pour être sûr, si vous connaissez le mot de passe: une autre solution peut être le partage d'écran, qui fonctionne également pour l'écran de connexion. Vous devrez reconnecter le partage d'écran après le démarrage ou la reprise d'une session utilisateur spécifique.)su
à l'invite de commande, mais ensuite pour une session GUI. Ou tout comme lorsque l'écran est verrouillé, où la saisie d'un nom d'utilisateur et d'un mot de passe administratifs reprend la session de l'autre utilisateur.)J'ai enquêté sur cela récemment.
Mettez cela dans la pile PAM de votre application, ou testez avec sshd:
Cela vous aidera grandement à obtenir une session graphique qui est assez proche d'une session utilisateur désactivée. En particulier, il est dans le bon espace de noms bootstrap et possède les ports de bootstrap corrects (je pense). Vous pouvez vérifier la source de ce que fait pam_launchd; il utilise une bibliothèque privée d'aspect raisonnable (fonctions vproc_priv.h dans libvprop) pour appeler les routines Mach pour configurer les ports et l'espace de noms. Il correspond à tous les documents (limités) qu'Apple fournit pour les appels système dérivés de Mach.
Ensuite, vous devez définir votre ID utilisateur d'audit sur celui de l'utilisateur avec l'API BSM, sinon la fenêtre de connexion ne vous parlera pas sur Lion.
La session ressemble maintenant très près à une session désactivée si vous cochez "launchctl blist", et certains processus et services prennent bien vie (comme le pasteboard, etc.). En fait, tout sauf Finder et loginwindow est en cours d'exécution. Tant que loginwindow ne s'exécute pas, vous ne pouvez pas lancer d'application graphique et le processus de loginwindow par session est toujours généré en tant qu'enfant direct du global. Comment pousser le processus de loginwindow pour lancer une nouvelle loginwindow dans la nouvelle session? Je ne trouve pas de moyen de mettre la dernière pièce en place!
Toute aide pour compléter cette réponse a été reçue avec gratitude.
la source
l'exécution de la commande avec sudo vous permet de définir le script sur illisible par les utilisateurs standard. Ce n'est pas parfait, mais si votre administrateur est déjà compromis, le jeu est quand même terminé!
chmod ur scriptname
mon script ressemble à ceci, il fonctionne à distance lorsqu'un utilisateur est déjà en cours d'exécution, pour passer à un deuxième utilisateur via SSH (testé sur Snow Leopard 10.6.3):
la source
J'avais besoin de connecter le même utilisateur à 25 postes de travail différents, afin de faire une mise à jour logicielle. Je n'ai pas pu exécuter la commande 'osascript -e ...' de manière fiable à partir de sessions SSH, même avec les privilèges sudo. J'ai toutefois pu l'exécuter via Apple Remote Desktop. Si vous avez ARD:
J'ai été ravi de trouver les 25 Mac Minis exécutant Finder en tant qu'utilisateur, en moins d'une minute. Juste pour réitérer, avec ARD vous n'avez pas à taper le mot de passe sudo sur chaque machine. Les lignes que vous devez coller dans la boîte de dialogue de commande sont (en remplaçant un nom d'utilisateur et un mot de passe valides):
la source