Программно удалить Службу Windows из .NET - PullRequest
0 голосов
/ 09 сентября 2010

После поиска информации в Интернете мне удалось создать службу, которая, в зависимости от командной строки, может устанавливать или удалять себя, или просто запускать как приложение.

Однако код для удаления неработает неправильно.

Соответствующий код:

Private Function UnInstallService(ByVal args As String(), ByRef errMsg As String) As Boolean
    Dim si As New ServiceInfo

    If (Not GetServiceInfo(args, si)) Then
        errMsg = "Error..."
        Return False
    End If

    If (Not IsServiceInstalled(si.Name)) Then
        errMsg = "Error..."
        Return False
    End If

    Try
        Dim installer As ServiceProcessInstaller = GetServiceInstaller(si)
        Dim stateSaver As IDictionary = New Hashtable
        Try
            installer.Uninstall(stateSaver)
        Catch e As exception
            errMsg = "Error..."
            Return False
        End Try
    Catch e As exception
        errMsg = "Error..."
        Return False
    End Try
End Function

Private Function GetServiceInstaller(ByVal si As ServiceInfo) As ServiceProcessInstaller
    Dim installer As ServiceInstaller = New ServiceInstaller()
    Dim pInstaller As New ServiceProcessInstaller
    pInstaller.Context = New InstallContext("", si.CommandLine)

    installer.Description = si.Description
    installer.DisplayName = si.DisplayName
    installer.ServiceName = si.Name
    installer.StartType = ServiceStartMode.Automatic

    If (si.Account = "LocalSystem") Then
        pInstaller.Account = ServiceAccount.LocalSystem
    ElseIf (si.Account = "LocalService") Then
        pInstaller.Account = ServiceAccount.LocalService
    ElseIf (si.Account = "NetworkService") Then
        pInstaller.Account = ServiceAccount.NetworkService
    Else
        pInstaller.Account = ServiceAccount.User
        pInstaller.Password = si.Password
        pInstaller.Username = si.Account
    End If

    pInstaller.Context.Parameters("assemblypath") = si.FullPath

    pInstaller.Installers.Add(installer)
    installer.Parent = pInstaller

    Return pInstaller
End Function

Вызывает исключение NullReferenceException при вызове установщика. Удалить Код для установки точно такой же, за исключением проверки, если службаустанавливается, и вызывается installer.Install, а затем installer.Commit вместо Uninstall.Я передаю ему точно такие же параметры.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 09 сентября 2010

Я нашел проблему здесь: http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/58505d7b-cb78-4486-88fc-9b86890664e0

Проблема заключается в строке

installer.Uninstall(stateSaver)

, которая вместо этого должна была быть

installer.Uninstall(Nothing)
1 голос
/ 09 сентября 2010

Ваш код кажется немного длинным, все, что я делаю для удаления, это вызов:

 Dim path As String = Assembly.GetExecutingAssembly().Location
 ManagedInstallerClass.InstallHelper(New String() {"/u", path})

Чтобы установить все, что я делаю, это:

 Dim path As String = Assembly.GetExecutingAssembly().Location
 ManagedInstallerClass.InstallHelper(New String() {path})

А потом у меня есть код в конструкторе моего ProjectInstaller, который устанавливает имя пользователя и т. Д.

Редактировать: хотя имейте в виду, что документация для ManagedInstallerClass содержит следующую цитату: Этот API поддерживает инфраструктуру .NET Framework и не предназначен для использования непосредственно из вашего кода.
Так что это не может быть будущим доказательством использования его из вашего собственного кода ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...