Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Не дать NT Service запуститься из-под него самого / 6 сообщений из 6, страница 1 из 1
22.03.2017, 09:14
    #39424561
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не дать NT Service запуститься из-под него самого
Порассуждать хочу. Перед тем как делать.

Есть 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
22.03.2017, 09:34
    #39424576
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не дать NT Service запуститься из-под него самого
Дмитрий77,

exe-шник может использовать dll, которая даст отлуп в dllmain
о том что exe не запустился, сервис узнает немедленно при попытке сделать CreateProcess
...
Рейтинг: 0 / 0
22.03.2017, 10:22
    #39424602
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не дать NT Service запуститься из-под него самого
ИзопропилДмитрий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
22.03.2017, 10:42
    #39424620
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не дать NT Service запуститься из-под него самого
Дмитрий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
22.03.2017, 10:57
    #39424635
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не дать NT Service запуститься из-под него самого
Дмитрий77Есть NT служба. .Net прибамбасами исторически для этого не пользуюсь.
Лучше бы Вы ими пользовались
...
Рейтинг: 0 / 0
22.03.2017, 11:14
    #39424657
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не дать NT Service запуститься из-под него самого
Cat2Дмитрий77Есть NT служба. .Net прибамбасами исторически для этого не пользуюсь.
Лучше бы Вы ими пользовались
Возможно Вы правы. В данном конкретном случае EXE-шник как раз .Net-овский.
Просто первая "служба", перенесенная мной из VB6 в .Net была "C++exe",
и .Net-овская кухня там была неприменима, я тогда почитал про "кухню" и забил.
А сейчас сделал по инерции опять через NSSM. Ну не переделывать же уже, работает ведь нормально.
P.S. Привыкаешь к чему-то просто.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Не дать NT Service запуститься из-под него самого / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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