Хотя есть способы получения специальных путей к папкам в Windows Script Host & mdash; WshShell.SpecialFolders
и Shell.NameSpace
& mdash; они возвращают пути только для текущего пользователя. Получить пути к специальным папкам других пользователей немного сложно.
Правильный способ для этого - использовать функцию Windows API SHGetKnownFolderPath
(или SHGetFolderPath
в версиях Windows до Vista). Но проблема в том, что Windows Script Host не поддерживает вызов функций WinAPI, поэтому, чтобы использовать эти функции в вашем скрипте, вам придется предоставлять их через специально написанный COM-компонент.
Другое возможное, но недокументированное решение - это чтение специальных путей к папкам из куста реестра этого пользователя, в частности, ключа HKEY_USERS\<user_SID>\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
.
Пути в ключе User Shell Folders
обычно указываются с помощью переменной среды %USERPROFILE%
; поэтому, чтобы получить полные пути, вам нужно заменить эту переменную значением ProfileImagePath
из клавиши HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\<user_SID>
.
Кроме того, клавиша HKEY_USERS\<user_SID>
доступна только в том случае, если соответствующий пользователь в данный момент вошел в систему. Для общего решения вам придется загрузить куст пользователя ( \ ntuser.dat ) во временный ключ реестра (скажем, HKEY_USERS\Temp
) и вместо этого прочитать значения из этого ключа.
Ниже приведен пример кода JScript, который демонстрирует, как ваша задача может быть выполнена. В Windows 7 и Vista может потребоваться запустить сценарий от имени администратора в зависимости от настроек UAC.
ПРИМЕЧАНИЕ : Этот метод не рекомендуется, как объясняет Рэймонд Чен в своей статье Длинная и грустная история ключа 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);
}