2011-06-28 176 views
6

我被這個問題困住了。如何將文件從UNC共享複製到本地系統?

我有UNC共享,我知道帳戶詳細信息,它具有完全訪問權限,但它無法訪問我的本地系統。 我可以訪問遠程UNC用:

var token = default(IntPtr); 
var context = default(WindowsImpersonationContext); 
LogonUser(_config.Username, _config.Domain, _config.Password, 2, 0, out token); 
context = WindowsIdentity.Impersonate(token); 

//TODO :: System.IO operations 
File.Copy("remote-unc-path","local-path",true); // Exception : Access is denied. 

context.Undo(); 
CloseHandle(token); 

但是,模擬期間我無法訪問我的本地系統,因爲帳戶沒有訪問它。

如何在這種情況下複製文件?我是否需要使用緩衝區和打開/關閉模擬?

+0

順便說一句,不要忘記處置 –

回答

3

你所要做的就是閱讀所有字節,然後把它們寫:

var token = default(IntPtr); 
    using (var context = default(WindowsImpersonationContext)) 
    { 
     LogonUser(_config.Username, _config.Domain, _config.Password, 2, 0, out token); 
     context = WindowsIdentity.Impersonate(token); 
     var bytes = File.ReadAllBytes("remote-unc-path"); 
     context.Undo(); 
     CloseHandle(token); 
     File.WriteAllBytes("local-path", bytes); 
    } 
+0

但是,文件是巨大的...〜200MB - 〜1Gb的..此外,這是系統的一部分,可以有幾個「unc-file-storage」。它會複製文件在不同的線程...我真的不想爲每個文件ReadALL ..它會吃所有的內存 – Degot

+0

我找到了解決方案...它的名字是WNetUseConnection – Degot

+0

@Oskar - 這用於工作就像使用Windows Server 2003/IIS6.x的魅力一樣,但對於Windows Server 2008/IIS 7.5,只有在系統上有「本地」用戶帳戶時,它纔會起作用(至少據我所知)試圖連接到。所以是的,拼命地看到這個非管理員帳戶的答案。愚蠢的Windows安全。 : - \ – jerhewet

相關問題