14 votes

Comment accéder à /stockage/emulé/10 (environnement multi-utilisateurs) dans adb shell sur Android 9+ sans accès root?

J'ai configuré deux utilisateurs système Android.

$ pm list users
Users:
    UserInfo{0:Owner:13} running
    UserInfo{10:espace de sécurité:13} running
    UserInfo{999:XSpace:800010} running

Lorsque le mobile fonctionne sous Android 8.1, je peux facilement accéder à l'espace utilisateur secondaire /storage/emulated/10 dans adb shell.

Mais après avoir mis à jour vers Android 9, je ne peux plus le faire :

$ ls /storage/emulated/10
ls: /storage/emulated/10: Permission denied

Des idées sur la façon dont je peux accéder à l'espace utilisateur secondaire dans adb shell ?

Par ailleurs, mon /sdcard/ pointe toujours vers l'espace du premier utilisateur /storage/emulated/0 dans adb shell peu importe l'utilisateur actuel de mon mobile. La connexion adb shell reste la même lorsque je change d'utilisateur dans l'interface mobile.

Lorsque je change d'utilisateur au niveau de l'interface mobile, ma connexion adb reste la même. Et je vois que l'utilisateur actuel change avec la commande suivante :

$ dumpsys activity | grep mCurrentUser
    mCurrentUser=0
$ dumpsys activity | grep mCurrentUser
    mCurrentUser=10

15voto

Irfan Latif Points 16863

POURQUOI ADB SE VOIT-IL REFUSER L'ACCÈS AU STOCKAGE MULTI-UTILISATEUR ?

L'accès à /storage/emulated/10 est refusé depuis adb shell en raison de ce changement dans Android 9 :

Ajout du support "default_normal" à vold.
Ce nouveau drapeau isole chaque utilisateur sur un appareil multi-utilisateur pour des raisons de sécurité.

La fonction de l'option de montage default_normal dans sdcardfs est expliquée ici :

_L'option default_normal fait en sorte que les montages avec l'ID de groupe configuré à AID_SDCARD_RW aient des IDs de groupe spécifiques à l'utilisateur, comme dans le cas normal._

Toute l'histoire concerne l'émulation du système de fichiers Android afin d'avoir un répertoire sans permission (/sdcard) qui permet le partage de fichiers entre plusieurs utilisateurs UNIX (applications). Cela est réalisé à travers des espaces de nom de montage et différents VIEWs de /data/media montés dans /mnt/runtime/. Les applications appartenant à l'utilisateur secondaire ainsi qu'à l'utilisateur principal ont des espaces de nom de montage isolés. Pour plus de détails, veuillez consulter Qu'est-ce que l'UID “u#_everybody” ? et Qu'est-ce que /storage/emulated/0/ ?.

Au fait, mon /sdcard/ pointe toujours vers l'espace du premier utilisateur /storage/emulated/0 dans adb shell peu importe qui est mon utilisateur actuel dans l'interface mobile.

[...]

COMMENT ACCÉDER AUX FICHIERS DE PLUSIEURS UTILISATEURS DEPUIS ADB ?

AVEC ACCÈS ROOT :

Vous pouvez monter le système de fichiers émulé sans l'option default_normal :

~# umount /mnt/runtime/*/emulated
~# /system/bin/sdcard -u 1023 -g 1023 -m -w -G /data/media emulated

Ou pour rendre les modifications permanentes, remplacez le binaire sdcard par un script shell :

~# cd /system/bin/; mv sdcard sdcard.bin; touch sdcard
~# chown 0.2000 sdcard*; chmod 0755 sdcard*
~# chcon u:object_r:system_file:s0 sdcard
~# chcon u:object_r:sdcardd_exec:s0 sdcard.bin

/system/bin/sdcard (supprimer l'argument -i passé par vold) :

#!/system/bin/sh

set -- $(echo "$*" | sed 's/-i //')
/system/bin/sdcard.bin $*

Après le redémarrage, vous devriez être en mesure de lire les fichiers dans /storage/emulated/10 depuis adb shell.

SANS ACCÈS ROOT :

Sur Android 9+, l'accès au niveau du système de fichiers aux utilisateurs/profiles secondaires n'est pas possible depuis adb sur les ROMs user (c'est-à-dire sans root). Seule l'interaction à travers des commandes adb prenant en charge l'option --user (comme am, pm, content, etc.) est possible. Documenté dans Ce qu'apporte Android 9 aux applications d'entreprise :

"Pour protéger les données professionnelles dans le profil professionnel, l'outil Android Debug Bridge (adb) ne peut pas accéder aux répertoires et fichiers du profil professionnel."

[...]

1 votes

Merci beaucoup pour cette réponse. Je l'ai upvotée car elle fournit une explication très détaillée sur ce problème. Mais comme je veux accéder au répertoire sans accès root, je ne peux pas le marquer comme réponse pour l'instant. En théorie, je connais le mot de passe du 2ème utilisateur (je suis le 2ème utilisateur), je devrais être en mesure d'accéder à mes propres fichiers/photos. S'il n'y a aucun moyen d'y parvenir, Google a fait quelque chose de très mal ici. Merci.

0 votes

@sgon00 personnellement, je n'utilise ni adb pour le transfert de données, ni les profils de travail. De plus, je ne suis pas sûr de la position de Google sur cette question. Mais à mon avis, si les fichiers appartenant à un utilisateur secondaire sont accessibles à l'utilisateur principal (via adb ou tout autre moyen, sauf via l'application Contrôleur des politiques de périphérique/Travail), cela annule tout l'intérêt du profil de travail. Notez que les profils de travail ne servent pas à utiliser des applications en double, mais à isoler. Ainsi, cette isolation renforcée dans Android 9 est justifiée. Je voulais écrire quelques lignes à ce sujet dans ma réponse, mais compte tenu de la longueur de la réponse, je ne l'ai pas fait.

0 votes

Je viens de voir cette bonne réponse. Donc je ne peux pas faire mkdir vers emulated/10 aussi ?

0voto

alex alex Points 1

Le dossier partagé pour tous les utilisateurs est /storage/emulated/*/Android/obb

* = identifiant utilisateur

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X