Perché ricevo E_ACCESSDENIED durante la lettura i collegamenti pubblici attraverso Shell32?
Domanda
Sto cercando di leggere i bersagli di tutti i collegamenti sul desktop in un C # 4 applicazione. I collegamenti su un desktop di Windows possono provenire da più di una posizione, a seconda se il collegamento viene creato per tutti gli utenti o solo l'utente corrente. In questo caso specifico che sto cercando di leggere un collegamento dal desktop pubblica, per esempio da C:. \ Users \ Public \ Desktop \ shortcut.lnk
Il codice è come questo (percorso è una stringa contaning il percorso del file 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;
L'ultima riga genera uno System.UnauthorizedAccessException, che indica che non è consentito di leggere il contenuto del file di scelta rapida. Ho cercato sul file di collegamento presenti sul desktop privata dell'utente (C: \ Users \ nome utente \ Desktop). E che funziona bene
Quindi, le mie domande sono:
(1) Perché è la mia domanda non posso accedere a / lettura / il collegamento dal codice, quando posso chiaramente leggere il contenuto come un utente?
(2) c'è un modo per aggirare questo? Forse usando un file manifesto speciale per l'applicazione?
E, a proposito, il mio sistema operativo è Windows 7, 64 bit.
essere ben
-h -
Soluzione
Sì, non è possibile ottenere l'accesso al file .lnk nella cartella di default. Si sta creando un oggetto COM che consente di modificare le proprietà .lnk. E questo richiede un account di livello di amministratore con UAC disattivato.
Sì, si può risolvere che con un manifesto .