【问题标题】:Can anyone help me with the following JScript?任何人都可以帮助我使用以下 JScript 吗?
【发布时间】:2011-05-04 19:22:42
【问题描述】:

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

【问题讨论】:

标签: javascript windows-vista special-folders


【解决方案1】:

USERPROFILE 是一个环境变量,将替换 %USERPROFILE% 以使其在此计算机上的正确位置。它会因计算机而异。

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

【讨论】:

  • %USERPROFILE% 环境值不是一个 c:\windows\system32\config\systemprofile。当我检查时,当前进程的 userprofile 的值为 c:\users\admin。无法理解此系统配置文件字符串的来源
  • 当您打开注册表编辑器时,您浏览到哪个分支?你必须去 HKEY_USERS[xyz user id]\Software\...
  • ya.. 我只去 HKU_USERS\Xyz 分支。但是我正在通过 reg load 加载 xyz 的配置单元,并且我当前的进程正在以管理员用户身份运行。这就是为什么 %userprofile% 的值是 c:\users\admin 而不是 c:\users\stduser
  • 是的,只有当您使用用户帐户登录时,USERPROFILE 才会获得正确的值。
【解决方案2】:

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

要让脚本正常工作,您需要:

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

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

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

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

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

【讨论】:

  • 不幸的是,在 REG_EXPAND_SZ 上使用时,GetStringValue 的行为与 GetExpandedStringValue 完全相同(实际上我不确定有什么区别)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
  • 2019-10-12
  • 2021-12-13
  • 2012-10-28
  • 1970-01-01
相关资源
最近更新 更多