Мне нужно перечислить пути к папкам на рабочем столе для всех пользователей в локальной системе Windows из приложения-службы. Проблема в том, что некоторые пользователи могут не войти в систему в данный момент. Так есть ли API или какой-то другой метод для этого?
EDIT1: Для тех, кто не читал первый абзац, позвольте мне повторить — У меня нет токена к учетной записи пользователя, пользователь не может войти в систему в то время.
EDIT2: Мне нужно это, чтобы удалить ярлык с рабочих столов пользователей, прежде чем функция, поддерживаемая моим приложением, будет отключена или приложение будет удалено.
Вот лучший способ, который я смог придумать до сих пор. Так что я был бы признателен, если бы кто-нибудь с неанглоязычной установкой 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, чтобы получить полный путь к папке рабочего стола этого пользователя.
Из 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», вместо каждого из них вам не нужно будет знать текущий список локальных пользователей.