Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 13 / 0
Регистрация: 04.01.2018
Сообщений: 58
1

Метод OpenService не возвращает handle

23.02.2018, 12:34. Показов 619. Ответов 13
Метки нет (Все метки)

C#
1
2
3
4
5
6
7
8
9
            var serviceHandle = OpenService(
                scManagerHandle,
                svc.ServiceName,
                SERVICE_QUERY_CONFIG | SERVICE_CHANGE_CONFIG);
 
            if (serviceHandle == IntPtr.Zero)
            {
                throw new ExternalException("Open Service Error");
            }
Программа написана на C#, но данный метод импортирован из Advapi32.dll.
При открытии службы "SecurityHealthService" (защитник Windows) срабатывает исключение ExternalException.
При открытии других служб пока-что таких проблем не наблюдал.
Админ права присутствуют и запрашиваются.
Возможно нужно подключить определённую привилегию, но я не знаю какую.

Есть у кого-нибудь идеи?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.02.2018, 12:34
Ответы с готовыми решениями:

OpenService возвращает ошибку 5
SC_HANDLE sc_manager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (sc_manager == NULL)...

OpenService не возвращает запущенный сервис
Private Type SRV_STATUS dwServiceType As Long dwCurrentState As Long ...

Созданная форма не возвращает(?) Handle
Доброго времени суток, господа программисты, будьте так любезны :) Суть: Попытки открытия...

VirtualAllocEx возвращает ошибку The handle is invalid
вопрос собственно уже в заголовке , не пойму почему ? Хэндл точно находит нормально !!!...

13
Mental handicap
1243 / 621 / 171
Регистрация: 24.11.2015
Сообщений: 2,426
23.02.2018, 12:51 2
Цитата Сообщение от Quntgo Посмотреть сообщение
Есть у кого-нибудь идеи?
Пойти в соответствующий раздел по C#
0
0 / 13 / 0
Регистрация: 04.01.2018
Сообщений: 58
23.02.2018, 13:02  [ТС] 3
Azazel-San, ну так по сути метод из C++
0
Mental handicap
1243 / 621 / 171
Регистрация: 24.11.2015
Сообщений: 2,426
23.02.2018, 13:20 4
Quntgo, и что теперь? Как это "метод из С++", возможно он реализован на С++ и если не ошибаюсь, это деректива из Windows.h
это наверное логично если вам нужна реализация под шарп то и ищите в разделах нужного вам языка
0
0 / 13 / 0
Регистрация: 04.01.2018
Сообщений: 58
23.02.2018, 13:23  [ТС] 5
Цитата Сообщение от Azazel-San Посмотреть сообщение
если вам нужна реализация под шарп
можно и под C++, мне нужен лишь ход решения, хоть под шарп, хоть под плюса
0
Mental handicap
1243 / 621 / 171
Регистрация: 24.11.2015
Сообщений: 2,426
23.02.2018, 13:37 6
Quntgo,
пробуйте что-то такое
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 #include <windows.h>
 /* ... */
 SC_HANDLE sc_manager = OpenSCManager(
 /* params */
    ...,
    ...,
    ...
 );
 SC_HANDLE s_handle = OpenService(
    sc_manager, 
    ...,
    ...
 );
    
 if(s_handle == NULL)
 {
        std::cout << "ERROR " << GetLastError() << std::endl;
 }
Правда тут нужны знатоки умнее меня, явно
0
321 / 173 / 78
Регистрация: 09.10.2014
Сообщений: 809
23.02.2018, 13:42 7
del
0
0 / 13 / 0
Регистрация: 04.01.2018
Сообщений: 58
23.02.2018, 14:49  [ТС] 8
Цитата Сообщение от lArtl Посмотреть сообщение
del
Что?

Добавлено через 19 минут
Azazel-San,
C++
1
2
3
4
5
    SC_HANDLE sc_manager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    SC_HANDLE s_handle = OpenService(sc_manager, "SecurityHealthService", SC_MANAGER_ALL_ACCESS);
    if (s_handle == NULL) {
        cout << "Error " << GetLastError() << endl;
    }
Возвращает 5, как я понимаю это "Access is denied."
Админ права запрашиваются.
У меня есть предположение, что нужна какая-то привилегия , но в списке привилегий я не увидел похожих.

Добавлено через 8 минут
Либо стоит вызывать OpenSCMangaer от Local Service, сейчас попробую

Добавлено через 27 минут
Я думаю так будет более логично
0
Mental handicap
1243 / 621 / 171
Регистрация: 24.11.2015
Сообщений: 2,426
23.02.2018, 14:50 9
Quntgo, попробуйте SERVICE_ALL_ACCESS
0
0 / 13 / 0
Регистрация: 04.01.2018
Сообщений: 58
23.02.2018, 14:56  [ТС] 10
Azazel-San,
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
    SC_HANDLE sc_manager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); // если сюда тоже вставить SERVICE_ALL_ACCESS, то и тут вылетит ошибка 5 
    if (sc_manager == NULL) {
        cout << "Error0 " << GetLastError() << endl;
    }
    SC_HANDLE s_handle = OpenService(sc_manager, "SecurityHealthService", SERVICE_ALL_ACCESS);
    if (s_handle == NULL) {
        cout << "Error1 " << GetLastError() << endl; // ошибка 5
    }

Так же вылетает ошибка 5, если поставить "SERVICE_ALL_ACCESS" и в OpenScManager(), то эта функция выдаст ошибку 5.
0
2122 / 679 / 253
Регистрация: 10.02.2018
Сообщений: 1,561
23.02.2018, 15:18 11
Цитата Сообщение от Quntgo Посмотреть сообщение
У меня есть предположение, что нужна какая-то привилегия , но в списке привилегий я не увидел похожих.
SE_SECURITY_NAME не похожа разве, по имени так весьма?
0
0 / 13 / 0
Регистрация: 04.01.2018
Сообщений: 58
23.02.2018, 16:22  [ТС] 12
Ygg,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    HANDLE hToken;
    if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
        if (SetPrivilege(hToken, SE_SECURITY_NAME, TRUE)) {
            SC_HANDLE sc_manager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
            if (sc_manager == NULL) {
                cout << "Error0 " << GetLastError() << endl;
            }
            SC_HANDLE s_handle = OpenService(sc_manager, "SecurityHealthService", SC_MANAGER_ALL_ACCESS);
            if (s_handle == NULL) {
                cout << "Error1 " << GetLastError() << endl; // возвращает "Error1 5"
            }
        }
    }
Всё та же ошибка 5
0
2122 / 679 / 253
Регистрация: 10.02.2018
Сообщений: 1,561
23.02.2018, 17:00 13
Остаётся попробовать SE_TCB_NAME, но, как я понял, что бы эту фигню включить придётся сервис писать и запускать его от системы. С консолью уже не прокатит.
0
0 / 13 / 0
Регистрация: 04.01.2018
Сообщений: 58
23.02.2018, 17:04  [ТС] 14
Ygg,
"The token does not have the specified privilege." , видимо ты правильно понял)
Как я понимаю, это связано с тем, что служба не с svchost.exe запускается, а с собственного экзешника, хотя группа та же что и у центра обновления(к примеру)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.02.2018, 17:04

Помощь в написании контрольных, курсовых и дипломных работ здесь.

OpenProcess возвращает разные handle запущенного др. приложения
привет. Вопрос такой - хочу получить handle процесса для использования в функциях VirtualAllocEx и...

Метод без проблем возвращает строку, но не возвращает класс
Здравствуйте! Уже сутки бьюсь с проблемой и не пойму вообще почему она возникла. Есть WCF-сервер и...

Handle передать в метод
Как в метод передать Handle компонента

Метод, который возвращает true, если трехзначное число переданное в метод как параметр делится на сумму своих цифр
написать метод, который возвращает true, если трехзначное число переданное в метод как параметр...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.