shell "C:\winnt\system32\cmd.exe /c net start>C:\services.txt",vbhide
用下列API函数 打开服务管理器 SC_HANDLE OpenSCManager( LPCTSTR lpMachineName, // pointer to machine name string LPCTSTR lpDatabaseName, // pointer to database name string DWORD dwDesiredAccess // type of access ); 打开一个服务 SC_HANDLE OpenService( SC_HANDLE hSCManager, // handle to service control manager // database LPCTSTR lpServiceName, // pointer to name of service to start DWORD dwDesiredAccess // type of access to service ); 关闭服务或管理器的句柄 BOOL CloseServiceHandle( SC_HANDLE hSCObject // handle to service or service control // manager database ); 设置服务的状态包括运行,停止,暂停等 BOOL SetServiceStatus( SERVICE_STATUS_HANDLE hServiceStatus~, // service status handle LPSERVICE_STATUS lpServiceStatus // address of status structure );http://expert.csdn.net/Expert/TopicView1.asp?id=2004319 详细内容看msdn
Public Const ERROR_MORE_DATA = 234 Public Const SERVICE_ACTIVE = &H1 Public Const SERVICE_INACTIVE = &H2 Public Const SC_MANAGER_ENUMERATE_SERVICE = &H4 Public Const SERVICE_WIN32_OWN_PROCESS As Long = &H10 Public Const SERVICE_WIN32_SHARE_PROCESS As Long = &H20 Public Const SERVICE_WIN32 As Long = SERVICE_WIN32_OWN_PROCESS + SERVICE_WIN32_SHARE_PROCESS Public Type SERVICE_STATUS dwServiceType As Long dwCurrentState As Long '这里是服务的当前状态,可编程自己取其值出来放到相应数组里 dwControlsAccepted As Long dwWin32ExitCode As Long dwServiceSpecificExitCode As Long dwCheckPoint As Long dwWaitHint As Long End Type Public Type ENUM_SERVICE_STATUS lpServiceName As Long lpDisplayName As Long ServiceStatus As SERVICE_STATUS End Type Public Declare Function OpenSCManager Lib "advapi32.dll" Alias "OpenSCManagerA" (ByVal lpMachineName As String, ByVal lpDatabaseName As String, ByVal dwDesiredAccess As Long) As Long Public Declare Function EnumServicesStatus Lib "advapi32.dll" Alias "EnumServicesStatusA" (ByVal hSCManager As Long, ByVal dwServiceType As Long, ByVal dwServiceState As Long, lpServices As Any, ByVal cbBufSize As Long, pcbBytesNeeded As Long, lpServicesReturned As Long, lpResumeHandle As Long) As Long Public Declare Function CloseServiceHandle Lib "advapi32.dll" (ByVal hSCObject As Long) As Long Public Declare Function lstrcpy Lib "kernel32.dll" Alias "lstrcpyA" (szDest As String, szcSource As Long) As Long Public Function StripTerminator(sInput As String) As String Dim ZeroPos As Integer ZeroPos = InStr(1, sInput, Chr$(0)) If ZeroPos > 0 Then StripTerminator = Left$(sInput, ZeroPos - 1) Else StripTerminator = sInput End If End Function在窗体里代码(窗体内置一list1控件): Private Sub Form_Load() Dim hSCM As Long, lpEnumServiceStatus() As ENUM_SERVICE_STATUS, lngServiceStatusInfoBuffer As Long Dim strServiceName As String * 250, lngBytesNeeded As Long, lngServicesReturned As Long Dim hNextUnreadEntry As Long, lngStructsNeeded As Long, lngResult As Long, i As Long 'Open connection to Service Control Manager. hSCM = OpenSCManager(vbNullString, vbNullString, SC_MANAGER_ENUMERATE_SERVICE) If hSCM = 0 Then MsgBox "OpenSCManager failed. LastDllError = " & CStr(Err.LastDllError) Exit Sub End If 'Get buffer size (bytes) without passing a buffer 'and make sure starts at 0th entry. hNextUnreadEntry = 0 lngResult = EnumServicesStatus(hSCM, SERVICE_WIN32, SERVICE_ACTIVE Or SERVICE_INACTIVE, ByVal &H0, &H0, lngBytesNeeded, lngServicesReturned, hNextUnreadEntry) 'We should receive MORE_DATA error. If Not Err.LastDllError = ERROR_MORE_DATA Then MsgBox "LastDLLError = " & CStr(Err.LastDllError) Exit Sub End If 'Calculate the number of structures needed. lngStructsNeeded = lngBytesNeeded / Len(lpEnumServiceStatus(0)) + 1 'Redimension the array according to our calculation. ReDim lpEnumServiceStatus(lngStructsNeeded - 1) 'Get buffer size in bytes. lngServiceStatusInfoBuffer = lngStructsNeeded * Len(lpEnumServiceStatus(0)) 'Get services information starting entry 0. hNextUnreadEntry = 0 lngResult = EnumServicesStatus(hSCM, SERVICE_WIN32, SERVICE_ACTIVE Or SERVICE_INACTIVE, lpEnumServiceStatus(0), lngServiceStatusInfoBuffer, lngBytesNeeded, lngServicesReturned, hNextUnreadEntry) If lngResult = 0 Then MsgBox "EnumServicesStatus failed. LastDllError = " & CStr(Err.LastDllError) Exit Sub End If 'Get the strings and display them. 'Me.AutoRedraw = True 'Me.Print "All registered services:" + vbCrLf Dim name1 As String
For i = 0 To lngServicesReturned - 1 lngResult = lstrcpy(ByVal strServiceName, ByVal lpEnumServiceStatus(i).lpServiceName) name1 = StripTerminator(strServiceName)
Next i 'Clean up. CloseServiceHandle (hSCM) End Sub自已判断状态(currentstate)后,用下面的api来启动服务: Public Declare Function OpenService Lib "advapi32.dll" Alias "OpenServiceA" (ByVal hSCManager As Long, ByVal lpServiceName As String, ByVal dwDesiredAccess As Long) As Long
打开一个服务 SC_HANDLE OpenService( SC_HANDLE hSCManager, // handle to service control manager // database LPCTSTR lpServiceName, // pointer to name of service to start DWORD dwDesiredAccess // type of access to service
打开服务管理器
SC_HANDLE OpenSCManager(
LPCTSTR lpMachineName, // pointer to machine name string
LPCTSTR lpDatabaseName, // pointer to database name string
DWORD dwDesiredAccess // type of access
);
打开一个服务
SC_HANDLE OpenService(
SC_HANDLE hSCManager, // handle to service control manager
// database
LPCTSTR lpServiceName, // pointer to name of service to start
DWORD dwDesiredAccess // type of access to service
);
关闭服务或管理器的句柄
BOOL CloseServiceHandle(
SC_HANDLE hSCObject // handle to service or service control
// manager database
);
设置服务的状态包括运行,停止,暂停等
BOOL SetServiceStatus(
SERVICE_STATUS_HANDLE hServiceStatus~,
// service status handle
LPSERVICE_STATUS lpServiceStatus // address of status structure
);http://expert.csdn.net/Expert/TopicView1.asp?id=2004319
详细内容看msdn
Public Const SERVICE_ACTIVE = &H1
Public Const SERVICE_INACTIVE = &H2
Public Const SC_MANAGER_ENUMERATE_SERVICE = &H4
Public Const SERVICE_WIN32_OWN_PROCESS As Long = &H10
Public Const SERVICE_WIN32_SHARE_PROCESS As Long = &H20
Public Const SERVICE_WIN32 As Long = SERVICE_WIN32_OWN_PROCESS + SERVICE_WIN32_SHARE_PROCESS
Public Type SERVICE_STATUS
dwServiceType As Long
dwCurrentState As Long '这里是服务的当前状态,可编程自己取其值出来放到相应数组里
dwControlsAccepted As Long
dwWin32ExitCode As Long
dwServiceSpecificExitCode As Long
dwCheckPoint As Long
dwWaitHint As Long
End Type
Public Type ENUM_SERVICE_STATUS
lpServiceName As Long
lpDisplayName As Long
ServiceStatus As SERVICE_STATUS
End Type
Public Declare Function OpenSCManager Lib "advapi32.dll" Alias "OpenSCManagerA" (ByVal lpMachineName As String, ByVal lpDatabaseName As String, ByVal dwDesiredAccess As Long) As Long
Public Declare Function EnumServicesStatus Lib "advapi32.dll" Alias "EnumServicesStatusA" (ByVal hSCManager As Long, ByVal dwServiceType As Long, ByVal dwServiceState As Long, lpServices As Any, ByVal cbBufSize As Long, pcbBytesNeeded As Long, lpServicesReturned As Long, lpResumeHandle As Long) As Long
Public Declare Function CloseServiceHandle Lib "advapi32.dll" (ByVal hSCObject As Long) As Long
Public Declare Function lstrcpy Lib "kernel32.dll" Alias "lstrcpyA" (szDest As String, szcSource As Long) As Long
Public Function StripTerminator(sInput As String) As String
Dim ZeroPos As Integer
ZeroPos = InStr(1, sInput, Chr$(0))
If ZeroPos > 0 Then
StripTerminator = Left$(sInput, ZeroPos - 1)
Else
StripTerminator = sInput
End If
End Function在窗体里代码(窗体内置一list1控件):
Private Sub Form_Load()
Dim hSCM As Long, lpEnumServiceStatus() As ENUM_SERVICE_STATUS, lngServiceStatusInfoBuffer As Long
Dim strServiceName As String * 250, lngBytesNeeded As Long, lngServicesReturned As Long
Dim hNextUnreadEntry As Long, lngStructsNeeded As Long, lngResult As Long, i As Long
'Open connection to Service Control Manager.
hSCM = OpenSCManager(vbNullString, vbNullString, SC_MANAGER_ENUMERATE_SERVICE)
If hSCM = 0 Then
MsgBox "OpenSCManager failed. LastDllError = " & CStr(Err.LastDllError)
Exit Sub
End If
'Get buffer size (bytes) without passing a buffer
'and make sure starts at 0th entry.
hNextUnreadEntry = 0
lngResult = EnumServicesStatus(hSCM, SERVICE_WIN32, SERVICE_ACTIVE Or SERVICE_INACTIVE, ByVal &H0, &H0, lngBytesNeeded, lngServicesReturned, hNextUnreadEntry)
'We should receive MORE_DATA error.
If Not Err.LastDllError = ERROR_MORE_DATA Then
MsgBox "LastDLLError = " & CStr(Err.LastDllError)
Exit Sub
End If
'Calculate the number of structures needed.
lngStructsNeeded = lngBytesNeeded / Len(lpEnumServiceStatus(0)) + 1
'Redimension the array according to our calculation.
ReDim lpEnumServiceStatus(lngStructsNeeded - 1)
'Get buffer size in bytes.
lngServiceStatusInfoBuffer = lngStructsNeeded * Len(lpEnumServiceStatus(0))
'Get services information starting entry 0.
hNextUnreadEntry = 0
lngResult = EnumServicesStatus(hSCM, SERVICE_WIN32, SERVICE_ACTIVE Or SERVICE_INACTIVE, lpEnumServiceStatus(0), lngServiceStatusInfoBuffer, lngBytesNeeded, lngServicesReturned, hNextUnreadEntry)
If lngResult = 0 Then
MsgBox "EnumServicesStatus failed. LastDllError = " & CStr(Err.LastDllError)
Exit Sub
End If
'Get the strings and display them.
'Me.AutoRedraw = True
'Me.Print "All registered services:" + vbCrLf
Dim name1 As String
For i = 0 To lngServicesReturned - 1
lngResult = lstrcpy(ByVal strServiceName, ByVal lpEnumServiceStatus(i).lpServiceName)
name1 = StripTerminator(strServiceName)
lngResult = lstrcpy(ByVal strServiceName, ByVal lpEnumServiceStatus(i).lpDisplayName)
List1.AddItem "服务名:" + name1 + " 显示名: " + StripTerminator(strServiceName)
Next i
'Clean up.
CloseServiceHandle (hSCM)
End Sub自已判断状态(currentstate)后,用下面的api来启动服务:
Public Declare Function OpenService Lib "advapi32.dll" Alias "OpenServiceA" (ByVal hSCManager As Long, ByVal lpServiceName As String, ByVal dwDesiredAccess As Long) As Long
SC_HANDLE OpenService(
SC_HANDLE hSCManager, // handle to service control manager
// database
LPCTSTR lpServiceName, // pointer to name of service to start
DWORD dwDesiredAccess // type of access to service