Используйте C # для сохранения файла в папке или общей папке на удаленном компьютере. Удаленный компьютер находится в другом домене - PullRequest
0 голосов
/ 01 мая 2019

У меня есть API C #, размещенный в домене A. Этот API получает файлы в виде данных формы (я извлекаю файл, используя HttpContext.Current.Request.Files).В этом API мне нужно реализовать метод сохранения извлеченного файла в папку или общую папку на удаленном компьютере, который находится в другом домене, скажем, в домене B (домен моей компании).У меня есть учетные данные для доступа к машине, работающей в домене B.

Я использую VS2015 для разработки.Моя целевая среда - .NET 4.5.2.Я пытался использовать метод WNetUseConnection (Mpr.dll) для подключения.Используя этот метод, я могу успешно подключаться и сохранять файлы при подключении из того же домена, что и удаленный компьютер.Но когда я попытался подключиться из-за пределов домена B (домен удаленного компьютера), я не смог этого сделать.Я получаю ошибку 53. Я исследовал эту ошибку и обнаружил, что это «сетевой путь не найден».

Я чувствую, что мне нужна вся помощь, которую я могу получить.Нужно сделать это за 2 дня.

Ниже приведен мой функциональный вызов для подключения к удаленному компьютеру в домене B.

RemoteConnect.connectToRemote("\\xxx.xxx.xxx.xxx\C$", @"domain-B\username", "password");

Ниже приведен код, который у меня есть в моемкласс соединения (RemoteConnect.cs) для использования WNetUseConnection.

[DllImport("Mpr.dll")]
        private static extern int WNetUseConnection(
            IntPtr hwndOwner,
            NETRESOURCE lpNetResource,
            string lpPassword,
            string lpUserID,
            int dwFlags,
            string lpAccessName,
            string lpBufferSize,
            string lpResult
        );

        [DllImport("Mpr.dll")]
        private static extern int WNetCancelConnection2(
            string lpName,
            int dwFlags,
            bool fForce
        );

        [StructLayout(LayoutKind.Sequential)]
        private 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 = "";
        }


        public static string connectToRemote(string remoteUNC, string username, string password)
        {
            return connectToRemote(remoteUNC, username, password, false);
        }

        public static string connectToRemote(string remoteUNC, string username, string password, bool promptUser)
        {
            NETRESOURCE nr = new NETRESOURCE();
            nr.dwType = RESOURCETYPE_DISK;
            nr.lpRemoteName = remoteUNC;
            //          nr.lpLocalName = "F:";

            int ret;
            if (promptUser)
                ret = WNetUseConnection(IntPtr.Zero, nr, "", "", CONNECT_INTERACTIVE | CONNECT_PROMPT, null, null, null);
            else
                ret = WNetUseConnection(IntPtr.Zero, nr, password, username, 0, null, null, null);

            if (ret == NO_ERROR) return null;
            return getErrorForNumber(ret); 
        }

        public static string disconnectRemote(string remoteUNC)
        {
            int ret = WNetCancelConnection2(remoteUNC, CONNECT_UPDATE_PROFILE, false);
            if (ret == NO_ERROR) return null;
            return getErrorForNumber(ret);
        }

1 Ответ

0 голосов
/ 01 мая 2019

Вы пробовали NetworkCredential?Может быть, я думаю слишком просто и не понимаю вашей проблемы ..

Это всегда работало для моих нужд:

NetworkCredential networkCredential = new NetworkCredential("username", "password", "domainname");
CredentialCache credentialCache = new CredentialCache();
credentialCache.Add(new Uri(@"\\networkshare\"), "Basic", networkCredential);
//Proceed with whatever file-io you need using the normal .NET file io. Example:
string[] folders = System.IO.Directory.GetDirectories(@"\\networkshare\Users\Userimages");
...