Home > Visual Basic > Bermain-main dengan windows service

Bermain-main dengan windows service

March 22, 2010

SC is a command line program used for communicating with the NT Service Controller and services.

Ya dengan memanfaatkan tool ini kita bisa dengan mudah melakukan hal-hal berikut :

  1. Menampilkan daftar service
  2. Menghentikan service
  3. Menjalan service
  4. Menghapus service

Jika pada artikel sebelumnya kita sudah berhasil mendaftarkan aplikasi kita sebagai service, pada artikel ini kita akan membuat program dengan fitur diatas.

Artikel ini sendiri merupakan pengembangan dari artikel sebelumnya.

Sebelum kita masuk pada pembahasan inti kita akan bermain-main dulu dengan beberapa perintah SC berikut :

1. Menampilkan daftar service

sc query state= all

Contoh output yang dihasilkan

Informasi berharga yang kita dapatkan dari output diatas adalah SERVICE_NAME, DISPLAY_NAME dan STATE.

Langkah berikutnya kita akan meyimpan output ini ke file text yang mana akan kita olah via program, misal kita akan simpan dengan nama services.txt di lokasi drive c:\.

sc query state= all > c:\service.txt

Contoh output setelah disimpan di file text

2. Menghentikan service

sc stop <SERVICE_NAME>

3. Menjalan service

sc start <SERVICE_NAME>

4. Menghapus service

sc delete <SERVICE_NAME>

Semua perintah SC yang dibutuhkan sudah kita dapatkan, sekarang kita masuk ke pembahasa inti.

Contoh program yang akan kita buat seperti berikut :

1. Prosedur untuk menjalankan command line

Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Private Const SYNCHRONIZE       As Long = &H100000
Private Const INFINITE          As Long = &HFFFF

Private Sub execCommand(ByVal cmd As String)
    Dim result  As Long
    Dim lPid    As Long
    Dim lHnd    As Long
    Dim lRet    As Long

    cmd = "cmd /c " & cmd
    result = Shell(cmd, vbHide)

    lPid = result
    If lPid <> 0 Then
        lHnd = OpenProcess(SYNCHRONIZE, 0, lPid)
        If lHnd <> 0 Then
            lRet = WaitForSingleObject(lHnd, INFINITE)
            CloseHandle (lHnd)
        End If
    End If
End Sub

Prosedur diatas tidak hanya menggunakan perintah Shell biasa tetapi juga menggunakan fungsi API OpenProcess dan WaitForSingleObject untuk mengetahui eksekusi perintah sudah selesai/belum.

Contoh penggunaan prosedur diatas

Private Sub cmdTes_Click()
    Call execCommand("sc stop MySQL") 'menghentingan service mysql
    Call execCommand("sc start MySQL") 'menjalankan service mysql
    Call execCommand("sc delete MySQL") 'menghapus service mysql
End Sub

2. Menampilkan service

Objek yang kita gunakan untuk menampilkan daftar service adalah ListView dan untuk iconnya disimpan di komponen ImageList.

Private Const REC_SPR           As String = "|" 'separator baris
Private Const COL_SPR           As String = "#"  'separator kolom
Private Const FILE_SERVICE      As String = "c:\services.txt" 'file untuk menampung output perintah SC

Private Sub showService()
    Dim i               As Long
    Dim fileHandler     As Integer

    Dim tmp1            As String
    Dim tmp2            As String
    Dim arrCol()        As String
    Dim arrRec()        As String

    Call execCommand("sc query state= all > " & FILE_SERVICE)

    fileHandler = FreeFile

    Open FILE_SERVICE For Input As fileHandler
    Do While Not EOF(fileHandler)
        Input #fileHandler, tmp1
        If Len(tmp1) > 0 Then
            'ambil nama service
            'nama service dibutuhkan untuk proses start, stop dan delete service
            If Left(tmp1, 12) = "SERVICE_NAME" Then tmp2 = tmp2 & Mid$(tmp1, 15) & COL_SPR

            'ambil informasi lengkap service
            If Left(tmp1, 12) = "DISPLAY_NAME" Then tmp2 = tmp2 & Mid$(tmp1, 15) & COL_SPR

            'state-> status service: stopped, running dan lain-lain
            If InStr(1, tmp1, "STATE") > 0 Then tmp2 = tmp2 & Mid$(tmp1, 25) & REC_SPR
        End If
    Loop
    Close fileHandler

    'contoh hasil perulangan diatas :
    'postgresql-8.4#postgresql-8.4 - PostgreSQL Server 8.4#RUNNING|MySQL#MySQL#RUNNING
    'SERVICE_NAME   DISPLAY_NAME                           STATE

    If Len(tmp2) > 0 Then
        tmp2 = Left(tmp2, Len(tmp2) - 1)

        arrRec = Split(tmp2, REC_SPR) 'pecah var tmp2 menjadi beberapa baris, REC_SPR = |
        With ListView1
            .ListItems.Clear
            For i = 0 To UBound(arrRec)
                If Len(arrRec(i)) > 0 Then
                    arrCol = Split(arrRec(i), COL_SPR) 'pecah var arrRec menjadi beberapa kolom, COL_SPR = #

                    'tampilkan ke listview
                    .ListItems.Add , , arrCol(1), , 1 'DISPLAY_NAME
                    .ListItems(i + 1).SubItems(1) = StrConv(arrCol(2), vbProperCase) 'STATE
                    .ListItems(i + 1).SubItems(2) = arrCol(0) 'SERVICE_NAME
                End If
            Next i
        End With
    End If
End Sub

Private Sub Form_Load()
    'inisialisasi listview
    With ListView1
        .View = lvwReport
        .GridLines = True
        .FullRowSelect = True
        .SmallIcons = ImageList1 'inisialisasi ImageList

        .ColumnHeaders.Add , , "Service", 5000
        .ColumnHeaders.Add , , "Status", 1500

        'kolom ini dibutuhkan untuk melakukan aksi terhadap service (start/stop service)
        'widthny diset = 0
        .ColumnHeaders.Add , , "ServiceName", 0
    End With
End Sub

Selesai sudah pembahasan kita kali ini🙂, source code lengkap bisa didownload disini.

Selamat mencoba🙂

  1. sofiadhika
    September 7, 2010 at 9:57 pm

    koding nya di tulis pake VB ya mas ?
    kok bagus banget sih .. ?

    • September 8, 2010 at 12:33 am

      Iya, ternyata mba e penikmat keindahan coding juga ya?😀
      Mungkin karena pengaruh indentasi dalam penulisan kodenya jadi lebih mudah dibaca.

  2. January 22, 2011 at 5:13 am

    begini kakak. klo saya ingin mematikan service tertentu tanpa menampilkan daftar service gimana ya kakak codingnnya…🙂
    jadi klo entar klo softwarenya dibuka cuman ada menu stop ama start..
    misal saya cuman mematikan service automatic update..

    jadi pas saya tekan stop maka service automatic updatenya kestop.
    klo saya tekan start maka service automaticnya jalan lagi..

    nyari referensi dimana2 tapi gak nemu. kemarin nemu blog kakak keren banget..
    so mohon bantuannya ya kakak🙂

    • January 22, 2011 at 7:04 am

      Wedewww ini mau sy panggil om atw adik ya ha ha ha😀, caranya gampang :

      1. cek dulu nama service automatic updatenya
      gambar 1

      nah dari gambar diatas ketaun klo nama service Automatic Updates adalah wuauserv

      2. dengan memanfaatkan prosedur execCommand diatas tinggal ketik perintah berikut :

      Private Sub cmdStopService_Click()
          Call execCommand("sc stop wuauserv") 'menghentingan service Automatic Updates
      End Sub
      
      Private Sub cmdStartService_Click()
          Call execCommand("sc start wuauserv") 'menjalankan service Automatic Updates
      End Sub
      

      Selamt mencoba🙂

  3. January 22, 2011 at 11:32 am

    makasih kakak😀
    langsung di praktekin😀
    pangil adek aja ru 20 thn😀

    • January 23, 2011 at 2:30 am

      Oke dek Yusuf😛

  4. dexari
    April 20, 2011 at 7:02 am

    Mas, kalau pake virtual studio 2008, kok isi upgrade ya ke versi 6.
    kalau codingnya ditulis pake Virtual srudio jadi gimana ya?
    bisa kirimi ke email saya ga?
    baru belajar VB, n masih belum paham😀
    makasi bang admin

    • April 21, 2011 at 2:09 am

      Coba ini om versi VB .NET 2005

  5. dexari
    April 23, 2011 at 2:00 am

    makasi bang admin, tp saia bukan om.wkwkwk

    • April 23, 2011 at 5:52 am

      Oke om😀

  6. Lunx.s
    May 9, 2011 at 11:58 am

    Mas info nya sngat bermanfaat,,

    mau tanya mas, itu kan buat service yg di kompi lokal,
    kalo mau ngjalanin nya ke kompi server tp lewat client gmn mas,,

    mksih sebelumnya,,

    • May 9, 2011 at 12:24 pm

      Yg paling gampang pake remote deskop, radmin, atau RealVNC😀

  7. Tito
    August 23, 2012 at 2:33 pm

    Boss..,
    Mau tanya code untuk check service tertentu yang refresh beberapa detik sekali.
    jika status tiba-tiba Mati, kemudian system akan Start otomatis.

    Tolong pencerahannya, saya punya case service Gammu yang sering Metot…😦

    Thank

    • August 24, 2012 at 6:51 pm

      Untuk mengecek service tertentu, gunakan perintah ini :

      sc query GammuSMSD
      

      Contoh diatas dg asumsi service gammu menggunakan nama default ‘GammuSMSD’

      Om kan programmer, seharusnya sudah bisa mengembangkan sendiri sesuai kebutuhkan berdasarkan kode diatas.

  8. Tito
    August 27, 2012 at 7:58 am

    Admin :
    Untuk mengecek service tertentu, gunakan perintah ini :
    view sourceprint?1sc query GammuSMSD
    Contoh diatas dg asumsi service gammu menggunakan nama default ‘GammuSMSD’
    Om kan programmer, seharusnya sudah bisa mengembangkan sendiri sesuai kebutuhkan berdasarkan kode diatas.

    hehe…, saya masih newbie…,
    Sudah di coba and success…

    Thank🙂

  1. April 16, 2014 at 9:13 am
Comments are closed.
%d bloggers like this: