¿Cómo puedo obtener la ruta de una “carpeta especial” de Windows para un usuario específico?

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 te permite pasar un token, por lo que estoy asumiendo que hay alguna forma de suplantar al usuario que es la carpeta que te interesa.

¿Hay alguna manera de hacer esto solo con 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í hay una pregunta relacionada ).

Montaba la sección de 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 hive usando RegLoadKey en una ubicación arbitraria, leer los datos y descargarlos (creo).

Sí, es un dolor, y sí, probablemente se romperá en futuras versiones 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.

PD Esta información pretende boost la información provista en su pregunta relacionada, incluidas las renuncias de responsabilidad.

Por favor, no ingrese al 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 necesite.

Puede intentar llamar a ImpersonateLoggedOnUser () para modificar un token de usuario para otro usuario y luego pasarlo 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 haber iniciado 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).

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 este ejemplo, usan 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á ahí solo por compatibilidad con versiones anteriores