2011-07-23 77 views
8

我正在Windows 7上編寫一個小型.NET程序。它需要做的一件事是創建符號鏈接,這似乎要求我具有管理員權限。它還需要能夠使用映射網絡驅動器(例如,R:\,在我的系統上映射到\\titanium\Private\)。.NET Directory.Exists在以管理員身份運行時拒絕映射網絡驅動器的存在

我使用Directory.Exists(path)來驗證路徑存在。

以普通用戶身份(管理員帳戶,但不是「以管理員身份」)運行程序時,此功能在映射的網絡驅動器上正常工作。

以管理員身份(使用UAC)運行程序時,無法找到存在的目錄。因此,程序拒絕承認R:\Steam Games\是一個實際存在的目錄。

對於這種情況發生的原因,我有點困惑。使用完整的UNC路徑(\\titanium\Private\Steam Games\)也不起作用。

有沒有人遇到過這個?有沒有什麼好的解決方法?我必須格式化不同的路徑(注意:它們中的大多數目前使用Path.Combine格式化,所以它們應該是正確的)。

感謝您的幫助。

(作爲一個例子,Directory.Exists(@"R:\Steam Games\")返回false作爲管理員運行時,但該文件夾存在。函數調用定期運行時,正確返回true)。

編輯:這個問題似乎確實是管理員在技術上是一個不同的用戶帳戶。我甚至無法使用UNC路徑,因爲我只以普通用戶身份登錄到我的文件服務器,而不是在「管理員」下登錄。作爲一個(相對黑客)的解決方法,我只是運行我的程序以普通權限,然後使用Process.Start來調用具有參數的cmd.exe實例來創建符號鏈接(以及動詞「runas」以獲得UAC提示)。

+0

投票結束,作爲題外話題。這裏的問題是UAC(並且UAC用戶與非UAC用戶不在同一個會話中),並且它與編程無關。 – Lucero

+9

我認爲這是非常重要的話題,作爲一名程序員,如果最終用戶決定提升您的程序,您需要避免發生的問題。 –

+0

我同意斯科特。這是一個常見的編程問題,在我看來這是一個很棒的網站。 –

回答

7

窗口中的映射驅動器綁定到用戶上下文。映射到帳戶的驅動器:用戶A不會被用戶B訪問。不過,您可以在不同的用戶下創建映射到相同驅動器盤符的相同的unc路徑。

儘管使用完整的unc路徑應該可以工作。在support.microsoft.com

更多信息:12

+0

完整的UNC路徑似乎也不起作用。我懷疑,我以某種方式登錄到網絡共享只與我的用戶相關聯,所以如果我嘗試訪問與「管理員」相同的共享,它會期望我重新授權我自己。有沒有解決的辦法? – Ethan

+0

無論用戶運行哪個應用程序,都需要unc路徑的權限。如果您可以以該用戶身份登錄時訪問路徑,則應用程序應能夠通過Directory.Exists以編程方式訪問相同的路徑... – mservidio

+0

您正在使用管理員帳戶,但是這是本地管理員帳戶嗎?此管理員帳戶是否可以訪問遠程路徑?你能證實嗎? – mservidio

1

這已被討論here。顯然,早期版本的.Net Framework the documentation明確提到這是不可能的(「Exists方法不執行網絡身份驗證,如果您查詢現有網絡共享時未經過預先驗證,則Exists方法將返回false。」 )。 4.0文檔不再包含這個句子,但行爲沒有改變。

我發現一個解決方法here(但決定不使用它)。

0

它不起作用的基本原因是IIS用戶沒有權限訪問路徑。以常規用戶身份運行時,訪問權將交給用戶i。E要使它工作,你需要給權限的IIS文件夾 如下遵循UNC路徑由IIS中運行的服務工作:

屬性 - >安全 - >編輯 - >添加 - - > IIS_WPG

相關問題