Копирование файлов по сети (требуется аутентификация)

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

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

какие идеи?


[Edit] вот код:

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)), Я:

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

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

3 ответов


вы можете использовать WNetUseConnection с P / invokes.

смотрите здесь:

доступ к общему файлу (UNC) из удаленного, недоверенного домена с учетными данными


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


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

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

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

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

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

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