Je souhaite déterminer par programme si l'utilisateur (ou le processus) actuel a accès à la création de liens symboliques. Sous Windows (Vista et version ultérieure), il est impossible de créer un lien symbolique sans le SeCreateSymbolicLinkPrivilege. Par défaut, ce lien est uniquement attribué aux administrateurs. Si vous tentez de créer un lien symbolique sans ce privilège, une erreur Windows 1314 (Un privilège requis n'est pas détenu par le client) se produit.Détermine si le processus Windows a le privilège de créer un lien symbolique
Pour illustrer cette restriction, j'ai créé une nouvelle installation de Windows, connecté en tant que compte Administrateur initial (restreint via le contrôle de compte d'utilisateur) et incapable de créer un lien symbolique dans le répertoire de base.
Après avoir exécuté l'invite de commande en tant qu'administrateur ou la désactivation de l'UAC, cette commande exécute sans erreur.
Selon this article, "chaque processus exécuté pour le compte de l'utilisateur a une copie du jeton [d'accès]". J'ai donc créé a Python script to query for the permissions. Pour plus de commodité et de postérité, j'inclus un extrait ci-dessous.
L'idée derrière le script est d'énumérer tous les privilèges et de déterminer si le processus a le privilège requis. Malheureusement, je trouve que le processus actuel n'a pas le privilège désiré, même lorsqu'il peut créer des liens symboliques.
Je suppose que le problème est que même si les privilèges de l'utilisateur actuel n'incluent pas explicitement le privilège, son appartenance au groupe lui procure ce privilège. En bref, comment puis-je déterminer si un processus donné aura le privilège de créer des liens symboliques (sans essayer d'en créer un)? Un exemple en C ou C++ ou en Python est préféré, bien que tout ce qui utilise l'API Windows convienne.
def get_process_token():
token = wintypes.HANDLE()
TOKEN_ALL_ACCESS = 0xf01ff
res = OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, token)
if not res > 0: raise RuntimeError("Couldn't get process token")
return token
def get_privilege_information():
# first call with zero length to determine what size buffer we need
return_length = wintypes.DWORD()
params = [
get_process_token(),
TOKEN_INFORMATION_CLASS.TokenPrivileges,
None,
0,
return_length,
]
res = GetTokenInformation(*params)
# assume we now have the necessary length in return_length
buffer = ctypes.create_string_buffer(return_length.value)
params[2] = buffer
params[3] = return_length.value
res = GetTokenInformation(*params)
assert res > 0, "Error in second GetTokenInformation (%d)" % res
privileges = ctypes.cast(buffer, ctypes.POINTER(TOKEN_PRIVILEGES)).contents
return privileges
privileges = get_privilege_information()
print("found {0} privileges".format(privileges.count))
map(print, privileges)
Windows a des liens symboliques? –
Quel genre de lien symbolique essayez-vous de créer? Il y a un tas de choses qui peuvent être considérées comme des liens symboliques dans Windows - points de jonction de systèmes de fichiers, liens matériels de système de fichiers, liens symboliques de gestionnaire d'objet, etc. Je crois que vous avez besoin du privilège SeCreateSymbolicLink pour créer des liens symboliques de gestionnaire d'objet. –
J'essaie de créer des liens symboliques basés sur le point de jonction du système de fichiers, tels que ceux créés par CreateSymbolicLink. –