Попытка программной установки службы из VB.Сетевое приложение — Звонки в SC.exe потерпеть неудачу

#vb.net #service #sc.exe

Вопрос:

У меня есть программа конфигурации и множество служб, которые запускаются на каждом настроенном устройстве. В моей программе конфигурации при добавлении устройства для мониторинга я создаю службу с идентификатором, используя что-то вроде этого:

 Dim appPath As String = IO.Path.GetDirectoryName(Application.ExecutablePath)
Dim servicePath As String = appPath amp; "MyService.exe"
Dim serviceName As String = "MyService-" amp; DeviceID
Dim createCommand As String = "sc.exe create " amp; serviceName amp; " binpath= " amp; Chr(34) amp; servicePath amp; " " amp; mySiteID amp; Chr(34) amp; " type= share start= demand"
Process.Start(createCommand)
 

Поэтому, когда все это складывается вместе, это выглядит примерно так:

 sc create MyService-253 binpath= "C:Some PathProject NameMyService.exe 253" type= share start= demand
 

Проблема в том, что служба не создается. Команда процесса выдает сообщение «Система не может найти указанный файл».

Программа (и VS) выполняются от имени администратора. Кроме того, копирование и вставка содержимого переменной createCommand ПОМОГАЕТ правильно создать службу. Поэтому, если я вручную выполню ту же команду, которую следует выполнить, она создаст службу, и служба будет работать правильно. Что я упускаю?

Комментарии:

1. Вы уверены в ценности binpath? Разве этот идентификатор устройства не должен быть экранирован?

2. Я попробовал это с помощью убегающих кавычек ( » ), и это не имело никакого значения.

Ответ №1:

Вы не можете передать полную командную Process.Start строку таким образом. Если бы вы прочитали документацию по этому методу, вы бы знали, что вам нужно передать путь к файлу и аргументы командной строки отдельно, например

 Dim appPath = Path.GetDirectoryName(Application.ExecutablePath)
Dim servicePath = Path.Combine(appPath, "MyService.exe")
Dim serviceName = "MyService-" amp; DeviceID
Dim fileName = "sc.exe"
Dim arguments = $"create {serviceName} binpath= ""{servicePath} {mySiteID}"" type= share start= demand"
Process.Start(fileName, arguments)
 

Комментарии:

1. Вот и все. Спасибо тебе.