Как получить пути к рабочим столам пользователей из службы?

Мне нужно перечислить пути к папкам на рабочем столе для всех пользователей в локальной системе Windows из приложения-службы. Проблема в том, что некоторые пользователи могут не войти в систему в данный момент. Так есть ли API или какой-то другой метод для этого?

EDIT1: Для тех, кто не читал первый абзац, позвольте мне повторить — У меня нет токена к учетной записи пользователя, пользователь не может войти в систему в то время.

EDIT2: Мне нужно это, чтобы удалить ярлык с рабочих столов пользователей, прежде чем функция, поддерживаемая моим приложением, будет отключена или приложение будет удалено.

3

Решение

Вот лучший способ, который я смог придумать до сих пор. Так что я был бы признателен, если бы кто-нибудь с неанглоязычной установкой Windows мог проверить это для меня?

(Я публикую только псевдокод для краткости.)

1 — Все нижеприведенные шаги выполняются из локального сервисного приложения.

2 — Чтобы получить пути ко всем профилям пользователей, перечислите подпапки в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList ключ и читать ProfileImagePath ценность от них. Это даст пути к профилю для каждой учетной записи пользователя.

3 — Чтобы получить имя папки для рабочего стола, прочитайте Desktop значение из HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders ключ от сервисного приложения (да, я знаю, HKCU звучит странно, но у меня это сработало). После этого найдите путь для %USERPROFILE% переменная окружения, используя API переменных среды. Таким образом, вы получите два пути, что-то вроде этого:

C:\Windows\system32\config\systemprofile\Desktop

а также

C:\Windows\system32\config\systemprofile

Затем просто изолируйте 2-ую строку от 1-й, используя сравнение без учета регистра, и вы получите имя папки для рабочего стола (то есть «\ Desktop» в данном случае).

4 — Добавьте папку рабочего стола в путь, полученный на шаге 2, чтобы получить полный путь к папке рабочего стола этого пользователя.

0

Другие решения

Из userenv.h: GetProfilesDirectory (win2k +, iirc)

msdn.microsoft.com/en-us/library/windows/desktop/bb762278(v=vs.85).aspx

Используйте это, чтобы найти каталог, содержащий все локальные каталоги профиля учетной записи пользователя.

Чтобы найти папку на рабочем столе:

Shlobj.h: SHGetKnownFolderPath (vista +)

msdn.microsoft.com/en-us/library/windows/desktop/bb762188(v=vs.85).aspx

Вам понадобится FOLDERID_Desktop в качестве идентификатора известной папки. Этот символ объявлен в Knownfolders.h

msdn.microsoft.com/en-us/library/windows/desktop/dd378457(v=vs.85).aspx

Используя их, вы можете приблизиться к тому, что вам нужно, без непосредственного чтения реестра. Конечно, это противоречит любому элегантному способу перечисления пользователей помимо вывода из списка папок внутри
GetProfilesDirectory. Возможно, есть более подходящий способ перечисления локальных пользователей.

Во-вторых, и это зависит от цели вашего сервиса, но, возможно, работая с профилем «allusers», вместо каждого из них вам не нужно будет знать текущий список локальных пользователей.

0

По вопросам рекламы [email protected]