2010-04-26 4 views
7

Есть ли способ аутентифицироваться как локальный (а не сетевой) пользователь для копирования файлов по сети в .Net?Копирование файлов по сети (требуется проверка подлинности)

net use не является вариантом, и я не могу получить LogonUser для работы.

Любые идеи?


[Редактировать] Вот код:

public class UserImpersonator : IDisposable 
{ 
    private WindowsImpersonationContext _impersonationContext; 
    private IntPtr _userHandle = IntPtr.Zero; 

    [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.dll", SetLastError = true)] 
    private static extern bool CloseHandle(IntPtr hHandle); 

    public UserImpersonator(string username, string password) 
    { 
     LogonUser(username, "", password, (int)LogonType.LOGON32_LOGON_NETWORK, 
        (int)LogonProvider.LOGON32_PROVIDER_DEFAULT, out _userHandle); 
     _impersonationContext = WindowsIdentity.Impersonate(_userHandle); 
    } 

    public void Dispose() 
    { 
     CloseHandle(_userHandle); 
     _impersonationContext.Undo(); 
    } 

    private enum LogonType : int 
    { 
     LOGON32_LOGON_INTERACTIVE = 2, 
     LOGON32_LOGON_NETWORK = 3, 
     LOGON32_LOGON_BATCH = 4, 
     LOGON32_LOGON_SERVICE = 5, 
     LOGON32_LOGON_UNLOCK = 7, 
     LOGON32_LOGON_NETWORK_CLEARTEXT = 8, 
     LOGON32_LOGON_NEW_CREDENTIALS = 9, 
    } 

    private enum LogonProvider 
    { 
     LOGON32_PROVIDER_DEFAULT = 0, 
    } 
} 

Когда я обернуть File.Copy операцию в using(new UserImpersonator(username, password)), я получаю:

System.IO.IOException: Ошибка входа : неизвестное имя пользователя или неверный пароль.

Если, однако, я сначала попытаюсь соединиться с долей в проводнике (вводя информацию аутентификации при ее запросе), работает File.Copy. Похоже, что приведенный выше код ничего не делает.

ответ

0

Вам действительно нужно войти в локальную учетную запись, которая является членом группы на контроллере домена, или просто войти в систему прямо на учетную запись DC. Однако без дополнительной информации я не уверен, с чем вы столкнулись. Не могли бы вы отправить код?

редактировать

Хорошо, я вижу две проблемы.

Основная проблема заключается в том, что вы передаете пустую строку для параметра домена LogonUser. Попробуйте передать имя локального компьютера или сетевого DC.

Боковая проблема заключается в том, что вам необходимо войти в систему, используя пакетную или интерактивную, а не сеть. Вход в сеть дает вам токен олицетворения, а не основной вход в систему, что может помешать вам достичь сетевых ресурсов, если делегирование не включено.

Кроме того, как только вы получите эту работу, вы захотите полностью удалить IntPtr и заменить его на SafeHandle.

+0

@Steven: См. Редактирование. –

+0

Пожалуйста, сообщите нам, если это поможет. –

+0

И если имя компьютера неизвестно ..? (Я знаю только IP) –

1

Я мог бы направить вам мой ответ, который я поставил над here? Он должен работать для ваших нужд.

Смежные вопросы