Stellen Sie fest, ob der Windows-Prozess berechtigt ist, eine symbolische Verknüpfung zu erstellen

Ich möchte programmgesteuert feststellen, ob der aktuelle Benutzer (oder Prozess) Zugriff zum Erstellen symbolischer Links hat. Unter Windows (Vista und höher) kann ohne das SeCreateSymbolicLinkPrivilege keine symbolische Verknüpfung erstellt werden. Standardmäßig ist dies nur Administratoren zugewiesen. Wenn versucht wird, eine symbolische Verknüpfung ohne dieses Privileg zu erstellen, tritt ein Windows-Fehler 1314 (ein erforderliches Privileg ist nicht im Besitz des Clients) auf.

Um diese Einschränkung zu demonstrieren, habe ich eine Neuinstallation von Windows erstellt, mich als erstes Administratorkonto angemeldet (eingeschränkt durch die Benutzerkontensteuerung) und konnte keinen Symlink im Ausgangsverzeichnis erstellen.

Nachdem Sie die Eingabeaufforderung als Administrator ausgeführt oder die Benutzerkontensteuerung deaktiviert haben, wird der Befehl ohne Fehler ausgeführt.

GemäßDieser Beitragmsgstr "Jeder Prozess, der im Auftrag des Benutzers ausgeführt wird, hat eine Kopie des [Zugriffs] -Tokens".

Also habe ich geschaffenEin Python-Skript zum Abfragen der Berechtigungen. Der Einfachheit halber und der Nachwelt halber füge ich unten einen Auszug hinzu.

Die Idee hinter dem Skript besteht darin, alle Berechtigungen aufzulisten und festzustellen, ob der Prozess über die erforderlichen Berechtigungen verfügt. Leider stelle ich fest, dass der aktuelle Prozess tatsächlich nicht das gewünschte Privileg besitzt, auch wenn er Symlinks erstellen kann.

Ich vermute, dass das Problem darin besteht, dass seine Gruppenmitgliedschaft dieses Privileg gewährt, obwohl die Privilegien des aktuellen Benutzers das Privileg nicht explizit einschließen.

Kurz gesagt, wie kann ich feststellen, ob ein bestimmter Prozess berechtigt ist, symbolische Verknüpfungen zu erstellen (ohne zu versuchen, eine zu erstellen)? Ein Beispiel in C oder C ++ oder Python wird bevorzugt, obwohl alles, was die Windows-API verwendet, geeignet ist.

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)

Antworten auf die Frage(1)

Ihre Antwort auf die Frage