Ich möchte programmgesteuert feststellen, ob der aktuelle Benutzer (oder der aktuelle Prozess) Zugriff auf symbolische Verknüpfungen hat. Unter Windows (Vista und höher) kann keine symbolische Verbindung ohne SeCreateSymbolicLinkPrivilege erstellt werden. Dies ist standardmäßig nur Administratoren zugewiesen. Wenn versucht wird, eine symbolische Verbindung ohne diese Berechtigung zu erstellen, tritt ein Windows-Fehler 1314 auf (eine erforderliche Berechtigung wird vom Client nicht gehalten).Ermitteln, ob der Windows-Prozess die Berechtigung zum Erstellen der symbolischen Verbindung hat
Diese Einschränkung Um zu demonstrieren, habe ich eine saubere Installation von Windows protokolliert als Anfangs Administrator-Konto in (durch UAC beschränkt), und war nicht in der Lage einen Symlink im Home-Verzeichnis zu erstellen.
Nach der Eingabeaufforderung als Administrator läuft oder UAC deaktivieren, führt dieser Befehl ohne Fehler.
Laut this article "hat jeder im Namen des Benutzers ausgeführte Prozess eine Kopie des Tokens [access]".
Also habe ich a Python script to query for the permissions erstellt. Für die Bequemlichkeit und die Nachwelt, schließe ich einen Auszug unten ein.
Die Idee hinter dem Skript ist, alle Privilegien aufzuzählen und bestimmen, ob der Prozess die erforderliche Berechtigung hat. Leider finde ich, dass der aktuelle Prozess nicht das gewünschte Privileg hat, selbst wenn er symbolische Links erzeugen kann.
Ich vermute, das Problem ist, dass, obwohl die aktuellen Benutzer Privilegien ausdrücklich nicht das Privileg gehören, seine Gruppenzugehörigkeit dieses Privileg nicht leisten.
Kurz gesagt, wie kann ich feststellen, ob ein bestimmte Prozess Privileg symbolische Links zu erstellen haben wird (ohne zu erstellen zu versuchen)? Ein Beispiel in C oder C++ oder Python wird bevorzugt, obwohl alles, das 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)
Windows hat symbolische Links? –
Welche Art von symbolischen Link möchten Sie erstellen? Es gibt eine Menge verschiedener Dinge, die als symbolische Links in Windows betrachtet werden können - Dateisystem-Junction-Punkte, Dateisystem-Hardlinks, symbolische Objektmanager-Links usw. Ich glaube, dass Sie nur die SeCreateSymbolicLink-Berechtigung benötigen, um symbolische Links für Objektmanager zu erstellen. –
Ich versuche, auf Dateisystem-Junction-Point basierende symbolische Links zu erstellen, z. B. solche, die von CreateSymbolicLink erstellt wurden. –