Как заставить Windows переподключиться к сетевому диску - PullRequest
9 голосов
/ 25 декабря 2011

Мы пытаемся получить доступ к каталогу, который находится в сетевом каталоге, но получим неправильные результаты (C # / Windows):

var exists = Directory.Exists("Z:\\Sessions\\Data1");

«Z» - это сетевой каталог, «Sessions» - это каталог, в которомПрограммное обеспечение для записи постоянно создает каталоги (например, «Data1») и помещает в них некоторые данные.Кажется, что Windows кэширует неправильное состояние о Data1: метод возвращает false.Но когда я получаю доступ к каталогу через Проводник, он здесь.Когда я запускаю метод (Directory.Exists) после доступа к каталогу с помощью Explorer, он возвращает true.Конечно, я могу гарантировать, что каталог действительно существует с первой попытки.

В чем причина такого поведения?Что я могу с этим поделать?

Редактировать: Кажется, что windows не может подключить сетевой диск к удаленному компьютеру.Когда я пытаюсь перейти в каталог с помощью Проводника, он автоматически пытается подключить диск.

Таким образом, вопрос меняется: Есть ли способ заставить Windows попытаться восстановить соединение через .NET?

Решение: Повторное подключение отключенного сетевого диска

Ответы [ 3 ]

4 голосов
/ 24 июня 2014

Я не уверен, с какой версией mpr.dll работает вышеуказанная ссылка на решение, но я использую Win7 и имею немного другую версию (хотя и похожую).Эта точка входа:

    [DllImport("mpr.dll", SetLastError = true, EntryPoint = "WNetRestoreSingleConnectionW", CharSet = CharSet.Unicode)]
    internal static extern int WNetRestoreSingleConnection( IntPtr windowHandle,
                                                            [MarshalAs(UnmanagedType.LPWStr)] string localDrive,
                                                            [MarshalAs(UnmanagedType.Bool)] bool useUI);

, затем:

IntPtr hWnd = new IntPtr(0);
int res = WNetRestoreSingleConnection(hWnd, <your drive path>, false);

Вам нужно будет добавить свою собственную проверку / обработку ошибок.

2 голосов
/ 07 февраля 2014

Я тоже использую удаленный диск, и для подключения требуется несколько секунд, поэтому я просто жду и каждый раз работаю.Если он не подключится, он отправит электронное письмо, и я проверю его.

        logger.Info("Create Z: drive ");
        System.Diagnostics.Process process = new System.Diagnostics.Process();
        System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
        startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
        startInfo.FileName = "cmd.exe";
        startInfo.Arguments = @"/C net use z: \\" + Tools.servername + @"\SHARE_NAME_HERE /user:USER_NAME_HERE PASSWORD_HERE";
        process.StartInfo = startInfo;
        process.Start();
        logger.Info("Z: drive created ");

        // wait get Z:
        int xtimestimeout = 5;
        while (!Directory.Exists(@"Z:\") & (xtimestimeout > 0))
        {
            Application.DoEvents();
            SetBalloonTip(@"Program", @"connecting... please wait");
            ShowBalloon();
            logger.Info("Creating Z:... waiting...");
            Application.DoEvents();
            System.Threading.Thread.Sleep(3000);
            xtimestimeout -= 1;
        }

        // check for sucessfull creation of Z: in server Z:\somedirectory
        if (!Directory.Exists(@"Z:\"))
        {
            SendEmail2("Oh my... help!", "drive Z: not created <<< CHECK!");
            logger.Info("Z: email sent because of not created");
        }
        logger.Info("Z: drive created successfully.");
0 голосов
/ 25 декабря 2011

В чем причина такого поведения?

Цитата из документации :

Если у вас нет как минимум разрешения на чтение только для каталога, метод Exists вернет false.


Что я могу с этим поделать?

Убедитесь, что вы запускаете приложение .NET под учетной записью, у которой есть хотя бы разрешение только на чтение для доступа к этой папке. Обратите внимание, что если вы пишете это в приложении ASP.NET, это, вероятно, не так, поэтому в зависимости от того, под какой учетной записью вы настроили веб-сервер для выполнения приложения, выполните необходимые шаги для предоставления разрешений этой учетной записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...