2016-10-03 4 views
0

Я хочу получить доступ к некоторым файлам в папке MyDocuments, когда я запускаю свою службу на WIndows. В документации сказано, что в случае Windows, GetDocumentsPath возвращается:Вызов TPath.GetDocumentsPath из приложения-службы

  • C:\Documents and Settings\<username>\My Documents (XP)
  • C:\Documents and Settings\<username>\My Documents (Vista или более поздняя версия)

В моем случае я получаю C:\WINDOWS\system32\config\systemprofile\Documents. Это какая-то ссылка на папку «Документы» в Windows? Btw, я не вижу Documents папку в пути C:\WINDOWS\system32\config\systemprofile.

Может кто-нибудь объяснить это мне?

+0

http://serverfault.com/questions/9325/ Что вы ожидаете произойдет? Почему у локальной учетной записи системы есть папка с документами? Почему вы используете свою службу как локальную систему? Предположительно, вы знаете, что это считается плохой практикой. Также быть живым для перенаправления файловой системы. Если ваш процесс равен 32 бит, помните, что system32 перенаправляется на SysWOW64. –

+0

Теперь вы также говорите: «папка MyDocuments». Но какой из них вы имеете в виду. Есть много, по одному для каждого пользователя. Вы знаете об этом? –

ответ

2

Папка «Документы» представляет собой папку для каждого пользователя. TPath.GetDocumentsPath() возвращает папку «Документы» учетной записи пользователя, которая связана с вызывающим потоком. Но если ваша служба работает под учетной записью SYSTEM, а не с конкретной учетной записью пользователя, вы не можете использовать TPath, чтобы получить путь к любой папке, предназначенной для пользователя.

Для того, чтобы сервис для извлечения папки Документов пользователя (или любой другой папки конкретного пользователя), служба должна либо:

  1. быть запущенно как нужный пользователь, чтобы начать с, а не SYSTEM Счет.

  2. при работе в качестве SYSTEM счета, получить маркер для желаемой учетной записи пользователя, а затем передать этот маркер SHGetFolderPath() или SHGetKnownFolderPath().

    • Если пользователь в настоящее время вошли в систему, используйте WTSEnumerateSessions() и WTSQuerySessionInformation() найти пользователя для входа в сеанс, а затем использовать WTSQueryUserToken(), чтобы получить маркер пользователя этой сессии.
    • Если пользователь еще не вошел в систему, но у вас есть учетные данные пользователя, вы можете войти в учетную запись с помощью LogonUser(), чтобы получить токен пользователя, а затем загрузить профиль пользователя в память с помощью LoadUserProfile() перед запросом пути к папке.