Копирование файлов по сети (требуется аутентификация) - PullRequest
7 голосов
/ 26 апреля 2010

Есть ли способ аутентификации в качестве локального (не сетевого) пользователя для копирования файлов по сети в .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 работает. Похоже, что приведенный выше код вообще ничего не делает.

Ответы [ 3 ]

4 голосов
/ 26 апреля 2010

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

Смотрите эту тему:

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

1 голос
/ 26 апреля 2010

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

0 голосов
/ 26 апреля 2010

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

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

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

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

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

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

...