Я хочу программным образом определить, имеет ли текущий пользователь (или процесс) доступ к созданию символических ссылок. В Windows (Vista и выше) невозможно создать символическую ссылку без SeCreateSymbolicLinkPrivilege, и по умолчанию это назначается только администраторам. Если вы попытаетесь создать символическую ссылку без этой привилегии, произойдет ошибка Windows 1314 (требуемая привилегия не удерживается клиентом).Определите, имеет ли Windows-процесс право создавать символическую ссылку
Чтобы продемонстрировать это ограничение, я создал чистую установку Windows, зарегистрированную как начальную учетную запись администратора (ограниченную через UAC) и не смог создать символическую ссылку в домашнем каталоге.
После запуска командной строки от имени администратора или отключение контроля учетных записей, эта команда выполняется без ошибок.
Согласно this article, «каждый процесс, выполняемый от имени пользователя, имеет копию маркера [доступа]».
Итак, я создал a Python script to query for the permissions. Для удобства и потомства я включаю выдержку ниже.
Идея сценария заключается в перечислении всех привилегий и определении того, имеет ли процесс требуемые привилегии. К сожалению, я обнаружил, что текущий процесс на самом деле не имеет желаемой привилегии, даже когда он может создавать символические ссылки.
Я подозреваю, что проблема заключается в том, что, хотя привилегии текущего пользователя явно не включают эту привилегию, членство в группе действительно дает эту привилегию.
Вкратце, как я могу определить, будет ли данный процесс иметь привилегию создавать символические ссылки (не пытаясь создать его)? Примером может служить пример на C или C++ или Python, хотя все, что использует Windows API, будет подходящим.
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 есть символические ссылки? –
Какую символическую ссылку вы пытаетесь создать? Существует множество разных вещей, которые могут считаться символическими ссылками в Windows - точки соединения файловой системы, жесткие ссылки файловой системы, символические ссылки диспетчера объектов и т. Д. Я считаю, что вам нужна только привилегия SeCreateSymbolicLink для создания символических ссылок диспетчера объектов. –
Я пытаюсь создать символические ссылки на основе слайдов на файловой системе, такие как созданные CreateSymbolicLink. –