Bonjour,
tout est dans le titre. Comment peut-on savoir si le script Python a été lancé ou non en mode Super Utilisateur ?
Existe-t-il une solution marchant sous Linux, Windaube et Mac O$ ?
Bonjour,
tout est dans le titre. Comment peut-on savoir si le script Python a été lancé ou non en mode Super Utilisateur ?
Existe-t-il une solution marchant sous Linux, Windaube et Mac O$ ?
Salut,
Sous les U*X, le group id devrait donner l'information.
Pour Windows et les modèles de sécurité "modernes", le droit adhoc a été donné ou pas à l'utilisateur, au process,...
Dans ce cas, vous avez aussi une primitive système permettant de savoir si vous avez le droit d'accès/modification de l'objet X.
Normalement, try...except... et un message d'erreur "suffisent".
Pourquoi voulez vous faire plus que "good enough"?
- W
Sous linux/unix/macOsX, tu vas avoir l'info via os.getuid.
Mais attention : 'super utilisateur', c'est vague. Sous MacOSX, beaucoup de taches d'administration se font sous le username 'admin' et pas forcément 'root'.
De plus, getuid te retourne un entier : 0 pour root, mais pour admin ? (pas de macosx sous la main, là, tout de suite). Si, pour admin, ça peut varier d'une machine à l'autre, il te faudra faire l'association entre le no retourné et le username 'admin'
Et comment réagit os.getuid lors d'un lancement via "sudo" ? faut essayer
sous ubuntu :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 plx@satellite:~$ more getuid.py import os print os.getuid() plx@satellite:~$ plx@satellite:~$ python getuid.py 1000 plx@satellite:~$ id uid=1000(plx) gid=1000(plx) groupes=1000(plx),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),110(lpadmin),123(sambashare) plx@satellite:~$ plx@satellite:~$ sudo python getuid.py [sudo] password for plx: 0 plx@satellite:~$
Bonjour,
Dans les linux traditionnels, root a un uid de 0. Mais il me semble que dans les OS actuels, la mode est plutôt à attribuer ou pas les privilèges d'administrateur à un utilisateur "normal". Ce qui explique que sous Windows, Linux Ubuntu (et dérivés) et Mac OX X, les tâches d'administrations ne demande que le mot de passe utilisateur.
Sous Ubuntu, je crois que les privilèges administrateur sont donnés à un utilisateur "normal" par son appartenance au groupe "sudo", et c'est le fichier /etc/sudoer qui définit les droits.
Avec Ubuntu, il faudrait donc tester si l'utilisateur est soit root (qui peut exister sous Ubuntu), soit appartient au groupe sudo.
Pour Windows ou Mac OS X je ne sais pas, mais il y a peut-être des astuces similaires.
Bonsoir,
Pourquoi ne pas tester "l'interdit" ?
Il suffit de définir ce qui est 'only root' pour chaque système et try/except passeras très bien (Bien que... sudo rm /root/test.txt).touch /root/test.txt
touch: impossible de faire un touch «/root/test.txt»: Permission non accordée
@+
Merci pour vos réponses.
A la base je cherchais une méthode propre en espérant qu'un module ad hoc proposerait cela.
Pas idiot car là on peut passer par subprocess pour voir si une erreur est renvoyée. Dans ce cas, quelle commande interdite et non invasive peut-on utiliser sous Windaube ? Cette question m'intéresse même si j'ai dû opter pour des try... except... en particularisant mes messages d'erreur ce qui est pénible à gérer.
Sous Win-Vista/7, l'écriture sur la partition <C> est réservé aux Admins.
Alors un:
devrais le faire savoir.
Code : Sélectionner tout - Visualiser dans une fenêtre à part open("C:/est_tu_admin", "w")
Je suppose que l'idéal serait de le faire avec un nom de fichier temporaire, juste au cas où...
Sous Xp... rien de mémoire, pas d'os sous la main pour jouer à Mr. Taton.
Bonsoir,
Merci pour le pas idiot
Changer d'utilisateur.
Sous Windows XP (2000/2003) cela devrais le faire avec un runas /user:... (rien pour tester ce soir)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 patrice@Zeus:~$ sudo su [sudo] password for patrice: root@Zeus:/home/patrice# su root@Zeus:/home/patrice#
Comme le dit afranck64 sous 'Sous Win-Vista/7' il existe des restrictions sur c:\ (et surtout sur le répertoire 'root' de windows > 'c':\windows. Pas de quoi tester ce soir.
Sous Mac cela doit exister comme sous Tux.
A spécifier tout cela.
@+
A tester (surtout sous windows, rien pour tester)
@+
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 import os from sys import platform if platform == 'win32': import win32api import win32con import win32security user = win32api.GetUserNameEx(win32con.NameSamCompatible) # ou user = os.environ.get("USERNAME") ? sd = win32security.GetFileSecurity(os.environ['WINDIR'], win32security.OWNER_SECURITY_INFORMATION) nom, domaine, tp = win32security.LookupAccountSid(None, sd.GetSecurityDescriptorOwner()) isroot = (user == nom) import ctypes isadmin = ctypes.windll.shell32.IsUserAnAdmin() # ou isadmin = os.access(os.environ['WINDIR'], os.W_OK) else: isroot = (os.stat("/").st_uid == os.getuid()) isadmin = (os.stat("/").st_gid == os.getegid()) print("Is root ? %r" % isroot) print("Is admin ? %r" % isadmin)
Salut PauseKawa,
Cette méthode se résume à écrire un lanceur genre "su" qui va lancer le programme X sous le compte de l'utilisateur privilégié.
Très bien mais comment X s'assure qu'il s'exécute effectivement dans le contexte de ce compte là? Nous avons un problème de poules et d’œufs qui demande plus de code.
A mon sens, sécurité et protection ne sont pas des attributs qu'il faut traiter "dans" le développement mais "imposer via la configuration de l'environnement". Cela permet d'avoir des mécanismes de sécurité cohérents et plus facilement auditable d'une application à l'autre. Comme la sécurité est un attribut non fonctionnel, autant éviter d'écrire du code: si on doit changer la policy, il faudrait mettre à jour toutes les applications!
Dans ce cadre, assurer que les scripts sont propriétés d'un administrateur et uniquement accessible par lui est une opération qui put être réalisée à l'installation du programme. Elle positionne uid, gid des scripts et les droits d'accès owner, group, world et permet d'interdire l'accès à d'autres membre du groupe ou à n'importe quel autre utilisateur.
Cette configuration ne peut être changé que par un administrateur et on peut périodiquement s'assurer que ces attributs ont la valeur attendue.
Comme il sera impossible de lancer le programme sans être l'utilisateur qui a les droits qui vont bien, le problème est réglé. Et nous n'avons pas eu à ajouter de ligne de code dans le programme.
Mais rambc n'a toujours pas dit "pourquoi" il voulait récupérer cette information, ce qui n'aide pas trop à définir un "comment" adapté.
- W
@Pausekawa: le test du admin tourne bien, mais celui du root non(Je me demande s'il est logique sous win car je ne capte pas vraiment).
edit: oups, je suppose qu'il s'agit du test sur le premier compte Administrateur .
C'est une comparaison entre le nom de l'utilisateur (os.environ.get("USERNAME")) et le propriétaire de os.environ['WINDIR'], j'ai supposé que c'était 'Administrateur' mais pas testé.
hmm, bref, j'obtiens un:
*** Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32. ***
>>>
Is root ? False
Is admin ? 1
>>> user
u'Anna\\Franck Mario'
>>> nom
u'TrustedInstaller'
>>>
Normal je pense: user c'est le nom du compte courant, TrustedInstaller le propriétaire de windir. Et
Anna\\Franck Mario est administrateur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Is root ? False Is admin ? 1
Non ?
Vu le TrustedInstaller os.environ['WINDIR'] n'est sans doute pas un bon choix.
Utiliser os.environ['SYSTEMDRIVE'] ?
Quel répertoire a pour propriétaire 'Administrateur' sous Windows ?
Edit: Ceci dit la proposition de wiztricks est bien plus propre.
pêché sur stackoverflow:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 from win32com.shell import shell if shell.IsUserAnAdmin(): print ("i am admin")
Pour remplacer
? Pourquoi pas vu import win32con et que cela évite un import.
Code : Sélectionner tout - Visualiser dans une fenêtre à part isadmin = ctypes.windll.shell32.IsUserAnAdmin()
Il vas falloir attendre rambc pour poursuivre il me semble.
Exact, pour le ctypes, je suis pris de court
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 import ctypes, os, sys if sys.platform == "win32": is_admin = ctypes.windll.shell32.IsUserAnAdmin() != 0 else: is_admin = os.getuid() == 0 print (is_admin)
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager