2017-02-01 14 views
0

У меня есть служба интерактивных окон, которая выполняется на флажке Локальная система и флажок «Взаимодействие с рабочим столом» (это обязательно для моего проекта, так как моей службе необходимо вызвать .exe с UI). Я получаю исключение, поскольку доступ запрещен при записи на сетевой диск. Я передаю путь UNC из файла конфигурации. я попытался предоставить полный доступ к управлению анонимным пользователям в папке, к которой я хочу получить доступ, но ее все еще не работает. Я не могу запустить мою службу Windows в учетной записи службы сети или любой другой учетной записи, как это предлагается в некоторых других сообщениях, потому что я хочу, чтобы она взаимодействовала с рабочим столом. есть ли способ достичь этого?Служба Windows Service получает доступ к исключению при записи на сетевой диск

Edit: UNC путь сетевого диска: // сервер/ABC/PQR

моя служба должна создать файл .txt в папке ПКР. должен иметь доступ также для удаления его послесловий.

Я попытался создать анонимного пользователя для папки pqr и дать ему полный контроль, но все же я получаю доступ к исключенному исключению. как я уже упоминал ранее, я не могу запустить его под любой другой учетной записью, кроме учетной записи локальной системы, потому что она автоматически отключит взаимодействие с опцией рабочего стола в свойствах этой службы. есть ли способ заставить его работать под учетной записью сетевой службы и по-прежнему поддерживать ее в интерактивном режиме (взаимодействие с опцией рабочего стола проверяется в свойствах службы)?

+0

является доступ фактически осуществляется через «анонимный» пользователя? Наверное, нет. Вы можете открыть цель для «Все» - но это довольно недовольные админами :) Вы можете видеть в Windows EventLogs (на целевой машине), которой пользователю был отказано в доступе? – Fildor

+0

Я знаю, что вы говорите, что у вас должна быть функция «взаимодействовать с рабочим столом», но это тот аспект, который мешает вам использовать стандартные решения * и * есть стандартные обходные пути (разделение кода на служебный код и код пользовательского интерфейса, запуск последнего когда пользователи вступают в систему и используют RPC, чтобы позволить двум наборам кода взаимодействовать). –

ответ

0

Попробуйте использовать следующий самородок пакет с именем SimpleImpersonation

Таким образом, вы можете обернуть код, который вы используете для доступа к удаленному местоположению файла, как это:

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

Он работал для меня. Я использовал его для включения и отключения службы Windows удаленно. Как это:

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)); 
        } 
       } 
      }); 

(фрагмент кода был взят с сайта проекта)