Quiero determinar mediante programación si el usuario actual (o proceso) tiene acceso para crear enlaces simbólicos. En Windows (Vista y superior), no se puede crear un enlace simbólico sin SeCreateSymbolicLinkPrivilege y, de manera predeterminada, esto solo se asigna a los administradores. Si se intenta crear un enlace simbólico sin este privilegio, se produce un error de Windows 1314 (no se tiene un privilegio requerido por el cliente).Determinar si el proceso de Windows tiene privilegios para crear el enlace simbólico
Para demostrar esta restricción, creé una instalación limpia de Windows, inicié sesión como la cuenta de administrador inicial (restringida a través de UAC) y no pude crear un enlace simbólico en el directorio de inicio.
Después de ejecutar el símbolo del sistema como administrador o deshabilitar el UAC, esta orden se ejecuta sin errores.
Según this article, "cada proceso ejecutado en nombre del usuario tiene una copia del token [de acceso]".
Así que he creado a Python script to query for the permissions. Por conveniencia y posteridad, incluyo un extracto a continuación.
La idea detrás de la secuencia de comandos es enumerar todos los privilegios y determinar si el proceso tiene el privilegio requerido. Lamentablemente, me parece que el proceso actual en realidad no tiene el privilegio deseado, incluso cuando puede crear enlaces simbólicos.
Sospecho que el problema es que a pesar de que los privilegios del usuario actual no incluyen explícitamente el privilegio, su pertenencia al grupo tiene ese privilegio.
En resumen, ¿cómo puedo determinar si un proceso determinado tendrá privilegios para crear enlaces simbólicos (sin intentar crear uno)? Se prefiere un ejemplo en C o C++ o Python, aunque cualquier cosa que utilice la API de Windows será adecuada.
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)
¿Tiene enlaces simbólicos? –
¿Qué tipo de enlace simbólico estás tratando de crear? Hay varias cosas diferentes que pueden considerarse enlaces simbólicos en Windows: puntos de unión del sistema de archivos, enlaces duros del sistema de archivos, enlaces simbólicos del administrador de objetos, etc. Creo que solo necesita el privilegio SeCreateSymbolicLink para crear enlaces simbólicos de administrador de objetos. –
Estoy tratando de crear enlaces simbólicos basados en puntos de unión del sistema de archivos, como los creados por CreateSymbolicLink. –