2017-02-01 2 views
0

J'ai un service Windows interactif qui s'exécute sur un compte Système local et avec la case à cocher Interact with desktop checked (ceci est obligatoire pour mon projet car mon service doit appeler .exe avec UI). Je reçois une exception en tant qu'accès refusé lors de l'écriture sur le lecteur réseau. Je passe le chemin UNC du fichier de configuration. J'ai essayé de donner un accès de contrôle complet à l'utilisateur anonyme sur le dossier auquel je veux accéder, mais il ne fonctionne toujours pas. Je ne peux pas exécuter mon service Windows sous un compte de service réseau ou sous un autre compte comme suggéré dans d'autres messages car je veux que l'interaction avec le bureau soit cochée. Y'a-t-il une quelconque façon de réussir cela?Windows Exception d'accès refusée lors de l'écriture sur le lecteur réseau

Edit: chemin UNC du lecteur réseau: // serveur/ABC/pqr

mon service devrait créer un fichier txt dans le dossier pqr. devrait avoir accès à la suppression après-mots aussi.

J'ai essayé de créer l'utilisateur anonyme pour le dossier de pqr et lui donnant le plein contrôle mais j'obtiens toujours l'exception refusée. Comme je l'ai mentionné avant je ne peux pas l'exécuter sous un autre compte autre que le compte système local, car il désactivera automatiquement interagir avec l'option de bureau dans les propriétés de ce service. existe-t-il un moyen de le faire fonctionner sous le compte de service réseau tout en le maintenant interactif (interagir avec l'option de bureau vérifiée dans les propriétés du service)?

+0

est l'accès réellement fait par l'utilisateur « anonyme »? Je suppose que non. Vous pouvez ouvrir la cible pour "Tous" - mais cela est plutôt désapprouvé par les administrateurs :) Pouvez-vous voir dans Windows EventLogs (de la machine cible) quel utilisateur s'est vu refuser l'accès? – Fildor

+0

Je sais que vous dites que vous devez avoir la fonctionnalité "interagir avec le bureau" mais que c'est ce qui vous empêche d'utiliser des solutions standard * et * il existe des solutions standard (séparation du code en code service et code UI). lorsque les utilisateurs se connectent et utilisent RPC pour permettre aux deux ensembles de code de communiquer). –

Répondre

0

Essayez d'utiliser le package pépite suivant nommé SimpleImpersonation

De cette façon, vous pouvez envelopper le code que vous utilisez pour accéder à l'emplacement de votre fichier distant comme celui-ci:

using (Impersonation.LogonUser(domain, username, password, logonType)) 
{ 
    // do whatever you want as this user. 
} 

Il a travaillé pour moi. Je l'ai utilisé pour allumer et éteindre un service Windows à distance. Comme ceci:

await Task.Factory.StartNew(() => 
      { 
       using (
        Impersonation.LogonUser(serviceInfo.Domain, serviceInfo.User, serviceInfo.Pswd, 
         Environment.MachineName.Equals(serviceInfo.ComputerName, 
          StringComparison.InvariantCultureIgnoreCase) 
          ? LogonType.Network 
          : LogonType.Interactive)) 
       { 
        var service = new ServiceController(serviceInfo.ServiceName, serviceInfo.ComputerName); 
        if (service.Status == ServiceControllerStatus.Stopped) 
        { 
         service.Start(); 
         service.WaitForStatus(ServiceControllerStatus.Running, TimeSpan.FromSeconds(60)); 
        } 
        else 
        { 
         service.Stop(); 
         service.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(60)); 
        } 
       } 
      }); 

(l'extrait a été pris sur le site du projet)