Копирование по сети

artarik

Active member
Как я воевал с копированием файлов по сети, используя логин/пароль
Сначала пытался через c#:
C#:
[System.Runtime.InteropServices.DllImport("advapi32.dll", SetLastError = true)]
static extern bool LogonUser(string lpszUsername, string lpszDomain,
                             string lpszPassword, int dwLogonType, int dwLogonProvider,
                             out Microsoft.Win32.SafeHandles.SafeAccessTokenHandle phToken);

Microsoft.Win32.SafeHandles.SafeAccessTokenHandle safeAccessTokenHandle;
bool returnValue = LogonUser(UserName, string.Empty,pwd ,2, 0, out safeAccessTokenHandle);
if (false == returnValue)
{
    int ret = System.Runtime.InteropServices.Marshal.GetLastWin32Error();
    logger.Error($"Unable to login. Error '{ret.ToString()}'");
}
    System.Security.Principal.WindowsIdentity.RunImpersonated(safeAccessTokenHandle,
    () =>
    {
        System.IO.File.Copy(source, destination, true);
    });
Но, активность валилась с ошибкой:
До передачи управления из текущего метода параметру, помеченному ключевым словом out, "phToken" должно быть присвоено значение.

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

Затем узнал про библиотеку SimpleImpersonation, но с ней ловил ошибку Access Denied
Пробовал через вызов Powershell:
C#:
System.Management.Automation.PowerShell ps = System.Management.Automation.PowerShell.Create();
ps.AddScript(@"New-PSDrive -Name Z -PSProvider filesystem -Root $sourceDir
            -Credential (New-Object pscredential($user, $pass))");
ps.AddParameter("user", UserName);
ps.AddParameter("pass", pwd);
ps.AddParameter("sourceDir", dir);
ps.AddScript(@"Copy-Item z:\file.xlsx -Destination C:\temp\file.xlsx -Force");
ps.AddScript(@"Remove-PSDrive Z");
ps.Invoke();
Код выполнялся без ошибок, но файл не копировался.
Итоге решил через WebClient
C#:
System.Net.WebClient wc = new System.Net.WebClient();
wc.Credentials = new System.Net.NetworkCredential(UserName, pwd);
wc.DownloadFile(source, @"c:\temp\file.xlsx");
 
Верх