Layanan Windows. Cari kesalahan sistem dan tampilkan di WinForm C #

Pada artikel ini, kita akan melihat cara membuat aplikasi dari awal yang akan bekerja dengan layanan windows dan menampilkan kesalahan sistem di WinForm (C #).

Garis besar artikel ini:

  • Penciptaan Layanan
  • Penampil acara
  • Kode Layanan
  • Memeriksa layanan (Memulai layanan secara manual)
  • Pemetaan WinForm

Penciptaan Layanan


Buka Visual Studio. File Selanjutnya → Baru → Proyek → (Windows Desktop) → Layanan Windows (.Net Framework) → Oke.

Selanjutnya Anda perlu membuat installer. Di jendela yang terbuka, klik RMB dan pilih "Add Installer". Anda akan memiliki "ProjectInstaller.cs [Desain]" dibuat, setelah itu Anda harus pergi ke kode "F7" atau RMB "Lihat Kode". Anda perlu menemukan baris "InitializeComponent ();", letakkan kursor di atasnya dan tekan "F12", maka Anda perlu menambahkan baris berikut:

this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem; //       this.serviceInstaller1.Description = "Show me system error."; //       this.serviceInstaller1.DisplayName = "GetSystemError"; //        

Tetapi Anda perlu menambahkan baris-baris ini hanya dalam urutan dan tempat berikut. Kalau tidak, akan ada kesalahan saat menginstal layanan.



Penampil acara


Ini diperlukan untuk memverifikasi operasi yang benar dari program kami.

Event Viewer - program untuk melihat log peristiwa yang ada di setiap komputer dengan windows. Setiap program yang berjalan di komputer menerbitkan pemberitahuan di log peristiwa sebelum berhenti. Setiap akses ke sistem, perubahan keamanan, penyetelan sistem operasi, kegagalan perangkat keras dan kegagalan driver - semua ini masuk ke log peristiwa. Peraga Peristiwa memindai file log teks, menggabungkannya dan menempatkannya di antarmuka.

Bagaimana cara membukanya? - Mulai → Peraga Peristiwa (dalam pencarian) → “Lihat log peristiwa”.

Selanjutnya, "Tampilan Kustom" → "Acara Administratif." Di sini kita dapat melihat semua kesalahan, peringatan dan informasi tentang mereka.

Ada 3 jenis log: Aplikasi (Aplikasi), Sistem (Sistem) dan Keamanan (Keamanan). Kami hanya membutuhkan sistem (Sistem).

Kode Layanan


Kami menemukan file .cs dengan nama layanan, saya memilikinya "Service1.cs", buka. File harus memiliki 2 metode yang diganti:

  • OnStart (string [] args) - dijalankan ketika layanan dimulai,
  • OnStop () - dijalankan ketika layanan dihentikan.

Ada juga beberapa metode lagi, tetapi kami tidak membutuhkannya sekarang. Anda dapat menemukannya sendiri.

Data yang kami dapatkan akan disimpan dalam file teks yang diperbarui, jadi kami menambahkan

 using System.IO; 

Tambahkan kode ke metode OnStart (string [] args):

 EventLog myLog; //       string filepath = AppDomain.CurrentDomain.BaseDirectory + @"\ServiceLog.txt";; //    List<string> list; //    protected override void OnStart(string[] args) { myLog = new EventLog(); myLog.Log = "System"; //     - (Application),    (System). myLog.Source = "System Error"; for (int index = myLog.Entries.Count - 1; index > 0; index--) //         { var errEntry = myLog.Entries[index]; \\     if (errEntry.EntryType == EventLogEntryType.Error) \\    { //     var appName = errEntry.Source; list = new List<string>(); list.Add("Entry Type: " + Convert.ToString(errEntry.EntryType)); list.Add("Event log: " + (string)myLog.Log); list.Add("Machine Name: " + (string)errEntry.MachineName); list.Add("App Name: " + (string)errEntry.Source); list.Add("Message: " + (string)errEntry.Message); list.Add("Time Written: " + errEntry.TimeWritten.ToString()); list.Add("-*-"); WriteToFile(list); //    } } } public void WriteToFile(List<string> list) //   { using (StreamWriter sw = File.AppendText(filepath)) { for (int i = 0; i < list.Count; i++) sw.WriteLine(list[i]); } } 

Selanjutnya, Anda perlu mengumpulkan solusi "Solusi" -> "Rebuild Solution". Setelah perakitan berhasil, Anda dapat memeriksa operasi.

Memeriksa layanan (Memulai layanan secara manual)


Layanan windows tidak dapat dimulai sebagai aplikasi biasa. Anda hanya dapat menjalankan melalui baris perintah sebagai administrator.

Jalankan baris perintah sebagai administrator. Masukkan perintah berikut:

 cd C:\Windows\Microsoft.NET\Framework\v4.0.30319 InstallUtil.exe \  .exe (InstallUtil.exe C:\Users\\source\repos\WindowsService1\WindowsService1 \bin\Debug\WindowsService1.exe)    : InstallUtil.exe -u \  .exe 

Selanjutnya, tekan tombol Win + R. Masukkan "Services.msc". Kami menemukan layanan kami dalam daftar, klik di atasnya, dan klik "Mulai". Setelah peluncuran berhasil, file akan dihasilkan di jalur yang ditentukan dalam kode di mana daftar kesalahan sistem akan ditemukan.
Jangan lupa untuk menghapus layanan setelah verifikasi.

Pemetaan WinForm


Untuk ditampilkan di konsol, jika Anda mencoba, Anda dapat menemukan artikel, tetapi saya tidak menemukannya untuk ditampilkan di WinForm, jadi ini dia. Secara default, proyek layanan dibuat dari tipe Aplikasi. Untuk ditampilkan melalui konsol, parameter ini harus diubah dalam pengaturan, agar WinForm membiarkannya apa adanya. Selanjutnya Anda perlu menambahkan formulir ke proyek. “WindowsService1” → RMB → Tambah → Formulir Windows → Tambah. Dan lakukan desain berikut. Selanjutnya, ubah file "Program.cs".

Tambahkan menggunakan:

 using System.Windows.Forms; using System.Security.Principal; using System.ComponentModel; using System.Diagnostics; 

Dan ubah metode Utama:

 static void Main(string[] args) { WindowsPrincipal windowsPricipal = new WindowsPrincipal(WindowsIdentity.GetCurrent()); bool hasAdministrativeRight = windowsPricipal.IsInRole(WindowsBuiltInRole.Administrator); if (hasAdministrativeRight == false) //    { ProcessStartInfo processInfo = new ProcessStartInfo(); //   processInfo.Verb = "runas"; //       processInfo.FileName = Application.ExecutablePath; try { Process.Start(processInfo); //   } catch (Win32Exception){} Application.Exit(); } else { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1(args)); //  } } 

Tambahkan kelas baru "SystemError". ("WindowsService1" -> RMB -> Tambah -> Kelas -> Tambah). Di sini kita akan menyimpan data kesalahan. Ubah itu:

 public string EntryType{ get; set; } public string EventLog{ get; set; } public string MachineName { get; set; } public string AppName { get; set; } public string Message { get; set; } public string TimeWritten { get; set; } 

Lebih lanjut dalam "Service1.cs" kami menambahkan metode "RunFromForm (string [] args)" yang memulai layanan.

 public void RunFromForm(string[] args) { OnStart(args); OnStop(); } 

Tambahkan kelas baru "GetListErrors". ("WindowsService1" -> RMB -> Tambah -> Kelas -> Tambah). Di sini kita akan mendapatkan data dari file tersebut. Tambahkan menggunakan:

 using System.IO; 

Ubah itu:

 string filepath = AppDomain.CurrentDomain.BaseDirectory + @"\ServiceLog.txt"; SystemError systemError; public List<SystemError> listSysErrs; public void ReadFile() //          { systemError = new SystemError(); listSysErrs = new List<SystemError>(); using (StreamReader sr = new StreamReader(filepath)) { string line; while ((line = sr.ReadLine()) != null) { if (line.Contains("-*-")) { listSysErrs.Add(systemError); systemError = new SystemError(); //       } if (line.Contains("Entry Type")) { systemError.EntryType = line.Substring(12); } else if (line.Contains("Event log")) { systemError.EventLog = line.Substring(11); } else if (line.Contains("Machine Name")) { systemError.MachineName = line.Substring(14); } else if (line.Contains("App Name")) { systemError.AppName = line.Substring(10); } else if (line.Contains("Message")) { systemError.Message = line.Substring(9); } else if (line.Contains("Time Written")) { systemError.TimeWritten = line.Substring(14); } } } } 

Selanjutnya, ubah kode dari form "Form1.cs". Tambahkan menggunakan:

 using System.ServiceProcess; using System.Diagnostics; 

Ubah itu:

 Service1 service = new Service1(); List<SystemError> listSysErrs; string[] args; public Form1(string[] args) { InitializeComponent(); this.args = args; if (Environment.UserInteractive)//          { service.RunFromForm(args); //  GetListErrors getListErrors = new GetListErrors(); getListErrors.ReadFile(); //      listSysErrs = getListErrors.listSysErrs; FillDataGridView(); //    } else { ServiceBase[] ServicesToRun; ServicesToRun = new ServiceBase[] { service }; ServiceBase.Run(ServicesToRun); } } public void FillDataGridView() //     { foreach (SystemError item in listSysErrs) { dataGridView1.Rows.Add(item.AppName, item.Message); } } private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) //                { SystemError sys = listSysErrs[dataGridView1.CurrentRow.Index]; label1.Text = "Entry Type: " + sys.EntryType + "\nEvent log: " + sys.EventLog + "\nMachine Name: " + sys.MachineName + "\nApp Name: " + sys.AppName + "\n\nMessage: " + FormatMessage(sys.Message) + "\n\nTime Written: " + sys.TimeWritten; } private string FormatMessage(string msg) //       ,                 { string retMsg = ""; int count = 75; if (msg.Length > count - 9) { retMsg += msg.Substring(0, count - 9) + "\n"; msg = msg.Substring(count - 9); } while (msg.Length > count) { retMsg += msg.Substring(0, count) + "\n"; msg = msg.Substring(count); } retMsg += msg + "\n"; return retMsg; } private void button1_Click(object sender, EventArgs e) //          { if (Environment.UserInteractive) { while (dataGridView1.Rows.Count != 0) { dataGridView1.Rows.Remove(dataGridView1.Rows[dataGridView1.Rows.Count - 1]); } service.RunFromForm(args); GetListErrors getListErrors = new GetListErrors(); getListErrors.ReedFile(); listSysErrs = getListErrors.listSysErrs; FillDataGridView(); } else { ServiceBase[] ServicesToRun; ServicesToRun = new ServiceBase[] { service }; ServiceBase.Run(ServicesToRun); } } private void button2_Click(object sender, EventArgs e) { Process.Start(AppDomain.CurrentDomain.BaseDirectory); //  } 

Sekarang Anda dapat memulai layanan sebagai aplikasi biasa. Hasilnya adalah sebagai berikut:

Source: https://habr.com/ru/post/id452688/


All Articles