powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Не дать NT Service запуститься из-под него самого
6 сообщений из 6, страница 1 из 1
Не дать NT Service запуститься из-под него самого
    #39424561
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Порассуждать хочу. Перед тем как делать.

Есть NT служба. .Net прибамбасами исторически для этого не пользуюсь.
Устроен нехитро: NSSM - the Non-Sucking Service Manager запускает мой exe.

При каких-то условиях (например отсутствие лицензии) хотелось бы чтоб он не запускался вообще.
Хотелось бы: чтоб при попытке запуска он сам себя не дал запустить.

Т.е. грубо, сервис начал запускаться, exe-шник понял что условие не выполнено и дал команду системе (из под себя), ну к примеру:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
StopNTService  ("MyServiceName")

Public Function StopNTService(ByVal ServiceName As String) As Boolean
    Dim sc As New ServiceController(ServiceName)
    Try
      sc.Stop()
      Return True
    Catch
      Return False
    End Try
End Function

(здесь главное чтобы команда "не ждала остановки", т.е. Net stop MyServiceName думаю не есть гуд)

Насколько это реально и хорошо, такая конструкция?

В принципе, как у меня сейчас, при "невыполнении условия", сервис (exe) запускается но ничего не делает (висит просто "форма" под System), но при этом индикатор в проге показывает что "типа работает".
Но красивше чтоб он вообще не запускался.

Я могу конечно реализовать это по другому, т.е. делать проверку извне, в коде, который этот сервис запускает.
Но во-первых таких мест в программе несколько, могу если не сейчас то "через полгода" какое-то из них упустить.
Плюс запуск "кривыми ручками из панели служб", автозапуск при старте системы и т.п.
Ну, как бы не оч. красиво, хотелось бы чтоб он сам не давал себя запускать.
...
Рейтинг: 0 / 0
Не дать NT Service запуститься из-под него самого
    #39424576
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

exe-шник может использовать dll, которая даст отлуп в dllmain
о том что exe не запустился, сервис узнает немедленно при попытке сделать CreateProcess
...
Рейтинг: 0 / 0
Не дать NT Service запуститься из-под него самого
    #39424602
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилДмитрий77,

exe-шник может использовать dll, которая даст отлуп в dllmain
о том что exe не запустился, сервис узнает немедленно при попытке сделать CreateProcess
Exe-шник Net-овский. 2 C-шных dll он действительно использует: 1) opal 2) та что вычисляет "лицензию"
(<здесь вычисляются условия запуска незапуска>). Но че-то то что ты предлагаешь как-то сложно для меня и наворочено. В существующих 2-х dll менять уже ничего не хочу, 3-ю делать ради этого тоже не хочу, тем более тупо не врубаюсь о чем речь.

Попробовал сделать так как сам предложил:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
 Sub Main()
    '========================================
    Application.EnableVisualStyles()

... <здесь вычисляются условия запуска незапуска>
    '========================================
    'сразу удаляем debug
...
    '=================
    'отмена запуска службы (из-под себя), если лицензия отсутствует либо заблокирована
    If params.m_AppLicense.m_Blocked Or (params.m_AppLicense.m_Licenced = False) Then
      If IsServiceExists("ServiceName") Then
        If (Not (GetServiceStatus("ServiceName") = ServiceProcess.ServiceControllerStatus.Stopped)) Then
          StopNTService("ServiceName")
        End If
      End If
    End If
    '=================
...
    '========================================
    Form1 = New frm1
    Application.Run(Form1)
  End Sub


В принципе результат достигается, то чего и хотелось (верхняя картинка).
Но с малой вероятностью могу нарваться на "Ошибка 1061: Служба в наст. момент не может принимать запросы..." (нижняя картинка). Т.е. остановка почему-то не сработала, а остановить штатно тоже уже не могу.
И полечить это можно только убив exe-шник Non-Sucking Service Manager через Alt+Ctrl+Del (ну либо комп наверно перегрузить).
Для юзера такой ситуации явно не хочу.

М.б. после
StopNTService("ServiceName")
добавить сразу End Sub
но блин ролики за шарики не уедут?
Они и так уезжают,
потому что StopNTService("ServiceName") -системная команда, и пока она соображает, сервис продолжает грузиться, в частности делать Application.Run(Form1) и т.д.
...
Рейтинг: 0 / 0
Не дать NT Service запуститься из-под него самого
    #39424620
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77М.б. после
StopNTService("ServiceName")
добавить сразу End Sub
но блин ролики за шарики не уедут?
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
 Sub Main()
    '========================================
    Application.EnableVisualStyles()

... <здесь вычисляются условия запуска незапуска>
    '========================================
    'сразу удаляем debug
...
    '=================
    'отмена запуска службы (из-под себя), если лицензия отсутствует либо заблокирована
    If params.m_AppLicense.m_Blocked Or (params.m_AppLicense.m_Licenced = False) Then
      If IsServiceExists("ServiceName") Then
        If (Not (GetServiceStatus("ServiceName") = ServiceProcess.ServiceControllerStatus.Stopped)) Then
          StopNTService("ServiceName")
          End Sub
        End If
      End If
    End If
    '=================
...
    '========================================
    Form1 = New frm1
    Application.Run(Form1)
  End Sub


"End Sub" вставил, и вроде все нормально стало, на "Ошибка 1061" больше не нарываюсь, стабильно первое сообщение. (мультизапусков службы тоже не происходит, когда она пытается себя непрерывно перезапускать, даже если в свойствах службы поставить автоперезапуск)
Лучше конечно этот код местами подстраховывать проверкой из кода проги, когда она хочет запустить службу.
С другой стороны, сильно стараться тоже смысла нет, режим нештатный, нафига юзеру запускать то, на что у него нет лицензии.
...
Рейтинг: 0 / 0
Не дать NT Service запуститься из-под него самого
    #39424635
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Дмитрий77Есть NT служба. .Net прибамбасами исторически для этого не пользуюсь.
Лучше бы Вы ими пользовались
...
Рейтинг: 0 / 0
Не дать NT Service запуститься из-под него самого
    #39424657
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Дмитрий77Есть NT служба. .Net прибамбасами исторически для этого не пользуюсь.
Лучше бы Вы ими пользовались
Возможно Вы правы. В данном конкретном случае EXE-шник как раз .Net-овский.
Просто первая "служба", перенесенная мной из VB6 в .Net была "C++exe",
и .Net-овская кухня там была неприменима, я тогда почитал про "кухню" и забил.
А сейчас сделал по инерции опять через NSSM. Ну не переделывать же уже, работает ведь нормально.
P.S. Привыкаешь к чему-то просто.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Не дать NT Service запуститься из-под него самого
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]