2010-05-29 46 views
3

我正試圖讀取C#4應用程序中所有桌面快捷方式的目標。根據快捷方式是爲所有用戶創建還是僅爲當前用戶創建,Windows桌面上的快捷方式可以來自多個位置。在這種特定情況下,我試圖從公共桌面讀取快捷方式,例如從C:\ Users \ Public \ Desktop \ shortcut.lnk。爲什麼在通過Shell32讀取公共快捷方式時遇到E_ACCESSDENIED?

的代碼是這樣的(路徑爲contaning的路徑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; 

最後一行拋出System.UnauthorizedAccessException的,表明它不能讀取快捷方式文件的內容。我曾嘗試用戶的私人桌面上的快捷方式文件(c:\ Users \ username \ Desktop),並且工作正常。

所以,我的問題是:

(1)爲什麼我的應用程序不允許/讀/從代碼中的快捷方式,當我可以清晰地讀出的內容爲用戶?

(2)有沒有辦法解決這個問題?也許使用特殊的清單文件的應用程序?

而且,順便說一句,我的操作系統是Windows 7,64位。

很好

-H-

回答

2

是的,你不能默認訪問.lnk文件是文件夾中。您正在創建一個COM對象,允許您修改.lnk屬性。這需要關閉UAC的管理員級帳戶。

是的,你可以修復那個with a manifest

+0

很好,工作,非常感謝 - 但我不確定在實際嘗試修改某些內容之前,我看到拋出異常的邏輯。特別是因爲我可以通過Windows用戶界面輕鬆讀取值,而不必提升提示。 – corvuscorax 2010-05-29 12:35:52

+1

您使用的是15年前的COM接口,在UAC設想之前發明* long *。它沒有「EnableChangingProperties」屬性,該屬性設置爲False時將允許只讀訪問.lnk文件。資源管理器中的屬性表處理程序使用別的東西不知道是什麼,但我懷疑它是可以編寫腳本的。 shell接口太舊了,不容易在.NET中使用,只有C/C++程序可以。 – 2010-05-29 13:03:46

相關問題