Служба запуска / остановки C ++ в удаленной системе иногда возвращает ошибку 1722 (сервер RPC недоступен) - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть приложение c++ для служб start и stop в удаленной системе. Иногда, когда я запускаю приложение, я получаю код ошибки 1722 - The RPC server is unavailable. Если я перезапускаю приложение, все снова работает.

RemoteSystem может представлять собой Windows XP вплоть до Windows 10.

Это код, который я использую для запроса статуса службы и остановки запуска.

    HANDLE hToken;
    BOOL ret = LogonUserA("user", ".", "pwd", LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_WINNT50, &hToken);
    BOOL ret2 = ImpersonateLoggedOnUser(hToken);

    SC_HANDLE _handle;

    _handle = OpenSCManagerA("remoteSystem", NULL, SC_MANAGER_ALL_ACCESS);

    if (!_handle) {
        auto err = GetLastError();
        std::cout << err << std::endl;
        return err;
    }

    SC_HANDLE _serviceHandle;

    _serviceHandle = OpenServiceA(_handle, "Spooler", SERVICE_ALL_ACCESS);

    if (!_serviceHandle) {
        auto err = GetLastError();
        std::cout << err << std::endl;
        return err;
    }

    SERVICE_STATUS ss;

    if (!QueryServiceStatus(_serviceHandle, &ss)) {
        auto err = GetLastError();
        std::cout << err << std::endl;
        return err;
    }

    if (ss.dwCurrentState == SERVICE_RUNNING) {
        SERVICE_STATUS svcStatus;
        if (!ControlService(_serviceHandle, SERVICE_CONTROL_STOP, &svcStatus)) {
            auto err = GetLastError();
            std::cout << err << std::endl;
            return err;
        }
    } else if (ss.dwCurrentState == SERVICE_STOPPED) {
        if (!StartService(_serviceHandle, 0, NULL)) {
            auto err = GetLastError();
            std::cout << err << std::endl;
            return err;
        }
    }

Я также использовал методы OpenSCManagerW и передаю несколько широких строк с тем же результатом. Я действительно не мог воспроизвести проблему, потому что она, кажется, произошла совершенно случайно

...