在Jscript中获取给定用户的特殊文件夹路径
Getting special Folder path for a given user in Jscript
如何为当前用户以外的特定用户获得"本地设置"或"本地Appdata"等shell文件夹的路径?
虽然在Windows Script Host中有获取特殊文件夹路径的方法—WshShell.SpecialFolders
和Shell.NameSpace
—它们只返回当前用户的路径。获取其他用户的特殊文件夹路径有点棘手。
正确的方法做到这一点是使用Windows API SHGetKnownFolderPath
函数(或SHGetFolderPath
在Vista之前的Windows版本)。但问题是,Windows Script Host不支持调用WinAPI函数,所以要在脚本中使用这些函数,你必须通过自定义编写的COM组件来公开它们。
另一个可能的解决方案是从用户的注册表hive中读取特殊文件夹路径,特别是HKEY_USERS'<user_SID>'Software'Microsoft'Windows'CurrentVersion'Explorer'User Shell Folders
键。
User Shell Folders
键中的路径通常使用%USERPROFILE%
环境变量指定;因此,要获得完全限定的路径,您必须将此变量替换为HKEY_LOCAL_MACHINE'SOFTWARE'Microsoft'Windows NT'CurrentVersion'ProfileList'<user_SID>
键中的ProfileImagePath
值。
另外,HKEY_USERS'<user_SID>
密钥仅在相应的用户当前登录时可用。对于一般解决方案,您必须将用户的hive (HKEY_USERS'Temp
)中,并从该键读取值。
下面是示例JScript代码,演示如何完成任务。在Windows 7和Vista上,您可能需要以管理员身份运行脚本,这取决于您的UAC设置。
注意:不建议使用这种方法,正如Raymond Chen在他的文章《Shell Folders键的漫长而悲伤的故事》中所解释的那样。不能保证它在未来的Windows版本中仍能正常工作。
var strUser = "foo";
var strDomain = "bar";
// If the account is local, domain name = computer name:
// var strDomain = getComputerName();
var strSID = getSID(strUser, strDomain);
var strProfilePath = getProfilePath(strSID);
// Load the user's registry hive into the HKEY_USERS'Temp key
var strTempKey = "Temp";
loadHKUHive(strTempKey, strProfilePath + "''ntuser.dat");
// Get unexpanded path, e.g. %USERPROFILE%'AppData'Roaming
//var strAppData = getAppData(strSID);
var strAppData = getAppData(strTempKey);
WScript.Echo(strAppData);
// Expand the previous value to a fully-qualified path, e.g. C:'Users'foo'AppData'Roaming
strAppData = strAppData.replace(/%USERPROFILE%/i, strProfilePath);
WScript.Echo(strAppData);
// Unload the user's registry hive
unloadHKUHive(strTempKey);
function getComputerName() {
var oShell = new ActiveXObject("WScript.Shell");
return oShell.ExpandEnvironmentStrings("%COMPUTERNAME%");
}
function getSID(strUser, strDomain) {
var oAccount = GetObject("winmgmts:root/cimv2:Win32_UserAccount.Name='" + strUser + "',Domain='" + strDomain + "'");
return oAccount.SID;
}
function getProfilePath(strSID) {
var oShell = new ActiveXObject("WScript.Shell");
var strValue = oShell.RegRead("HKLM''Software''Microsoft''Windows NT''CurrentVersion''ProfileList''" + strSID + "''ProfileImagePath");
return strValue;
}
function getAppData(strSID) {
var oShell = new ActiveXObject("WScript.Shell");
var strValue = oShell.RegRead("HKEY_USERS''" + strSID + "''Software''Microsoft''Windows''CurrentVersion''Explorer''User Shell Folders''AppData");
return strValue;
}
function loadHKUHive(strKeyName, strHiveFile) {
var oShell = new ActiveXObject("WScript.Shell");
oShell.Run("reg load HKU''" + strKeyName + " " + strHiveFile, 0, true);
}
function unloadHKUHive(strKeyName) {
var oShell = new ActiveXObject("WScript.Shell");
oShell.Run("reg unload HKU''" + strKeyName, 0, true);
}
- 将Windows文件路径组织到文件夹中
- 将 MVC 3 应用程序部署到 URL 文件夹已损坏 JavaScript 和内容路径
- 从路径中删除最后一个文件夹
- 使用javascript从磁盘中的文件夹中选择所有图像的路径
- 获取在html中选择的完整路径文件夹
- gulp-useref – 不同级别文件夹中的相对输出路径
- 路径 lo 加载本地主机子文件夹中的文件不起作用.js仅在基路径中
- Javascript 和/或 chrome 扩展:记住文件夹路径
- 如何使用它的相对路径访问tomcat服务器中的文件夹
- 如何删除路径数组中的父文件夹
- 输入表单 浏览并获取文件夹路径并保存在文本输入Javascript中
- 拆分文件夹路径的字符串
- 如何在没有服务器的情况下运行 HTML 时将文件夹设置为根路径
- 如何使用正则表达式或 javascript 验证文件夹路径
- 根据路径字符串构建嵌套文件夹结构
- AJAX文件夹路径问题
- 有效地生成带有反斜杠的文件夹路径
- 处理文件夹路径并在一行中处理尾随斜杠
- 如何在javascript中从文件夹路径中获取最后一个文件夹名称
- 在Jscript中获取给定用户的特殊文件夹路径