2010-05-29 5 views
3

J'essaye de lire les cibles de tous les raccourcis de bureau dans une application C# 4. Les raccourcis sur un bureau Windows peuvent provenir de plus d'un emplacement, selon que le raccourci est créé pour tous les utilisateurs ou uniquement l'utilisateur actuel. Dans ce cas précis, j'essaie de lire un raccourci sur le bureau public, par ex. à partir de C: \ Users \ Public \ Desktop \ shortcut.lnk.Pourquoi obtenir E_ACCESSDENIED lors de la lecture de raccourcis publics via Shell32?

Le code est comme celui-ci (chemin d'accès est une chaîne contaning le chemin vers le fichier .lnk):

var shell = new Shell32.ShellClass(); 
var folder = shell.NameSpace(Path.GetDirectoryName(path)); 
var folderItem = folder.ParseName(Path.GetFileName(path)); 
if (folderItem != null) 
{ 
    var link = (Shell32.ShellLinkObject)folderItem.GetLink; 

La dernière ligne jette un System.UnauthorizedAccessException, ce qui indique qu'il n'a pas le droit de lire le contenu du fichier de raccourci . J'ai essayé sur des dossiers de raccourci sur le bureau privé de l'utilisateur (c: \ Users \ username \ Desktop) et cela fonctionne très bien.

Alors, mes questions sont les suivantes:

(1) Pourquoi ma demande pas autorisés à/lecture/le raccourci à partir du code, quand je peux lire clairement le contenu en tant qu'utilisateur?

(2) est-il un moyen de contourner ce problème? Peut-être utiliser un fichier manifeste spécial pour l'application?

Et, en passant, mon système d'exploitation est Windows 7, 64 bits.

être bien

-H-

Répondre

2

Oui, vous ne pouvez pas accéder au fichier .lnk dans ce dossier par défaut. Vous créez un objet COM qui vous permet de modifier les propriétés .lnk. Et cela nécessite un compte de niveau administrateur avec UAC désactivé. Oui, vous pouvez résoudre ce with a manifest.

+0

Super, ça a marché, merci beaucoup - mais je ne suis pas sûr de voir la logique de lancer l'exception avant d'essayer de modifier quelque chose. Surtout que je peux facilement lire les valeurs via l'interface utilisateur de Windows sans obtenir une invite d'élévation. – corvuscorax

+1

Vous utilisez une interface COM de 15 ans, inventée * long * avant que l'UAC ne soit envisagé. Il n'a pas de propriété "EnableChangingProperties", qui, lorsqu'elle est définie sur False, autoriserait l'accès en lecture seule aux fichiers .lnk. Le gestionnaire de feuille de propriétés dans Explorer utilise autre chose. Je ne sais pas quoi, mais je doute que ce soit scriptable. Les interfaces shell sont trop anciennes pour être facilement utilisables depuis .NET, seuls les programmes C/C++ le peuvent. –

Questions connexes