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 :
Menampilkan daftar service
Menghentikan service
Menjalan service
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
1
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:.
1
sc query state= all > c:\service.txt
Contoh output setelah disimpan di file text
2. Menghentikan service
1
sc stop <SERVICE_NAME>
3. Menjalan service
1
sc start <SERVICE_NAME>
4. Menghapus service
1
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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
1
2
3
4
5
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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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 :)