У меня такая же проблема при попытке получить доступ к файловой системе сервера Windows в другом домене. Проблема в том, что учетная запись пользователя, под которым работает программа, не имеет доступа к удаленному серверу. Windows делает дополнительную работу за кулисами, чтобы она выглядела незаметно при использовании Windows Explorer, поскольку она предполагает, что ваши удаленные учетные данные будут соответствовать вашим локальным учетным данным.
Если вы подключаете диск локально к удаленному серверу, а затем используете локально сопоставленный диск в своем коде, у вас не должно возникнуть проблем. Если вы не можете подключить диск, но можете жестко закодировать учетные данные для использования на удаленном сервере, вы можете использовать этот код:
using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Security.Principal;
namespace Company.Security
{
public class ImpersonateUser : IDisposable
{
[DllImport("advapi32.dll", SetLastError=true)]
private static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr phToken);
[DllImport( "kernel32", SetLastError = true )]
private static extern bool CloseHandle(IntPtr hObject);
private IntPtr userHandle = IntPtr.Zero;
private WindowsImpersonationContext impersonationContext;
public ImpersonateUser( string user, string domain, string password )
{
if ( ! string.IsNullOrEmpty( user ) )
{
// Call LogonUser to get a token for the user
bool loggedOn = LogonUser( user, domain, password,
9 /*(int)LogonType.LOGON32_LOGON_NEW_CREDENTIALS*/,
3 /*(int)LogonProvider.LOGON32_PROVIDER_WINNT50*/,
out userHandle );
if ( !loggedOn )
throw new Win32Exception( Marshal.GetLastWin32Error() );
// Begin impersonating the user
impersonationContext = WindowsIdentity.Impersonate( userHandle );
}
}
public void Dispose()
{
if ( userHandle != IntPtr.Zero )
CloseHandle( userHandle );
if ( impersonationContext != null )
impersonationContext.Undo();
}
}
}
Затем вы можете получить доступ к удаленному серверу, выполнив следующее:
using ( new ImpersonateUser( "UserID", "Domain", "Password" ) )
{
// Any IO code within this block will be able to access the remote server.
}