1

在 Vista 中,我试图在本地计算机上获取用户帐户(当前用户除外)的“本地 AppData”路径,但面临一些问题。任何人都可以帮助我下面的代码有什么问题。

var HKU = 0x80000003; 
var username = "xyz";

//Loading registry hive of user xyz
var WshShell = new ActiveXObject("WScript.Shell");
var LoadHiveCmd = "REG LOAD " + "HKU" + "\\" + username + " \"" + "c:\\users\\xyz\\NTUSER.DAT" + "\"";
var oExec = WshShell.Exec(strLoadHiveCmd); 

var oReg = GetObject("WinMgmts:/root/default:StdRegProv"); 

var profileRegPath = username  + "\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders";

var method, inparams, outparams;  

method = oReg.Methods_.Item("GetExpandedStringValue");
inparams = method.InParameters.SpawnInstance_();
inparams.hDefKey = HKU;
inparams.sSubKeyName = profileRegPath ;
inparams.sValueName =  "Local AppData";

outparams = oReg.ExecMethod_(method.Name, inparams);
var appDataPath= outparams.sValue;   

这里注册表中的 appDataPath 值为%USERPROFILE%\AppData\Local

但我得到了一个价值C:\Windows\system32\config\systemprofile\AppData\Local

我不明白价值从何c:\windows\system32\config\systemprofile而来以及它如何取代%USERPROFILE%价值。

4

2 回答 2

0

USERPROFILE 是一个环境变量,将替换 %USERPROFILE% 以使其在此计算机上的正确位置。它从计算机更改为计算机。

要查看所有环境变量,请在命令 shell 上键入“set”,或转到“控制面板”>“系统设置”>“高级”>“环境变量”

于 2011-05-04T19:25:19.930 回答
0

GetExpandedStringValue自动将注册表值数据中包含的任何环境变量替换为这些变量的实际值。最有可能的是,%USERPROFILE% 扩展为C:\Windows\system32\config\systemprofile而不是C:\users\admin,因为 WMI 服务本身在本地系统帐户下运行。

你需要让你的脚本工作是:

  • 使用GetStringValue而不是GetExpandedStringValue读取未扩展的Local AppData值,

  • 通过从键中读取ProfileImagePath值来获取所需用户的配置文件路径,HKLM\Software\Microsoft\Windows NT\CurrentVersion\ProfileList\<user_SID>

  • 执行字符串替换以将 %USERPROFILE% 替换为配置文件路径。

您可以在我的回答中找到如何执行此操作的示例:
Getting special Folder path for a given user in Jscript

您可能还想使用WshShell.RegReadWMI 来代替,因为它对 JScript 更友好。

于 2011-05-19T11:50:24.187 回答