2011-10-06 98 views
5

我從Delphi程序寫入映射的網絡驅動器(P :)在Windows 7中有一些問題。當我嘗試,例如,ForceDirectories('P:\test\folder'),我得到一個錯誤(找不到路徑)。爲什麼我的程序不能識別映射的UNC路徑?

我已經嘗試在代碼中輸入UNC路徑(ForceDirectories('\\computername\share\test\folder')),並且工作正常。但是,ExpandUNCFileName('P:\')似乎不工作;它返回'P:\'。 在Windows XP上,ExpandUNCFileName('P:\')返回UNC路徑。

如何在Windows 7上的Delphi中獲取UNC路徑,或者寫入映射的網絡驅動器?

經過進一步調查,就好像我在Windows中缺少某種初始化。我有另一個應用程序(app2)使用TcxShellComboBox(DevExpress組件)。導航到P:在該組合框中,在app2中,撥打ExpandUNCFileName的呼叫在第一個應用程序中正常工作。與在P:下的文件上的FileExists相同,在導航到P:在app2之前返回False,在計算機重新啓動之後返回true。

+0

這是由任何一個服務?你描述的行爲與Delphi沒有任何關係,因爲沒有爲該過程設置驅動器映射。 –

+0

確認您已將驅動器號映射到共享。只有驅動器號未映射時,我才能重現您的問題(Delphi 7,2007 XE)。 – crefird

+0

這不是一個服務,它是一個VCL Forms應用程序。 – MGH

回答

10

根據Microsoft KB Article,如果啓用了用戶帳戶控制,並且如果您從Windows資源管理器映射網絡驅動器(未升級),則升級的程序將無法訪問該驅動器。 Quote:

如果用戶登錄到Windows Vista或Windows 7,並且如果啓用了用戶帳戶控制,程序使用用戶的過濾訪問令牌和程序使用用戶的完全管理員訪問令牌可以同時運行。由於LSA在兩個單獨的登錄會話期間創建了訪問令牌,因此訪問令牌包含單獨的登錄ID。

當映射網絡共享時,它們鏈接到當前進程訪問令牌的當前登錄會話。這意味着,如果用戶使用命令提示符(Cmd.exe)和經過篩選的訪問令牌來映射網絡共享,則不會爲使用完整管理員訪問令牌運行的進程映射網絡共享。

既然你在評論中提到你運行Delphi「作爲管理員」(提升),這是你的問題。

解決方案:

  1. 不要運行德爾福升高,如果你不需要。如果您的軟件需要提升,請將其分爲兩部分(提升和非提升),並從第一部分訪問映射網絡驅動器。然後使用提升的COM對象訪問另一部分,或者只需執行一個單獨的可執行文件。

  2. 地圖從提升網絡提示網絡驅動器,以便映射的網絡驅動器將提供給提升的用戶:

    一個。打開提升的命令提示符(以管理員身份運行「cmd.exe」)

    b。類型net use p: \\computername\share\test\folder

+2

如果您選擇第二種解決方案,如果您平常需要它,您需要再次從常規用戶(無需提升)映射它。 – Whiler

相關問題