Как скопировать файл с компьютера, который требует аутентификации, на мой локальный компьютер? - PullRequest
0 голосов
/ 08 июля 2010

Когда я использую:

File.Copy(strRemoteFolder, strLocalFolder)

, я получаю UnauthorizedAccessException со следующим сообщением: «Доступ к пути ... запрещен».

В .NET какскопировать файл с удаленного компьютера, который требует аутентификации, на мой локальный компьютер?Я понимаю, что мне нужно каким-то образом ввести имя пользователя и пароль, но я не знаю, как предоставить эту информацию через API в .NET.

Ответы [ 6 ]

1 голос
/ 08 июля 2010

Рекомендации по использованию LogonUser для входа на удаленный компьютер совершенно неверны. Для удаленного входа в систему следует использовать WNetAddConnection2 или NetUseAdd с собственным параметром уровня 2 (USE_INFO_2).

1 голос
/ 08 июля 2010

Вы можете использовать неуправляемую функцию LogonUser , чтобы получить маркер учетной записи для сеанса на удаленной машине, а затем вызвать WindowsIdentity.Impersonate , чтобы использовать этот сеанс.На странице MSDN WindowsIdentity.Impersonate описано, как выполнить вызов p / invoke LogonUser.

Вы, вероятно, не сможете использовать File.Copy, поскольку у вас не будет доступа к локальному компьютеру, но вы можете позвонить File.OpenRead , чтобы открыть удаленный файл, а затемвернуть свой токен.Как то так:

[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);
    }
}
0 голосов
/ 08 июля 2010

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

Или вы можете просто создать пользователя на удаленном компьютере и подключить диск к этому компьютеру, используя имя пользователя / пароль этого пользователя.Вы можете указать пользователя как RemoteServer\NewUser.Таким образом, параметры для использования в сети, на которые ссылаются , здесь будут use s: \\remoteserver\share /USER:RemoteServer\NewUser password.Затем снова вызовите net, но передайте use s: /delete для очистки ...

(Предполагается, что вы правильно настроили пользователя для доступа к определенной папке / папке).

0 голосов
/ 08 июля 2010

Вы можете использовать LogonUser(), содержащийся в advapi32.dll.Я не использовал это лично, но это кажется достаточно прямым.

[DllImport("ADVAPI32.DLL")] 
public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, 
int dwLogonType, int dwLogonProvider, out int phToken);

http://www.codeproject.com/KB/cs/cpimpersonation1.aspx
http://www.pinvoke.net/default.aspx/advapi32.logonuser

0 голосов
/ 08 июля 2010

Вы не сможете копировать файлы с защищенного сервера без аутентификации.

0 голосов
/ 08 июля 2010

настроить права доступа в целевой системе, чтобы разрешить доступ.

...