El servicio de Windows iniciado con ServiceController arroja "Servidor RPC no disponible" al realizar la conexión WMI

Tengo un servicio de Windows que se está instalando con mi instalador y luego comencé con el uso de ServiceController:

public static int StartService(string serviceName, int timeoutMilliseconds)
{
    ServiceController service = new ServiceController(serviceName);
    try
    {
        TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);

        service.Start();
        service.WaitForStatus(ServiceControllerStatus.Running, timeout);

        service.Close();

        return 0;
     }
     catch
     {
        return 1;
     }
}

El servicio parece comenzar bien, pero cuando el servicio intenta realizar llamadas WMI a computadoras remotas, lanza una excepción;

The RPC server is unavailable. (Exception from HRESULT: 0x800706BA)

Intenté conectarme con WBEMTest desde la máquina en la que se está ejecutando el servicio, a la misma máquina a la que el servicio intenta conectarse, y funciona bien.

Además, si inicio el servicio manualmente desde Services.msc, funciona perfectamente. ¿Qué me falta con ServiceController?

preguntado el 08 de noviembre de 11 a las 12:11

Además, al iniciar el servicio con NET START desde la línea de comandos, se genera la misma excepción. -

¿Cuál es la identidad del servicio? ¿Se ejecuta como cuenta de usuario o cuenta de servicio? ¿Está la máquina en el dominio? -

2 Respuestas

Lo he descubierto.

Al configurar el archivo .config del servicio, utilizo marcadores de posición como [Nombre de usuario] y [Contraseña] para reemplazar los valores reales dados por el usuario en el instalador.

El servicio se inició antes de que se cambiaran estos valores, y el servicio intentó conectarse con el nombre de usuario y la contraseña como [Nombre de usuario] y [Contraseña].

No pensé en esta posibilidad al principio porque pensé que obtendría un error de "Acceso denegado", pero por alguna razón cuando el nombre de usuario contiene [o] la conexión devuelve "Servidor RPC no disponible".

Respondido el 08 de diciembre de 11 a las 17:12

Apostaría a que los servicios requeridos (RPC) aún no se inician antes de las llamadas.

Es decir, tu servicio deberán iniciar, o al menos comenzar a procesar, cuando tenga los medios para hacerlo, que sería cuando se inicie el servicio RPC. Cualquier llamada que dependa de RPC realizada antes del inicio de RPC resultará en una falla.

La información de dependencia se almacena en el registro, que yo sepa; puede implementar un script de registro con su solución y ejecutarlo después de la instalación.

Entonces, por ejemplo, deberá crear un valor en la siguiente ubicación:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\<Service>

Que almacena los nombres de las claves de registro de los servicios de los que depende el suyo.

respondido 08 nov., 11:17

Si el servicio RPC no se inició, WBEMTest tampoco habría funcionado. - Avilan

¿Se está conectando con WBEMTest una vez que su máquina esté completamente iniciada? O de donde Los servicios comienzan incluso antes de que alguien inicie sesión en Windows, cuando inicie sesión, RPC y WBEMTest estarán disponibles. - Grant Thomas

Mi servicio lo instala un instalador y, a partir de entonces, se inicia con ServiceController. En este punto, la computadora ya está completamente iniciada. - Avilan

De acuerdo, ¿y si reinicia después de la instalación, el servicio se inicia, se ejecuta de nuevo pero sin el error? Si un reinicio es irrelevante debido a un entorno completamente cargado, entonces esta respuesta también puede serlo, pero la dejaré para referencia futura independientemente. - Grant Thomas

Sí, tanto un reinicio como iniciarlo manualmente desde Services.msc hace que se ejecute sin errores. Pero no quiero requerir un reinicio. - Avilan

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.