Comment accéder programmatiquement au chemin cible d'un lien symbolique windows?

Windows 6 (Vista et Server 2008) supporte les liens symboliques appropriés, qui peuvent être créés via la fonction CreateSymbolicLink . Mais il ne semble pas être une fonction correspondante pour interroger un lien symbolique pour obtenir le chemin de la cible du lien.

j'ai découvert que les liens symboliques sont une implémentation des points de reparse, et donc les fonctions de point de reparse peuvent être utilisées pour obtenir le chemin cible. Mais l'en-tête les fichiers que je dois utiliser reparse points semblent venir avec le Windows Driver Kit . Mettre en place ce kit avec VS2008 semble être une tâche non négligeable.

est-ce qu'il y a une fonction simple et agréable que j'ai manquée pour obtenir la cible d'un lien, ou dois-je vraiment configurer un environnement de développement de pilote windows juste pour écrire du code pour accéder à cette information?

EDIT: Adam Mitz est venu avec la suggestion de Obtenir finalpathnamebyhandle. Cette fonction fonctionne très bien pour les liens symboliques locaux, mais ne semble pas fonctionner pour résoudre les liens distants (via un chemin UNC).

EDIT 2: À la demande d'Adam, voici plus de détails de ce que j'ai essayé:

j'ai d'abord suivi la route FSCTL_GET_REPARSE_POINT / DeviceIoControl , mais cela donne une structure REPARSE_DATA_BUFFER . Les en-têtes qui définissent cette structure semblent exister uniquement dans le kit de pilote Windows.

GetFinalPathNameByHandle() fonctionne très bien lorsque le lien existe sur un disque local ( C:...link etc). Curieusement, j'ai trouvé que je pouvais obtenir la poignée du lien - et ainsi obtenir la cible - en utilisant CreateFileW() si le drapeau FILE_FLAG_OPEN_REPARSE_POINT a été spécifié ou non, indépendamment du fait que le fichier cible existe.

quand CreateFileW() et GetFinalPathNameByHandle() sont utilisés pour interroger un lien distant ( ?UNC.... ), les choses commencent à se désagréger. Si FILE_FLAG_OPEN_REPARSE_POINT est spécifié, GetFinalPathNameByHandle() renvoie toujours le chemin du lien, pas le chemin cible. Si FILE_FLAG_OPEN_REPARSE_POINT n'est pas spécifié, le chemin cible est retourné, mais uniquement si la cible existe et est sur la même machine que le lien. Si le lien pointe vers une autre machine, j'obtiens un réseau autorisations d'erreur. Si le lien pointe vers un fichier local - inexistant -, j'obtiens un fichier n'ayant pas trouvé d'erreur.

12
demandé sur David Arno 2008-10-21 14:38:37

1 réponses

GetFinalPathNameByHandle

un chemin final est le chemin qui est retourné lorsqu'un chemin est entièrement résoudre. Par exemple, pour une symbolique lien nommé "C:\tmp\mydir" à "D:\yourdir", le système de fichiers final chemin serait "D:\yourdir".

13
répondu Adam Mitz 2008-10-21 11:36:14