artarik
Active member
Как я воевал с копированием файлов по сети, используя логин/пароль
Сначала пытался через c#:
Но, активность валилась с ошибкой:
До передачи управления из текущего метода параметру, помеченному ключевым словом out, "phToken" должно быть присвоено значение.
Пробовал создать свою активность с аналогичным кодом, но там ловил ошибку отсутствия сборки
Затем узнал про библиотеку SimpleImpersonation, но с ней ловил ошибку Access Denied
Пробовал через вызов Powershell:
Код выполнялся без ошибок, но файл не копировался.
Итоге решил через WebClient
Сначала пытался через 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" должно быть присвоено значение.
Пробовал создать свою активность с аналогичным кодом, но там ловил ошибку отсутствия сборки
Затем узнал про библиотеку 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");