powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Запуск службы "с учетной записью пользователя".
6 сообщений из 31, страница 2 из 2
Запуск службы "с учетной записью пользователя".
    #39518656
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77А проект .Net "Windows Service" хотя бы умееет запускаться как просто exe?
Если не умеет, то это как минимум гимор при тестировании.
Обычно всю сервисную логику выносят в отдельную сборку. И в солюшене, таким образом, 3 проекта: class library со всей логикой, консольное приложение для тестирования, и собственно приложение-сервис, в котором есть только сервис-инсталлер и запускалка сервиса. И никаких проблем с тестированием.
...
Рейтинг: 0 / 0
Запуск службы "с учетной записью пользователя".
    #39518657
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилДмитрий77>специальную учётку пользователя, пароль который мы знаем, так как «пользователь» метафизический, чисто для работы приложения
В моем случае нужен реальный пользователь, почему 10 раз объяснил выше.
пока залогоненый пользователь не запустил приложение - работает сервис от имени метафизического или иного пользователя, заданного при установке.
при запуске приложения - сервис встаёт на паузу, при завершении - возобновляет работу
Объясни что хотел сказать?

Смотри,
если сервис запущен от имени D\Метафизический пользователь,
то факс создается также от имени D\Метафизический пользователь
Когда реальный пользователь D\Dmitry, который имеет право хотеть посмотреть что там насоздавалось и напосылалось, как вообще дела идут, он запустит программу "Факсы и сканирование Windows".
Факсов, посланных от имени D\Метафизический пользователь (равно как и от имени SYSTEM),
он там не увидит.
Если даже дать пользователю D\Dmitry все возможные права на все факсы (Сервис -> Параметры факса -> Безопасность), он чего-то увидит, но как он это увидит - это задница полная.
1) постоянно надо жать F5 чтобы видеть текущую картинку
2) просмотреть чужие факсы(картинки) нельзя, только перезапустить или удалить задание.
и т.д. и т.п.
(это на Win10 он еще увидит "чего-то", а на Win7 какой-нибудь он и этого "чего-то" кажется не увидит, про баги эти было куча срача на разных форумах).
По этой и ряду других причин сервис надо запускать от D\Dmitry а не от D\Метафизический пользователь.
Если сервис генерит факсы от имени D\Dmitry, то D\Dmitry комфортно сидя за компом видит весь процесс в Outbox\Sent в "Факсы и сканирование Windows" в реальном времени, как будто он сам их "ручками" посылает. Понятно, что D\Вася уже этих факсов не увидит, но D\Dmitry и D\Вася вполне могут договориться меж собой, кто за всем этим следит, и от имени кого из них запускать сервис.
...
Рейтинг: 0 / 0
Запуск службы "с учетной записью пользователя".
    #39518658
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Сон Веры Павловны]Дмитрий77Обычно всю сервисную логику выносят в отдельную сборку. И в солюшене, таким образом, 3 проекта: class library со всей логикой, консольное приложение для тестирования , и собственно приложение-сервис, в котором есть только сервис-инсталлер и запускалка сервиса. И никаких проблем с тестированием.
Ну, по сути то это несильно отличается, от того что я использую.
Есть "консольное приложение для тестирования" (или даже не консольное, я люблю использовать скрытую форму)
Есть NSSM, который "сервис-инсталлер и запускалка сервиса" + к нему еще sc и/или API, чтоб чего-нибудь "подрихтовать", типа автозапуска или того же пользователя.
Ну не буду я полюбому этим InstallUtil пользоваться с его индусским окном.
...
Рейтинг: 0 / 0
Запуск службы "с учетной записью пользователя".
    #39518676
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77А проект .Net "Windows Service" хотя бы умееет запускаться как просто exe?
Если не умеет, то это как минимум гимор при тестировании.

Умеет.

Дмитрий77Честно, не вижу смысла этой кухни. За ради в журнал Windows через EventLog мусорить?

Серьёзно? Вся разница между приложением и сервисом это возможность писать в EventLog?



Дмитрий77Ну, самый разумный в моем случае вариант.
1) При инсталляции ставить модуль как "приложение" (чтоб некрасиво не было из-за "окон ввода пароля") под текущего пользователя.
Под "всех пользователей" нельзя, на multi-user системе (сервере) будет бардак.
2) В настройках иметь опцию "запускать как сервис", где предлагать ввод пользователя/пароля с подстановкой текущего пользователя (предполанается вызов "As Admin") с объяснением почему именно пользователя в диалоге ввода пароля (кратко) и хэлпе (поподробней). Диалог свой естественно, без вариантов. Использовать API, а не sc - иначе хрен отследишь что процедура установки прошла корректно.

Отличный вариант. Мы так делали.
...
Рейтинг: 0 / 0
Запуск службы "с учетной записью пользователя".
    #39518677
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Использовать API, а не sc - иначе хрен отследишь что процедура установки прошла корректно.

Почему хрен отследишь, запускаем команду, смотрим код возврата. Но можно и через API.
...
Рейтинг: 0 / 0
Запуск службы "с учетной записью пользователя".
    #39518714
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Немного от слов к делу к коду

Дмитрий77предлагать ввод пользователя... с подстановкой текущего пользователя
Тек. пользователь в нужной форме записи вроде так корректно вычисляется
Код: vbnet
1.
System.Security.Principal.WindowsIdentity.GetCurrent().Name


Для меня вычисляет D\Dmitry
На всяк. случай поигрался-почитал доки,
для SYSTEM надо тупо писать "LocalSystem"
для Network Service надо тупо писать "NT AUTHORITY\NetworkService"
(этих двоих оно в этом написании корректно съест вне зависимости от локализации)

hVosttДмитрий77Использовать API, а не sc - иначе хрен отследишь что процедура установки прошла корректно.Почему хрен отследишь, запускаем команду, смотрим код возврата. Но можно и через API.
Ну, м.б. и отследишь, но ИМХО это извращение, когда знаешь как сделать по нормальному.
Короче накатал пока ф-цию начерно.
Каюсь, воспользовался ServiceController sc.WaitForStatus(ServiceControllerStatus в чисто API-шном коде да еще и "между строк".
(API заразы при старте-стопе сервиса сразу возвращают, WaitForStatus очевидно какой-нибудь Do..Loop делает, да и хрен бы с ним)

Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
 Public Function SetServiceUserAccount(ByRef err_text As String, _
   ByVal ServiceName As String, Optional ByVal ServiceStartName As String = vbNullString, _
   Optional ByVal Password As String = vbNullString) As Boolean
    SetServiceUserAccount = True
    Dim sc As New ServiceController(ServiceName)

    ' Get a handle to the SCM database. 
    Dim schSCManager As IntPtr = OpenSCManager(vbNullString, vbNullString, SC_MANAGER_ALL_ACCESS)
    If schSCManager = IntPtr.Zero Then
      SetServiceUserAccount = False
      err_text = "OpenSCManager Error " & RaiseAPIError()
      GoTo ToExit
    End If

    ' Get a handle to the service.
    Dim schService As IntPtr = OpenService(schSCManager, ServiceName, SERVICE_ALL_ACCESS) ' SERVICE_CHANGE_CONFIG
    If schService = IntPtr.Zero Then
      SetServiceUserAccount = False
      err_text = "OpenService Error " & RaiseAPIError()
      GoTo ToExit
    End If

    ' надо б остановить если запущен, потом же проверять придется
    Dim Status As SERVICE_STATUS

    ' Query Service Status
    If QueryServiceStatus(schService, Status) = False Then
      SetServiceUserAccount = False
      err_text = "QueryServiceStatus Error " & RaiseAPIError()
      GoTo ToExit
    End If

    If Status.dwCurrentState <> SERVICE_STOPPED Then
      ' Stop the service
      If ControlService(schService, SERVICE_CONTROL_STOP, Status) = False Then
        SetServiceUserAccount = False
        err_text = "ControlService Error " & RaiseAPIError()
        GoTo ToExit
      End If
      sc.WaitForStatus(ServiceControllerStatus.Stopped, New TimeSpan(0, 0, 10))
    End If

    ' Change the service account name
    If ChangeServiceConfig(schService, SERVICE_NO_CHANGE, SERVICE_NO_CHANGE, SERVICE_NO_CHANGE, _
     , , , , ServiceStartName, Password, ) = False Then
      SetServiceUserAccount = False
      err_text = "ChangeServiceConfig Error " & RaiseAPIError()
      GoTo ToExit
    End If

    ' Надо б проверить, а вдруг с паролем ошиблись?
    ' Start the service
    If StartService(schService, 0, IntPtr.Zero) = False Then
      SetServiceUserAccount = False
      err_text = "StartService Error " & RaiseAPIError()
      GoTo ToExit
    End If
    sc.WaitForStatus(ServiceControllerStatus.Running, New TimeSpan(0, 0, 10))

    ' Stop the service
    If ControlService(schService, SERVICE_CONTROL_STOP, Status) = False Then
      SetServiceUserAccount = False
      err_text = "ControlService Error " & RaiseAPIError()
      GoTo ToExit
    End If
    sc.WaitForStatus(ServiceControllerStatus.Stopped, New TimeSpan(0, 0, 10))

ToExit:
    If schService <> IntPtr.Zero Then CloseServiceHandle(schService)
    If schSCManager <> IntPtr.Zero Then CloseServiceHandle(schSCManager)
  End Function


Допиливать видимо придется, когда имплементиовать буду, но принципиально оно чего надо делает.
...
Рейтинг: 0 / 0
6 сообщений из 31, страница 2 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Запуск службы "с учетной записью пользователя".
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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