Некоторые предыстории: В настоящее время мы получаем файлы от нескольких поставщиков данных на FTP-сервер, размещенный нашим партнером по хостингу.В рамках нового проекта мы настраиваем функцию Azure.Эта функция выполняется в группе ресурсов, которую наш партнер по хостингу настроил для доступа к VPN / частной сети.Эта функция является первым шагом в процессе замены нескольких устаревших программ в Excel / VBA функциями Azure.
Нам нужно переместить файлы с FTP-сервера на другой внутренний (файловый) сервер (для поддержкинекоторые из старых программ).FTP-сервер находится в демилитаризованной зоне и поэтому не является частью домена, как файловый сервер.
Теперь я часами гуглял в поисках решения и считаю, что нашел его, используя https://stackoverflow.com/a/295703/998791 и https://stackoverflow.com/a/1197430/998791
public sealed class NetworkConnection : IDisposable
{
private string _uncShare;
public NetworkConnection(string uncShare, NetworkCredential credentials)
{
var nr = new Native.NETRESOURCE
{
dwType = Native.RESOURCETYPE_DISK,
lpRemoteName = uncShare
};
var userName = string.IsNullOrEmpty(credentials.Domain) ? credentials.UserName : string.Format(@"{0}\{1}", credentials.Domain, credentials.UserName);
int result = Native.WNetUseConnection(IntPtr.Zero, nr, credentials.Password, userName, 0, null, null, null);
if (result != Native.NO_ERROR)
{
throw new Win32Exception(result);
}
_uncShare = uncShare;
}
public void Dispose()
{
if (!string.IsNullOrEmpty(_uncShare))
{
Native.WNetCancelConnection2(_uncShare, Native.CONNECT_UPDATE_PROFILE, false);
_uncShare = null;
}
}
private class Native
{
public const int RESOURCETYPE_DISK = 0x00000001;
public const int CONNECT_UPDATE_PROFILE = 0x00000001;
public const int NO_ERROR = 0;
[DllImport("mpr.dll")]
public static extern int WNetUseConnection(IntPtr hwndOwner, NETRESOURCE lpNetResource, string lpPassword, string lpUserID,
int dwFlags, string lpAccessName, string lpBufferSize, string lpResult);
[DllImport("mpr.dll")]
public static extern int WNetCancelConnection2(string lpName, int dwFlags, bool fForce);
[StructLayout(LayoutKind.Sequential)]
public class NETRESOURCE
{
public int dwScope = 0;
public int dwType = 0;
public int dwDisplayType = 0;
public int dwUsage = 0;
public string lpLocalName = "";
public string lpRemoteName = "";
public string lpComment = "";
public string lpProvider = "";
}
}
}
Использование:
using (new NetworkConnection(ftpServerSettings.UNCPath, new NetworkCredential(ftpServerSettings.UserName, ftpServerSettings.Password, ftpServerSettings.Domain)))
{
using (new NetworkConnection(fileServerSettings.UNCPath, new NetworkCredential(fileServerSettings.UserName, fileServerSettings.Password, fileServerSettings.Domain)))
{
handler.HandleFolders(bankDataRepository.GetFolderSettings());
}
}
При локальном запуске это работает нормально, но при запуске из Azure я получаю исключение System.ComponentModel.Win32Exception с сообщением «Доступ запрещен».
Я не уверен, разрешен ли DllImport в функциях Azure, если мне нужен FullTrust (я что-то видел об этом где-то) или проблема связана с разрешениями на сервере.
Можеткто-нибудь, пожалуйста, просветите меня?