Service 无法更改服务配置
我正在尝试创建一个服务,并根据自己的需要更改其配置。创建不是问题,但当我想更改服务设置时,它会失败。我想创建交互式服务。这是我的代码:Service 无法更改服务配置,service,vb6,Service,Vb6,我正在尝试创建一个服务,并根据自己的需要更改其配置。创建不是问题,但当我想更改服务设置时,它会失败。我想创建交互式服务。这是我的代码: Public Function setInteractiveOption() As Boolean Dim hSCManager As Long Dim hService As Long hSCManager = OpenSCManager(vbNullString, vbNullString, SC_MANAGER_ALL_ACCESS
Public Function setInteractiveOption() As Boolean
Dim hSCManager As Long
Dim hService As Long
hSCManager = OpenSCManager(vbNullString, vbNullString, SC_MANAGER_ALL_ACCESS)
hService = OpenService(hSCManager, SERVICE_NAME, SERVICE_CHANGE_CONFIG)
Dim result As Long
result = ChangeServiceConfig(hService, SERVICE_WIN32_OWN_PROCESS Or SERVICE_INTERACTIVE_PROCESS, SERVICE_NO_CHANGE, SERVICE_NO_CHANGE, vbNull, vbNull, vbNull, vbNull, vbNull, vbNull, vbNull)
CloseServiceHandle hService
If result Then
setInteractiveOption = True
Else
setInteractiveOption = False
End If
End Function
它给出了错误代码1057-帐户名无效或不存在,或者指定的帐户名的密码无效
编辑:这是我的API描述:Public Declare Function ChangeServiceConfig Lib "advapi32.dll" Alias _
"ChangeServiceConfigA" (ByVal hService As Long, ByVal dwServiceType _
As Long, ByVal dwStartType As Long, ByVal dwErrorControl As Long, ByVal _
lpBinaryPathName As String, ByVal lpLoadOrderGroup As String, lpdwTagId _
As Long, ByVal lpDependencies As String, ByVal lpServiceStartName As String, _
ByVal lpPassword As String, ByVal lpDisplayName As String) As Long
Private Declare Function OpenService _
Lib "advapi32" Alias "OpenServiceA" _
(ByVal hSCManager As Long, ByVal lpServiceName As String, _
ByVal dwDesiredAccess As Long) As Long
Private Declare Function OpenSCManager _
Lib "advapi32" Alias "OpenSCManagerA" _
(ByVal lpMachineName As String, ByVal lpDatabaseName As String, _
ByVal dwDesiredAccess As Long) As Long
Public Const SERVICE\u NO\u CHANGE=&HFFFFM
您可以在这里下载我的项目代码(我从互联网下载了原始源代码):我在XP上测试了这个程序(失败了),但在Windows7中它看起来很奇怪:我没有注册服务,但更改了它的配置是成功的 如果错误消息是对帐户的抱怨,那么从那里开始。您将帐户参数声明为字符串:
... ,ByVal lpServiceStartName As String, ByVal lpPassword As String
因此,需要使用vbNullString作为要传递的值
或者,重新定义thjem,只要:
..., ByVal lpServiceStartName As Long, ByVal lpPassword As Long
然后传递0&作为值
EDIT1:
我变了
Public Const SERVICE_NO_CHANGE = &HFFFF
到
并且,参考我自己已经安装的服务,我调用了setInteractiveOption,它在XP Pro上获得了成功。我确保服务的帐户设置为LocalSystem,如MSDN中所示
EDIT2:
这是贴花(还必须使用EDIT1中的常量)
以下是您的方法:
Public Function setInteractiveOption() As Boolean
Dim hSCManager As Long
Dim hService As Long
hSCManager = OpenSCManager(vbNullString, vbNullString, SC_MANAGER_ALL_ACCESS)
MsgBox "hSCManager: " & hSCManager
hService = OpenService(hSCManager, SERVICE_NAME, SERVICE_CHANGE_CONFIG)
MsgBox "hService: " & hService
Dim result As Long
result = ChangeServiceConfig(hService, _
SERVICE_WIN32_OWN_PROCESS Or SERVICE_INTERACTIVE_PROCESS, _
SERVICE_NO_CHANGE, _
SERVICE_NO_CHANGE, _
vbNullString, _
vbNullString, _
vbNullString, _
vbNullString, _
vbNullString, _
vbNullString, _
vbNullString)
MsgBox "result: " & result & vbNewLine & "Error: " & Err.LastDllError
CloseServiceHandle hService
If result Then
setInteractiveOption = True
Else
setInteractiveOption = False
End If
End Function
然后,我添加了一个按钮,仅在表单中调用此方法,效果非常好。@wqw我发布了API增量,但我认为它们不是问题。我从API视图中复制了它们。您知道
vbNull
与vbNullString
有很大不同吗?@wqw谢谢,这有助于解决现在不是0的问题,但我给了我另一个错误:\uuuuuuu1057-帐户名无效或不存在,或者指定的帐户名的密码无效。\uuuu调用ChangeServiceConfig函数时:(在API声明中更改lpdwTagId As Long
为ByVal lpdwTagId As Long
并尝试传递0
而不是vbNullString
。在SDK中检查应该类似于Public Const SERVICE\u NO_change As Long=-1
没有帮助。我添加了我的源代码,所以你可以下载并检查它!我会给你尝试一下。虽然您上面编辑的代码没有按照我的建议执行。您的代码抛出的错误是87,参数无效。将公共常量服务\u NO\u Change=&HFFFF
更改为公共常量服务\u NO\u Change=&hffffff
,它将正常工作。通过工作,我的意思是它将按照您的要求正确设置交互标志。我怀疑你可能有一些其他问题,因为它错误地重命名了我的测试服务,但这可能是我调试工作的副作用。谢谢,伙计,但我偷了相同的错误(无效帐户)你测试什么操作系统?我在Windows XP上测试,但失败了
Public Declare Function ChangeServiceConfig Lib "advapi32.dll" _
Alias "ChangeServiceConfigA" ( _
ByVal hService As Long, _
ByVal dwServiceType As Long, _
ByVal dwStartType As Long, _
ByVal dwErrorControl As Long, _
ByVal lpBinaryPathName As String, _
ByVal lpLoadOrderGroup As String, _
ByVal lpdwTagId As String, _
ByVal lpDependencies As String, _
ByVal lpServiceStartName As String, _
ByVal lpPassword As String, _
ByVal lpDisplayName As String) As Long
Public Function setInteractiveOption() As Boolean
Dim hSCManager As Long
Dim hService As Long
hSCManager = OpenSCManager(vbNullString, vbNullString, SC_MANAGER_ALL_ACCESS)
MsgBox "hSCManager: " & hSCManager
hService = OpenService(hSCManager, SERVICE_NAME, SERVICE_CHANGE_CONFIG)
MsgBox "hService: " & hService
Dim result As Long
result = ChangeServiceConfig(hService, _
SERVICE_WIN32_OWN_PROCESS Or SERVICE_INTERACTIVE_PROCESS, _
SERVICE_NO_CHANGE, _
SERVICE_NO_CHANGE, _
vbNullString, _
vbNullString, _
vbNullString, _
vbNullString, _
vbNullString, _
vbNullString, _
vbNullString)
MsgBox "result: " & result & vbNewLine & "Error: " & Err.LastDllError
CloseServiceHandle hService
If result Then
setInteractiveOption = True
Else
setInteractiveOption = False
End If
End Function