2008-10-20 16 views
7

Tengo un paquete de instalación que instala un proceso de servicio que creo. Me gustaría pedirle al usuario el nombre de usuario/contraseña de la cuenta en la que debe ejecutarse el proceso del servicio. Me gustaría verificar que la combinación de nombre de usuario/contraseña sea válida antes de continuar con la instalación. Tengo una DLL de C que estoy usando para un comportamiento de instalación especial, pero no puedo entender cómo usar la API de Windows para verificar las credenciales de una cuenta. Me gustaría poder admitir la misma sintaxis de nombre de cuenta utilizada por el administrador de control de servicio.Verificar el nombre de usuario y la contraseña de la cuenta de Windows

Respuesta

12

La función que desea utilizar es LogonUser. Incluso puede ser muy interesante y especificar el indicador LOGON32_LOGON_SERVICE que verifica para asegurarse de que el usuario tenga los permisos adecuados para ejecutar un servicio.

+0

Solo tenga en cuenta que en las versiones anteriores del sistema operativo (Win2K y anteriores) la API LogonUser() requiere un alto privilegio ("Actuar como parte del sistema operativo"). –

0

Lo he implementado usando la función LogonUser como ustedes mencionaron (por cierto, este servicio requiere WinXP SP2 o posterior, así que no estoy preocupado por el problema del privilegio). Sin embargo, esto no está funcionando como esperaba. Si llamo a QueryServiceConfig, lpServiceStartName tiene el formato ". \ Accountname". Si paso esta cadena como está en LogonUser, falla. ¿Supongo que la parte antes de '\' representa la máquina a la que pertenece el usuario?

Además, si llamo a ChangeServiceConfig especificando "LocalSystem" y "" para los parámetros lpServiceStartName y lpPassword respectivamente, esto funciona bien. Sin embargo, llamar a LogonUser con estos parámetros no funciona.

Realmente me gustaría utilizar la misma sintaxis que utiliza SCM para los nombres de cuenta.

+0

Necesita dividir el dominio del nombre de usuario. Los '.' funcionará como el dominio de LogonUser (se correlaciona con el espacio de nombres del sistema local), pero debe dividir el nombre de usuario completo. – Nick

+0

Además, no puede iniciar sesión explícitamente como LocalSystem usando la API (hasta donde yo sé). Tendrá que hacer un caso especial de esta cuenta, y el par de otras cuentas integradas (que se encuentran en el espacio de nombres NT_AUTHORITY). – Nick

Cuestiones relacionadas