Bermain-main dengan windows service

Posted by Kamarudin • 3 minute read • Comments

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 &quot;kernel32&quot; (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function WaitForSingleObject Lib &quot;kernel32&quot; (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib &quot;kernel32&quot; (ByVal hObject As Long) As Long

Private Const SYNCHRONIZE       As Long = &amp;H100000
Private Const INFINITE          As Long = &amp;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 = &quot;cmd /c &quot; &amp; 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(&quot;sc stop MySQL&quot;) 'menghentingan service mysql
    Call execCommand(&quot;sc start MySQL&quot;) 'menjalankan service mysql
    Call execCommand(&quot;sc delete MySQL&quot;) '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 = &quot;|&quot; 'separator baris
Private Const COL_SPR           As String = &quot;#&quot;  'separator kolom
Private Const FILE_SERVICE      As String = &quot;c:\services.txt&quot; '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(&quot;sc query state= all >; &quot; &amp; 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) = &quot;SERVICE_NAME&quot; Then tmp2 = tmp2 &amp; Mid$(tmp1, 15) &amp; COL_SPR

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

            'state->; status service: stopped, running dan lain-lain
            If InStr(1, tmp1, &quot;STATE&quot;) >; 0 Then tmp2 = tmp2 &amp; Mid$(tmp1, 25) &amp; 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 , , &quot;Service&quot;, 5000
        .ColumnHeaders.Add , , &quot;Status&quot;, 1500

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

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

Selamat mencoba :blush:

Comments