當我使用:如何從要求身份驗證的計算機上將文件複製到本地計算機?
File.Copy(strRemoteFolder, strLocalFolder)
我得到以下消息的UnauthorizedAccessException
:「訪問路徑...被拒絕。」
在.NET中,如何從要求身份驗證的遠程計算機將文件複製到本地計算機?我知道我需要以某種方式提供用戶名和密碼,但我不知道如何通過.NET中的API提供該信息。
當我使用:如何從要求身份驗證的計算機上將文件複製到本地計算機?
File.Copy(strRemoteFolder, strLocalFolder)
我得到以下消息的UnauthorizedAccessException
:「訪問路徑...被拒絕。」
在.NET中,如何從要求身份驗證的遠程計算機將文件複製到本地計算機?我知道我需要以某種方式提供用戶名和密碼,但我不知道如何通過.NET中的API提供該信息。
調整目標系統上的共享權限以允許訪問。
我特別需要.NET中的解決方案。目標機器位於不同的域上,我們無法在不同域之間提供憑據。 – 2010-07-07 21:23:16
這不會使答案無效。否則你可以寫一個程序並從任何其他機器獲取任何受保護的數據。不太可能發生。 – Randy 2010-07-07 21:24:19
如果不進行身份驗證,您將無法複製受保護服務器中的文件。
您可以使用advapi32.dll中包含的LogonUser()
。我個人並沒有使用它,但它看起來挺直的。
[DllImport("ADVAPI32.DLL")]
public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword,
int dwLogonType, int dwLogonProvider, out int phToken);
http://www.codeproject.com/KB/cs/cpimpersonation1.aspx
http://www.pinvoke.net/default.aspx/advapi32.logonuser
可以使用非託管LogonUser函數來得到一個帳戶令牌在遠程計算機上的會話,然後調用WindowsIdentity.Impersonate使用該會話。 WindowsIdentity.Impersonate上的MSDN頁面描述瞭如何對LogonUser進行p/invoke調用。
您可能無法使用File.Copy,因爲您無法訪問本地計算機,但可以撥打File.OpenRead打開遠程文件,然後恢復您的令牌。事情是這樣的:
[DllImport("advapi32.dll")]
public static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr phToken);
[DllImport("kernel32.dll")]
public static extern bool CloseHandle(IntPtr hObject);
public static Stream OpenFileWithAccount(string filename, string username, string domain, string password)
{
IntPtr token;
if (!LogonUser(username, domain, password, 2, 0, out token))
{
throw new Win32Exception();
}
try
{
using (WindowsIdentity.Impersonate(token))
{
return File.OpenRead(filename);
}
}
finally
{
CloseHandle(token);
}
}
也許你以錯誤的順序得到了方法調用的參數? - >(用戶名,域名,密碼....)在宣言 – MaLio 2010-07-08 00:51:27
@MaLio:你說得對,我做到了。謝謝你的收穫! – Quartermeister 2010-07-08 03:32:33
訂單錯在哪裏?我找不到這個。幫我。調用LogUser方法時出錯。 – AT07 2012-09-04 07:18:37
的建議使用LogonUser
登錄遠程計算機上是明確錯誤。您應使用WNetAddConnection2
或NetUseAdd
參數級別2(USE_INFO_2
)本機API進行遠程登錄。
由於您可以控制兩臺機器,因此可以在兩臺機器上創建具有匹配密碼的本地用戶,然後以該用戶身份運行程序。
或者您可以在遠程計算機上創建用戶,並使用該用戶的用戶名/密碼將驅動器映射到該計算機。您將指定用戶爲RemoteServer\NewUser
。所以你參考here的淨使用將是use s: \\remoteserver\share /USER:RemoteServer\NewUser password
。然後再打電話網,但通過use s: /delete
清理...
(這裏假設你已經正確配置,用戶能夠訪問有關具體份額/文件夾。)
下面你注意,你有不同的域,不能提供跨域的憑證。你有遠程PC的控制權嗎? – 2010-07-07 21:28:39
@Tim我們可以控制遠程PC,但我認爲出於安全考慮,我們無法創建允許跨域訪問的策略。 – 2010-07-08 12:36:58