11
votes

Comment forcer Windows à se reconnecter au lecteur réseau

Nous essayons d'accéder à un répertoire qui se trouve dans un répertoire de réseau, mais obtenez des résultats erronés (C # / Windows): xxx

"z" est le répertoire de réseau, "sessions" est un répertoire. Lorsqu'un logiciel d'enregistrement crée constamment des répertoires (par exemple, «Data1») et met certaines données dedans. Il semble que Windows met en cache le mauvais état sur Data1: la méthode renvoie false. Mais lorsque j'accède à l'annuaire via Explorer, c'est ici. Lorsque j'exécute la méthode (répertoire.exists) après avoir accédé à l'annuaire avec Explorer, il renvoie true. Bien sûr, je peux garantir que le répertoire existe réellement à la première tentative.

Quelle est la raison de ce comportement? Que puis-je faire à ce sujet?

EDIT: Il semble que Windows ne puisse pas connecter le lecteur réseau à l'ordinateur distant. Lorsque j'essaie de naviguer dans le répertoire avec Explorer, il essaie automatiquement de connecter le lecteur.

de sorte que la question change: est là un moyen de forcer Windows à essayer une reconnexion via .net?

Solution: Reconnexion d'un lecteur réseau déconnecté


2 commentaires

Si vous accédez au répertoire avec la commande dir de l'invite de commande, obtenez-vous les informations correctes? C'est: dir z: \ sessions \ data1 .


Non, accéder au répertoire via une invite de commande ne rafraîchit pas la connexion du lecteur réseau. S'il vous plaît voir mon édition ...


3 Réponses :


0
votes

Quelle est la raison de ce comportement?

Devis de la Documentation : < / p>

Si vous n'avez pas à une autorisation minimale en lecture seule sur le répertoire, La méthode existante reviendra de faux.


Que puis-je faire à ce sujet?

S'assurer que vous exécutez votre application .NET sous un compte qui a au moins une autorisation en lecture seule pour accéder à ce dossier. Notez que si vous écrivez cela dans une application ASP.NET, cela ne sera probablement pas le cas, donc selon lequel vous avez configuré votre serveur Web pour exécuter votre demande en vertu de votre application, prenez les mesures nécessaires pour accorder des autorisations sur ce compte.


3 commentaires

Comme l'OP mentionné, "lorsque j'exécute la méthode (répertoire.exists) après avoir accédé au répertoire avec Explorer, il renvoie true." - Ce qui signifie que c'est probablement un problème de mise en cache plutôt que des autorisations plutôt que des autorisations


@ Eugenemayevski'eldoscorp, lorsque vous utilisez l'explorateur, vous l'exécutez sous votre compte. Lorsque vous exécutez une application ASP.NET, il pourrait fonctionner sous un compte totalement différent. Donc, je suppose que le test que l'OP effectué pour vérifier que le répertoire existe n'a pas été effectué dans des conditions égales: au premier cas, il utilisait son propre compte alors que dans la seconde, un autre autre compte est utilisé (nous ne pouvions deviner que la seule à ce stade que l'OP a fourni exactement 0 contexte sur son application).


La question a changé en raison de certaines découvertes que j'ai faites, s'il vous plaît voir mes modifications.



2
votes

IE TROP UTILISEZ UNE DISTANCE REMOTE ET ALLÈS QUELQUES SECONDES POUR CONNECTER, alors j'attends et travaille à chaque fois. S'il ne se connecte pas, il enverra un email et je vais vérifier.

        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.");


2 commentaires

Eh bien, quelqu'un a signalé ma réponse avec -1. Je ne comprends pas pourquoi parce que j'ai aussi la même situation que la question et ce code le résout. Ce code fonctionne et utilise uniquement le code .NET, pas la bibliothèque externe comme la réponse marquée comme solution.


Ne vous inquiétez pas, je compte en vouloir. C'est en fait une bonne solution, exactement ce que j'essaie de faire. Mais je ne veux pas non plus que la fenêtre CMD apparaisse. Cependant, je n'ai pas testé votre code, mais cela semble prometteur. Merci.



6
votes

Je ne suis pas sûr de la version de mpr.dll la solution de la solution ci-dessus fonctionne avec, mais j'utilise Win7 et que vous avez une version légèrement différente (bien que similaire). Ce point d'entrée est le suivant: xxx

alors: xxx

Vous devez ajouter votre propre vérification / manipulation d'erreurs.


1 commentaires

Même si l'API est sans papiers (encore?!?) Ceci semble fonctionner sur Windows 10