2016-01-20 2 views
0

Я пытаюсь отправить пользовательские команды в службу Windows. В моем приложении есть служба Windows и форма. Когда служба выполняется, я хочу создать файл в изолированном хранилище с помощью события нажатия кнопки. Я использую этот учебник http://arcanecode.com/2007/05/30/windows-services-in-c-sending-commands-to-your-windows-service-part-7/. Когда я запускаю программу и нажимаю кнопку, ничего не происходит, и файл не помещается в изолированное хранилище. Я поставил точки останова на эти методы, чтобы убедиться, что они выполняются, и они, похоже, работают. Я не уверен, что метод нажатия кнопки может достичь кода изолированного хранилища в сервисе из формы, но в соответствии с этим руководством я не вижу проблемы. Исходный код ниже.Отправка команд в службу Windows

Форма

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.ServiceProcess; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using Project2Service; 

namespace Project2 
{ 
    public partial class Form1 : Form 
    { 
     public Service1 s = new Service1(); 
     public ServiceInstaller si = new ServiceInstaller(); 
     public ProjectInstaller pi = new ProjectInstaller(); 
     public ServiceController sc = new ServiceController("Project2Service"); 

     private string[] isoType; 

     string machineName = System.Windows.Forms.SystemInformation.ComputerName; 

     public Form1() 
     { 
      InitializeComponent(); 

      isoType = new string[] { "User", "Assembly And Domain"}; 
      cboIsoType.Items.AddRange(isoType); 

      cboIsoType.SelectedIndex = 0; 

      btnContinue.Enabled = false; 
      btnPause.Enabled = false; 
      btnStop.Enabled = false; 
     } 

     public void Labels() 
     { 
      lblMachine.Text = machineName; 
      lblSName.Text = s.ServiceName; 
      lblSType.Text = si.StartType.ToString(); 

      lblSStatus.Text = sc.Status.ToString(); 
      lblPause.Text = sc.CanPauseAndContinue.ToString(); 
      lblShutdown.Text = sc.CanShutdown.ToString(); 
      lblStop.Text = sc.CanStop.ToString(); 
     } 

     private void btnStart_Click(object sender, EventArgs e) 
     { 
      //Controller.Refresh(); //Gets the current status of service 
      //if (Controller.Status == ServiceControllerStatus.Stopped) 
      //{ 
      // Controller.Start(); 
      //} 

      sc.Start(); 
      sc.WaitForStatus(ServiceControllerStatus.Running); 
      Labels(); 

      btnStart.Enabled = false; 
      btnContinue.Enabled = false; 
      btnStop.Enabled = true; 
      btnPause.Enabled = true; 

     } 

     private void btnStop_Click(object sender, EventArgs e) 
     { 
      sc.Stop(); 
      sc.WaitForStatus(ServiceControllerStatus.Stopped); 
      Labels(); 

      btnStart.Enabled = true; 
      btnContinue.Enabled = false; 
      btnPause.Enabled = false; 
      btnStop.Enabled = false; 
     } 

     private void btnPause_Click(object sender, EventArgs e) 
     { 
      sc.Pause(); 
      sc.WaitForStatus(ServiceControllerStatus.Paused); 
      Labels(); 

      btnPause.Enabled = false; 
      btnContinue.Enabled = true; 
      btnStart.Enabled = false; 
      btnStop.Enabled = true; 
     } 

     private void btnContinue_Click(object sender, EventArgs e) 
     { 
      sc.Continue(); 
      sc.WaitForStatus(ServiceControllerStatus.Running); 
      Labels(); 

      btnStop.Enabled = true; 
      btnStart.Enabled = false; 
      btnPause.Enabled = true; 
      btnContinue.Enabled = false; 
     } 

     private void btnSubmit_Click(object sender, EventArgs e) 
     { 
      ServiceController sc2 = new ServiceController("Project2Service"); 
      sc2.ExecuteCommand(200); 

      //if (cboIsoType.SelectedItem.ToString() == "User") 
      //{ 

      // sc.ExecuteCommand(128); 
      //} 
     } 
    } 
} 

Сервис

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Diagnostics; 
using System.IO; 
using System.IO.IsolatedStorage; 
using System.Linq; 
using System.ServiceProcess; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace Project2Service 
{ 
    public partial class Service1 : ServiceBase 
    { 
     public enum commands 
     { 
      LogIt = 200 
     } 

     //public enum ServiceCustomCommands { Command1 = 128, Command2 = 129 }; 
     //private IsolatedStorageScope iso; 

     public Service1() 
     { 
      InitializeComponent(); 
     } 

     protected override void OnStart(string[] args) 
     { 

      //iso = IsolatedStorageScope.User | IsolatedStorageScope.Domain; 
      FileSystemWatcher Watcher = new FileSystemWatcher(@"C:\Users\Martin\Desktop\Project2\ServiceTest"); 
      Watcher.EnableRaisingEvents = true; 
      Watcher.NotifyFilter = NotifyFilters.LastAccess 
         | NotifyFilters.LastWrite 
         | NotifyFilters.FileName 
         | NotifyFilters.DirectoryName; 

      Watcher.Changed += new FileSystemEventHandler(Watcher_Changed); 
      Watcher.Created += new FileSystemEventHandler(Watcher_Created); 
      Watcher.Deleted += new FileSystemEventHandler(Watcher_Deleted); 
      Watcher.Renamed += new RenamedEventHandler(Watcher_Renamed); 
      WriteServiceInfo("Service Started!"); 
     } 

     // This event is raised when a file is changed 
     private void Watcher_Changed(object sender, FileSystemEventArgs e) 
     { 
      WriteServiceInfo("File Changed!"); 

      DirectoryInfo d = new DirectoryInfo(@"C:\Users\Martin\Desktop\Project2\ServiceTest");//Assuming Watch is your Folder 
      FileInfo[] Files = d.GetFiles("*.txt"); //Getting Text files 
      string str = ""; 
      foreach (FileInfo file in Files) 
      { 
       str = str + ", " + file.Name; 
       str = str + ", " + file.LastWriteTime; 
       str = str + ", " + file.CreationTime; 
       str = str + ", " + file.Length; 

       WriteServiceInfo(file.Name); 
       WriteServiceInfo(file.LastWriteTime.ToString()); 
       WriteServiceInfo(file.CreationTime.ToString()); 
       WriteServiceInfo(file.Length.ToString()); 
      } 
     } 

     private void Watcher_Created(object sender, FileSystemEventArgs e) 
     { 
      WriteServiceInfo("File Created!"); 
     } 

     private void Watcher_Deleted(object sender, FileSystemEventArgs e) 
     { 
      WriteServiceInfo("File Deleted!"); 
     } 
     private void Watcher_Renamed(object sender, FileSystemEventArgs e) 
     { 
      WriteServiceInfo("File Renamed!"); 
     } 

     private void WriteServiceInfo(string info) 
     { 
      FileStream fs = new FileStream(@"C:\Users\Martin\Desktop\Project2\WindowsServiceLog.txt", 
           FileMode.OpenOrCreate, FileAccess.Write); 
      StreamWriter m_streamWriter = new StreamWriter(fs); 
      m_streamWriter.BaseStream.Seek(0, SeekOrigin.End); 
      m_streamWriter.WriteLine(info + "\n"); 
      m_streamWriter.Flush(); 
      m_streamWriter.Close(); 
     } 

     protected override void OnStop() 
     { 
      WriteServiceInfo("Service Stopped!"); 

     } 

     protected override void OnCustomCommand(int command) 
     { 
      base.OnCustomCommand(command); 
      if (command == (int)commands.LogIt) 
      { 
       IsolatedStorageFile isoFile = IsolatedStorageFile.GetStore(IsolatedStorageScope.User | IsolatedStorageScope.Domain | IsolatedStorageScope.Assembly, null, null); 
       IsolatedStorageFileStream isoStream = new IsolatedStorageFileStream("LaptopInfo.txt", FileMode.Append, FileAccess.Write, isoFile); 
       using (StreamWriter writer = new StreamWriter(isoStream)) 
       { 
        writer.WriteLine("Data"); 
       } 
      } 
     } 

     //protected override void OnCustomCommand(int command) 
     //{ 
     // switch ((ServiceCustomCommands)command) 
     // { 
     //  case ServiceCustomCommands.Command1: 
     //   //Command1 Implementation 
     //   IsolatedStorageFile isoFile = IsolatedStorageFile.GetStore(IsolatedStorageScope.User | IsolatedStorageScope.Domain | IsolatedStorageScope.Assembly, null, null); 
     //   IsolatedStorageFileStream isoStream = new IsolatedStorageFileStream("LaptopInfo.txt", FileMode.Append, FileAccess.Write, isoFile); 
     //   using (StreamWriter writer = new StreamWriter(isoStream)) 
     //   { 
     //    writer.WriteLine("Data"); 
     //   } 
     //   //iso = IsolatedStorageScope.User; 
     //   break; 
     //  case ServiceCustomCommands.Command2: 
     //   //iso = IsolatedStorageScope.User | IsolatedStorageScope.Assembly; 
     //   break; 
     //  default: 
     //   break; 

     // } 
     //} 
    } 
} 
+1

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

+0

отправить мне свой проект adamt в Microsoft я буду проверять его –

+0

Как я сделал бы это @ AdamTuliper-MSFT –

ответ

0

Там пара вещей здесь: 1. Проверьте счет ваша служба работает как. С помощью вашего установщика услуг вы можете указать. Я протестировал ваш точный сценарий (используя ваш код) с системой, чтобы я мог получить доступ к файлам на моем рабочем столе в качестве теста журнала, и он отлично работал. 2. Ограничьте тестовый кейс, чтобы не регистрироваться в изолированном, а просто в текстовом файле.

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

+0

Я взял эти два сценария и реализовал их. Учетная запись службы работает LocalSystem, и я забрал изолированную часть хранения и просто написал текстовый файл 'WriteServiceInfo (« данные, записанные в изолированное хранилище »)' и он работает. Проблема с помещением файла в IsolStorage. Пользовательские команды работают. –

+0

Jusy любопытно, с системными правами и запуском службы, почему вы используете локальное хранилище, а не обычный файл? Также, если вы должны использовать изолированное хранилище, попробуйте запустить службу как определенную учетную запись. –