2011-05-04 136 views
1

在Vista中,我试图在本地机器上为用户帐户(当前用户除外)获取“本地应用程序数据”路径,但面临一些问题。任何人都可以帮助我下面的代码有什么问题。任何人都可以使用以下JScript帮助我吗?

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%值。

+1

社区用户已经足够为您设置代码格式。请查看[如何在StackOverflow上格式化代码](http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks)以确保您提供代码以帮助者易于阅读的格式。 – Dutchie432 2011-05-04 19:29:35

回答

0

USERPROFILE是一个环境变量,将取代%USERPROFILE%以获取它在此计算机上的正确位置。它从计算机变成计算机。

要查看所有环境变量键入命令shell“设置”,或进入“控制面板” - >“系统设置” - >“高级”>环境变量

+0

%USERPROFILE%环境值不是一个c:\ windows \ system32 \ config \ systemprofile。当我检查时,当前进程的userprofile的值是c:\ users \ admin。无法理解此系统配置文件字符串的来源 – svv 2011-05-04 19:38:34

+0

当您打开注册表编辑器时,您浏览到哪个分支?你必须去HKEY_USERS \ [xyz用户名] \软件\ ... – ariel 2011-05-04 19:46:21

+0

亚..我只会去HKU_USERS \ Xyz分支。但我加载xyz thru reg load的配置单元,我的当前进程正在与admin用户一起运行。这就是为什么%userprofile%的值是c:\ users \ admin而不是c:\ users \ stduser – svv 2011-05-04 19:51:15

0

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

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

  • 使用GetStringValue代替GetExpandedStringValue读取未展开Local AppData值,

  • 通过阅读获取需要的用户的配置文件路径ProfileImagePath value from HKLM\Software\Microsoft\Windows NT\CurrentVersion\ProfileList\<user_SID> key,

  • 做一个字符串替换用%USERPROFILE%替换为pro文件路径。

你可以找到如何做到这一点在此我回答一个例子:
Getting special Folder path for a given user in Jscript

您可能还需要使用WshShell.RegRead而不是WMI,因为它更JScript的友好。

+0

不幸的是,在REG_EXPAND_SZ上使用GetStringValue的行为与GetExpandedStringValue的行为完全相同(我不确定实际上有什么区别) – CherryDT 2017-06-07 14:37:24

相关问题