Windows фоновая служба (системный профиль) НЕДОСТУПНА для доступа к пользовательской папке appData на win 10 с использованием C ++? - PullRequest
0 голосов
/ 10 января 2020

Хотите знать, если Windows фоновая служба (системный профиль) не может получить доступ к папке appData пользователя на win 10 с использованием C ++? Похоже, служба Windows не загружает профиль пользователя по умолчанию, как показано ниже, и задается вопросом, совпадает ли он с win 10.

Спасибо

1 Ответ

0 голосов
/ 10 января 2020

У учетной записи 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".

...