在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%
的价值。
答案 0 :(得分:0)
USERPROFILE是一个环境变量,它将替换%USERPROFILE%以使其在此计算机上获得正确的位置。它从计算机变为计算机。
要查看所有环境变量,请在命令shell上键入“set”,或转到“控制面板”> “系统设置”> “高级”>环境变量
答案 1 :(得分: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.RegRead
而不是WMI,因为它更适合JScript。