Как скопировать файл в сетевое расположение из службы Windows? - PullRequest
5 голосов
/ 16 марта 2011

Я хочу, чтобы служба Windows работала на сервере Windows Server 2008, который будет отслеживать каталог на локальном сервере (т. Е. C: \ Watch), и когда в этом каталоге создается новый файл PDF, скопируйте файл в общий сетевой ресурс (т. е. //192.168.1.2/Share).

Ни один из серверов не является членом домена.

Служба Windows имеет свой вход в систему, настроенный для учетной записи локального пользователя, который может получить доступ к // серверу / общему ресурсу, а также создавать и удалять файлы без проблем.

У меня есть следующее, которое прекрасно работает, если sourceDir и destDir являются локальными папками, такими как C: \ Source и C: \ Dest, но если я изменю destDir на сетевое расположение, такое как // server / share / или /// / server // share // Я получаю сообщение об ошибке «Неверный синтаксис имени файла, имени каталога или метки тома».

Обновление: Я больше не получаю сообщение об ошибке выше, и теперь, когда у меня sourceDir установлен в C: \ Watch, а destDir в \ server \ share \ (где сервер может быть Windows или Ubuntu Server, я получаю ошибку System.UnauthorizedAccess, которая Я предполагаю, что идет от сервера назначения. Как я могу установить учетные данные для использования при подключении к серверу назначения. Помните, что серверы не находятся в домене и могут быть окнами или Ubuntu.

public partial class Service1 : ServiceBase
{
    private FileSystemWatcher watcher;
    private string sourceFolder;
    private string destFolder;

    public Service1()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        this.sourceFolder = Properties.Settings.Default.sourceDir;
        this.destFolder = Properties.Settings.Default.destDir;

        watcher = new FileSystemWatcher();
        watcher.Path = this.sourceFolder;
        watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
        watcher.Filter = "*.pdf";

        watcher.Created += new FileSystemEventHandler(watcher_Created);

        watcher.EnableRaisingEvents = true;
    }

    protected override void OnStop()
    {
    }

    private void watcher_Created(object source, FileSystemEventArgs e)
    {
        FileInfo fInfo = new FileInfo(e.FullPath);
        while (IsFileLocked(fInfo))
        {
            Thread.Sleep(500);
        }
        System.IO.File.Copy(e.FullPath, this.destFolder + e.Name);
        System.IO.File.Delete(e.FullPath);
    }
}

Ответы [ 2 ]

4 голосов
/ 16 марта 2011

Общий ресурс сервера будет:

string networkShare = @"\\ServerName\Share\";

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

1 голос
/ 16 марта 2011

На основании ответа Одеда здесь Как только я запустил службу в качестве локального пользователя, который также был настроен на удаленном сервере Ubuntu, все работало как чудо.

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