¿Por qué recibo E_ACCESSDENIED al leer atajos públicos a través de Shell32?
Pregunta
Estoy intentando leer el blanco de todos los accesos directos del escritorio en una aplicación C # 4. Los accesos directos en el escritorio de Windows pueden proceder de más de una ubicación, dependiendo de si se crea el acceso directo para todos los usuarios o sólo el usuario actual. En este caso específico Estoy intentando leer un acceso directo desde el escritorio pública, por ejemplo, desde C:. \ Users \ Public \ Desktop \ shortcut.lnk
El código es así (camino es una cadena contaning la ruta al archivo 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 última línea lanza una System.UnauthorizedAccessException, lo que indica que no se permite leer el contenido del archivo de acceso directo. He tratado de archivos de acceso directo en el escritorio privada del usuario (C: \ Users \ nombre de usuario \ Desktop). Y que funciona bien
Por lo tanto, mis preguntas son:
(1) ¿Por qué mi solicitud no se les permite / lectura / el acceso directo desde el código, cuando puedo leer con claridad el contenido como un usuario?
(2) hay una manera de evitar esto? Tal vez el uso de un archivo de manifiesto especial para la aplicación?
Y, por cierto, mi sistema operativo es Windows 7, 64 bits.
estar bien
-h -
Solución
Sí, no se puede obtener acceso al archivo .lnk en esa carpeta por defecto. Va a crear un objeto COM que le permite modificar las propiedades .lnk. Y eso requiere una cuenta de administrador con el UAC desactivado.
Sí, se puede arreglar eso con un manifiesto .