У учетной записи SYSTEM
есть полный доступ к локальной машине, поэтому, конечно, она может получить доступ к папке AppData любого пользователя. Хитрость заключается в том, чтобы сначала получить путь к папке AppData данного пользователя.
API существуют для самой цели получения связанных с пользователем путей к папкам, см. SHGetFolderPath()
и SHGetKnownFolderPath()
, оба из которые принимают токен пользователя в качестве входных данных. Службы запускаются в отдельном сеансе от пользователей, а учетная запись SYSTEM
имеет свой собственный профиль в реестре, поэтому вы не можете использовать что-либо, зависящее от HKEY_CURRENT_USER
вызывающего процесса, для запроса путей, так как он запросит Пути SYSTEM
, а не пути пользователя. Вам необходимо получить токен нужного пользователя, которого вы хотите запросить.
Если целевой пользователь вошел в систему, вы можете использовать WTSQueryUserToken()
для получения токена пользователя. Вам просто нужен идентификатор сеанса пользователя, который вы можете получить из ProcessIdToSessionId()
для любого процесса, запущенного в сеансе пользователя, или вы можете использовать WTSEnumerateSessions()
и WTSQuerySessionInformation()
, чтобы найти сеанс, содержащий информацию для входа в систему нужного пользователя (если есть вошли более 1 пользователя), или вы можете использовать WTSGetActiveConsoleSessionId()
, чтобы получить сеанс, который зарегистрирован и в данный момент подключен к физической клавиатуре / мыши / монитору.
Если целевой пользователь не вошел в систему, но у вас есть учетные данные пользователя, вы можете использовать LogonUser()
для получения токена пользователя. Затем вы можете использовать LoadUserProfile()
для доступа к кусту реестра пользователя HKEY_CURRENT_USER
и прямого запроса к подразделу "\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
.
В противном случае вы просто такой SOL, если только вы не знаете SID пользователя, в котором В этом случае вы можете перечислить куст реестра HKEY_USERS
в поисках этого SID, а затем напрямую запросить подраздел "\<SID>\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
.