Подумав немного, увидев, что время, отведенное для этой задачи, было разрушено, я вытащил старую документацию по API для WIN32 и [DllImport] отредактировал вызовы, которые мне нужны, чтобы сделать это «по старинке». Будучи старой собакой Си, я знал, как обходить эти вызовы, и удивительно, как много возвращается, даже после нескольких лет использования управляемых библиотек.
Мне нужно было создать службу, запустить ее, выполнить полезную работу, остановить ее и удалить. Создание, запуск, остановка и удаление - это механика, и я хотел сосредоточиться на части «сделать полезную работу».
Сначала я скопировал exe-файл службы на общий ресурс ADMIN $ и проверил локальный путь к нему (с нашими администраторами серверов это не известно!). Для этого я звоню
["netapi32.dll"]NetShareGetInfo
, а затем я использовал следующее с advapi32.dll
- OpenSCManager
- CreateService
- StartService
- OpenService (для случая, когда я хочу остановить и удалить его - не держите ручки открытыми, так как это может занять некоторое время, так что, чтобы сохранить самодостаточность вещей)
- ControlService
- QueryServiceStatus
- CloseServiceHandle
Это все работает даже через VPN-соединение.
Я могу только догадываться, что управляемый API-интерфейс пытается сделать гораздо больше, чем мне действительно нужно - разница во времени, затрачиваемом на использование управляемого API-интерфейса и API-интерфейса Windows, довольно велика, и нет никаких гарантий, что управляемый API-интерфейс получит через это не было подходящего пути вперед.