You can use the unmanaged LogonUser function to get an account token for a session on the remote machine, and then call WindowsIdentity.Impersonate to use that session. The MSDN page on WindowsIdentity.Impersonate describes how to make the p/invoke call to LogonUser.
You probably won't be able to use File.Copy since you won't have access to the local machine, but you can call File.OpenRead to open the remote file and then revert your token. Something like this:
[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);
}
}