2009-06-29 14 views
3

Je cherche un bon moyen d'obtenir le dossier de données d'application local pour un utilisateur spécifique - sans avoir à entrer les informations de connexion pour cet utilisateur.SHGetFolderPath() pour un utilisateur spécifique

SHGetFolderPath() peut accepter un jeton d'accès pour tout utilisateur que je veux obtenir le dossier AppData local, mais pour obtenir un jeton d'accès, vous devez fournir le mot de passe de l'utilisateur. En outre, selon l'docs ce n'est pas pris en charge sur < = Windows 2000.

Le registre clé HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Shell Folder contient la valeur AppData, qui contient l'emplacement le dossier appdata local pour l'utilisateur courant ... donc je pourrais techniquement monter la ruche HKCU pour l'utilisateur spécifique et accéder à cette valeur; Cependant, Microsoft semble décourager fortement l'utilisation de cette clé, et j'ai entendu dire que cela peut parfois être inexact. Ironiquement, sous Windows, un compte d'administrateur peut facilement accéder et modifier toutes les données du dossier appdata de n'importe quel utilisateur, si elles ouvrent simplement Explorer et naviguent vers l'emplacement correct ... mais il ne semble pas y avoir de un moyen facile d'obtenir par programme l'emplacement du dossier appdata pour un utilisateur spécifique.

Alors, ai-je d'autres options? À l'heure actuelle, l'accès au registre (gasp) semble être la meilleure option, mais j'aimerais utiliser quelque chose d'officiel et non découragé par Microsoft, si possible.

Toutes les suggestions seraient appréciées.

Répondre

4

Il n'y a aucun moyen démontrables cela sans jeton autant que je sache, mais votre meilleur pari est de:

  1. Trouver le profil: HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ ProfileList (% windir% \ Profiles sur Win9x)
  2. AdjustTokenPrivileges pour SE_RESTORE_NAME
  3. RegLoadKey NTUSER.DAT (USER.DAT sur 9x)
  4. Query ... \ CurrentVersion \ Explorer \ User Shell Folders

Notez que la clé de Registre correcte pour vérifier est l'utilisateur Shell dossiers et non des dossiers Shell (Et vous pourriez avoir à étendre le chemin), voir The long and sad story of the Shell Folders key pour plus de détails

Je tiens également à souligner que, si possible, vous devriez stockez les données dans les fichiers de programme ou les dossiers communs, puis copiez-les dans le profil lorsque votre programme s'exécute pour la première fois pour chaque utilisateur

+0

Impressionnant. J'ai vu la fonction RegLoadKey(), et envisagé de l'utiliser ... mais à ce moment je n'étais pas sûr qu'il serait capable de faire ce que je voulais sans être ridiculement lent et peu fiable. Cependant, votre réponse m'a donné l'inspiration pour l'essayer. On dirait que je peux faire ce travail ... ce n'est pas aussi lent que je le pensais. Espérons que cela fonctionnera sans accroc pour le client qui veut cette fonctionnalité. Ils ont beaucoup d'ordinateurs utilisant des services AD/terminaux, et probablement des profils d'utilisateurs itinérants. RegConnectRegistry() pourrait être utile plus tard. – beepboopbopbop

+0

Si la vitesse de RegLoadKey est un problème, vous pourriez probablement chercher dans HKEY_USERS pour le SID de l'utilisateur, ce qui vous sauverait l'appel RegLoadKey, mais cela ne fonctionne que pour les profils qui sont déjà chargés. – Anders