2008-10-13 18 views
10

Dentro de un servicio, ¿cuál es la mejor manera de determinar una ruta de carpeta especial (por ejemplo, "Mis documentos") para un usuario específico? SHGetFolderPath le permite pasar un token, por lo que estoy asumiendo que hay alguna forma de suplantar al usuario que es la carpeta que le interesa.¿Cómo puedo obtener la ruta de una "carpeta especial" de Windows para un usuario específico?

¿Hay alguna manera de hacerlo basándonos solo en un nombre de usuario? De lo contrario, ¿cuál es la cantidad mínima de información que necesita para la cuenta de usuario? Preferiría no tener que solicitar la contraseña del usuario.

(Aquí es una related question.)

Respuesta

2

Montaba la sección del registro del usuario y buscaba el valor de la ruta. Sí, es una solución subóptima, por todos los motivos mencionados (compatibilidad con versiones anteriores deficiente, etc.). Sin embargo, como muchas otras cosas en Windows, MS no proporcionó una forma de API para hacer lo que desea hacer, por lo que es la mejor opción disponible.

Puede obtener el SID (no GUID) del usuario utilizando LookupAccountName. Puede cargar la sección de registro del usuario usando LoadUserProfile, pero desafortunadamente esto también requiere un token de usuario, que requerirá su contraseña. Afortunadamente, puede cargar manualmente la colmena usando RegLoadKey en una ubicación arbitraria, leer los datos y descargarlos (creo).

Sí, es un dolor, y sí, es probable que se rompa en las versiones futuras de Windows. Tal vez en ese momento MS habrá proporcionado una API para hacerlo, lo habrá restituido a versiones anteriores de Windows y lo distribuirá automáticamente a través de la actualización de Windows ... pero no contaría con la respiración.

P.S.Esta información tiene la intención de aumentar la información provista en su pregunta relacionada, incluidas las renuncias de responsabilidad.

-3

Esta información se almacena en el registro en la clave "HKEY_USERS \ S-1-5-21-616815238-485949776-2992451252-3228 \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ User Shell Folders ".

El "S-1-5-21-616815238-485949776-2992451252-3218" es el GUID del usuario. Necesita obtener este GUID para encontrar la clave correspondiente y leerla.

En el ejemplo this utilizan la función SHGetFolderPath que mencionas y hay una lista con todas las carpetas especiales que pueden ser útiles.

NOTA: Microsoft desaconseja utilizar la clave de registro, ya que todavía está allí sólo para compatibilidad con versiones anteriores

+0

¿Funciona esto en todas las versiones "recientes" de Windows (2000 en adelante)? – kgriffs

+0

No estoy seguro, pero como la función es compatible con MS, debería funcionar. En la práctica, leo información solo para HKEY_CURRENT USER, no para otros. También puede leer el registro como archivos INI –

+0

Supongo que la función funciona, pero me preguntaba si la ruta de clave de registro era la misma ... – kgriffs

11

Por favor, no entrar en el registro para encontrar esta información. Esa ubicación podría cambiar en futuras versiones de Windows. Use SHGetFolderPath en su lugar.

http://msdn.microsoft.com/en-us/library/bb762181(VS.85).aspx

Editar: Parece que LogonUser proporcionará el token para el otro usuario que necesita.

+0

Esto realmente no responde su pregunta, a menos que pueda proporcionar una forma de obtener la ruta de la carpeta para un usuario que no sea el actual. – Nick

+1

Correcto, he editado la respuesta. –

3

Usted puede tratar de llamar ImpersonateLoggedOnUser() para modificar un token de usuario para otro usuario, y luego pasa que a SHGetFolderPath(). Según el documento de ImpersonateLoggedOnUser(), parece que puede llamar a LogonUser() para obtener un token para un usuario específico.

Solo por leer todo, supongo que el usuario en cuestión debe iniciar sesión de alguna forma para que esto funcione. Recuerdo una página que indica que la sección de registro del usuario debe estar montada para que esto funcione (lo que tiene cierto sentido, supongo).

Cuestiones relacionadas