windows service unc

WNetAddConnection2 de un servicio de Windows



service unc (5)

Estoy intentando conectarme a una carpeta compartida protegida con contraseña remota desde un servicio de Windows, que se ejecuta como cuenta LocalSystem. Parece que la cuenta de LocalSystem no puede acceder directamente a recursos compartidos de red protegidos con contraseña mediante WNetAddConnection2 () o llamadas similares. ¿Alguien puede confirmar esto? He leído que suplantar a un usuario administrador puede ser el camino a seguir. Intenté usar LogonUser () e ImpersonateLoggedOnUser () antes de WNetAddConnection2 (), parece que el montaje de la ruta de red tiene éxito, pero los accesos reales (por ejemplo, enumerar archivos en la carpeta remota) fallan. ¿Algunas ideas?

Gracias.


En este momento estoy lidiando con el mismo problema, Flavio, y mi sospecha actual es que funciona si alguien inicia sesión interactivamente en la máquina, y devolverá ERROR_NO_SUCH_LOGON_SESSION si nadie ha iniciado sesión. Yo podría, sin embargo, estar equivocado. Más por venir. He marcado esta pregunta y volveré a comprobar :)


Para decirle a la confianza que trabajé todo el tiempo solo en un entorno de dominio y sin recursos compartidos de red protegidos con contraseña, pero sé que hay dos formas principales de hacer una conexión: la API NetUseAdd y la API NetUseAdd . Te recomiendo que NetUseAdd función NetUseAdd con Level igual a 1 ( USE_INFO_1 ). Solo usé USE_INFO_2 que tiene ui2_username , ui2_domainname y ui2_password , pero USE_INFO_1 solo tiene ui1_password , por lo que parece una función creada para la conexión a un ui1_password protegido con contraseña.

Por cierto, LogonUser () realmente no tiene sentido, porque hace que el inicio de sesión local en la computadora local y que necesita establecer una sesión en la computadora remota. Esto hace las funciones WNetAddConnection2 y NetUseAdd .


La forma en que puede acceder al recurso compartido de red desde una cuenta del sistema local (que es "NT AUTHORITY / SYSTEM"):

  1. Debes iniciar sesión con una cuenta local que tenga acceso a netowork incluso en redes que no sean de dominio. Es suficiente usar la cuenta "NT AUTHORITY / NETWORK SERVICE" para obtener esto
  2. Agregue la conexión de red compartida con la especificación de sus credenciales de acceso:

El punto principal aquí es usar LOGON32_LOGON_NEW_CREDENTIALS tipo de inicio de sesión durante la llamada a LogonUser () (vea MSDN para detalles / restricciones). De lo contrario, obtendrá ERROR_NO_SUCH_LOGON_SESSION al ejecutar WNetAddConnection2 (), incluso si LogonUser y la suplantación tuvieron éxito.

LogonUser("NETWORK SERVICE", "NT AUTHORITY", NULL, LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_WINNT50, &hToken ); ImpersonateLoggedOnUser(hToken); NETRESOURCE nr; nr.dwScope = RESOURCE_GLOBALNET; nr.dwType = RESOURCETYPE_DISK; nr.dwUsage = RESOURCEUSAGE_CONNECTABLE; nr.dwDisplayType = RESOURCEDISPLAYTYPE_SHARE; nr.lpRemoteName = "////SomeCopmuter//C$"; nr.lpLocalName = "Z:"; WNetAddConnection2(&nr, "password", "Administrator", 0);

Notas

  • La suplantación solo funciona para el hilo actual.
  • con recursos locales funcionará como LocalSystem, con el recurso compartido adicional funcionará como usuario en una computadora remota especificada en WNetAddConenction2 (en este caso, Administrador en SomeComputer).
  • Puede omitir el uso de letra de unidad en NETRESOURCE y acceder a los archivos a través de la notación "/ server / share / filename.ext"
  • Esto puede no funcionar en algunos sistemas antiguos (NT / 2000, no sé la lista exacta)

Acabo de encontrar este problema también y descubrí que si pongo el nombre de la computadora remota en el nombre de usuario, funcionó. (No entendí esto, teníamos otro lugar en el código que ya funcionaba, así que sabía que era posible, y finalmente descubrí la diferencia).

Así por ejemplo:

WNetAddConnection2(&nr, "password", "SomeComputer//Username", 0);

No estoy haciendo otras llamadas especiales como LogonUser o ImpersonateLoggedOnUser.

Esto es en un servicio que se ejecuta bajo la cuenta SYSTEM.

No he intentado utilizar la cuenta SomeComputer / Administrator, pero eso no es exactamente una buena práctica de todos modos. Estoy usando una cuenta de usuario normal en SomeComputer.


importar win32wnet desde win32netcon importar RESOURCETYPE_DISK como DISK path = "/ 192.168.1.11 / Student" win32wnet.WNetAddConnection2 (DISK, "R:", "/ 192.168.1.11 / Student", Ninguno, "Estudiante", "pase", 0)