У меня небольшая проблема с сервисом, который я написал на C ++. Сам сервис работает правильно и работает под учетной записью SYSTEM. В течение одной точки выполнения я должен запустить или остановить другую службу. Это, однако, не работает. Призыв к OpenService()
возвращает код ошибки 5 «Доступ запрещен».
Чтобы немного подробнее: мне нужно запустить службу собственного провайдера времени, которая пытается открыть порт 123 на сетевом адаптере, и этот порт часто уже открывается win32time
Сервис из Windows. Я пытаюсь дать пользователю возможность автоматически останавливать эту службу, когда моя служба запускается, и запускать ее снова, когда она останавливается.
К этой службе можно получить доступ только с повышенными привилегиями пользователя в системах с поддержкой UAC, я знаю это, но я всегда думал, что учетная запись SYSTEM сможет выполнить это действие по умолчанию, но, очевидно, я ошибаюсь.
Можно ли каким-то образом повысить уровень моего сервиса (возможно, адаптировав уровень привилегий в манифесте для ‘requireAdministrator’ или что-то подобное)? Честно говоря, я еще не пробовал этого, так как боюсь, что приглашение UAC застрянет в сеансе 0 или что-то подобное. Или есть другой способ предоставить моей службе, работающей в системе, привилегии для контроля состояния другой службы?
Любые предложения очень ценится, спасибо!
РЕДАКТИРОВАТЬ
Хорошо, вот код, и теперь я чувствую себя немного глупо … Я полностью забыл тщательно проверить API, потому что я думал, что параметры OpenSCManager()
а также OpenService()
может быть ноль, чтобы запросить все привилегии по умолчанию, но я должен пройти SC_MANAGER_ALL_ACCESS
, Извините за беспокойство всех. Я попробую это завтра и закрою этот вопрос, когда у меня будут результаты.
// I am missing SC_MANAGER_ALL_ACCESS here probably...
SC_HANDLE scm = OpenSCManager(nullptr, nullptr, SC_MANAGER_CREATE_SERVICE) ;
if(nullptr == scm) {
/* Handle and return */
}
// ...and possibly here, too
SC_HANDLE svc = OpenService(scm, _T("w32time"), 0);
int lastError = GetLastError();
if(ERROR_SERVICE_DOES_NOT_EXIST == lastError) {
/* Handle and return */
}
if(start) {
if(0 != StartService(svc, 0, nullptr)) {
int lastError = GetLastError();
if(ERROR_SERVICE_ALREADY_RUNNING != lastError) {
/* Handle */
}
}
} else {
SERVICE_STATUS status;
QueryServiceStatus(svc, &status);
if(SERVICE_STOPPED != status.dwCurrentState) {
if(ControlService(svc, SERVICE_CONTROL_STOP, &status)) {
do {
QueryServiceStatus(svc, &status);
} while(SERVICE_STOPPED != status.dwCurrentState);
} else {
/* Handle */
}
}
}
CloseServiceHandle(svc);
CloseServiceHandle(scm);
Хорошо, проблема была просто пропавшей SC_MANAGER_ALL_ACCESS
доступ к маске прав. Мой сервис теперь может запускать / останавливать запрошенный другой сервис.
Других решений пока нет …