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