Как я могу удаленно получить путь к каталогу профилей Windows?

Я пытаюсь получить путь к каталогу профилей в разных версиях Windows. В более старых версиях это может быть [диск]:\Documents and Settings, в новых — [диск]:\Users. Есть несколько способов сделать это локально без проблем, однако мне нужно найти путь на удаленной машине, к которой я подключен.

  • Удаленный реестр включен.
  • У меня есть токен олицетворения, и я могу успешно собирать информацию с удаленного хоста через Net API и т. д.
  • У меня есть доступ к административной папке и, следовательно, ко всем файлам на удаленном диске.

Вот список других важных предостережений.

  • Это проект С++.
  • Похоже, что GetProfilesDirectory или GetUserProfileDirectory не могут работать в удаленном контексте. Если я ошибаюсь, дайте мне знать, но во всех моих экспериментах функция что-то возвращала с локальной машины.
  • Я не могу использовать WMI, мы много раз пытались интегрировать функциональность WMI в наш проект, и это просто не работало.
  • Я бы предпочел делать как можно меньше «очистки экрана». Если у вас есть идея, не связанная с чтением какого-либо текстового файла и анализом результата, я бы с удовольствием ее выслушал. Но я был бы признателен за любой полезный ответ.
  • Информация о каталоге профиля в реестре кажется бесполезной, поскольку содержит переменные среды, и, как и GetProfilesDirectory, функция раскрытия переменных среды не предназначена для работы с удаленными хостами. Это означает, что решение не сработает, если я буду звонить с более новой машины Windows на старую машину Windows или наоборот.
  • Решение должно быть достаточно общим, чтобы работать между хостами, на которых может работать любая версия Windows от Windows Server 2003 до Windows 7.

Заранее спасибо за любые ваши идеи. В идеале я просто хотел бы заставить GetProfilesDirectory работать на удаленном хосте, поэтому, если вы знаете, как это сделать, я буду любить вас вечно.


person ShiggityShiggityShwa    schedule 09.03.2012    source источник
comment
Пожалуйста, определите удаленную машину, к которой я подключился. Удаленный компьютер находится в вашей локальной интрасети или где-то еще? Каким образом вы связаны с этой машиной? Вы предоставили много деталей, но, похоже, упустили самое важное. Спасибо. :)   -  person Ken White    schedule 09.03.2012
comment
Можете ли вы получить доступ к папкам HKEY_USERS/*/Software/Microsoft/Windows/CurrentVersion/Explorer/Shell? Не рекомендуется использовать этот ключ, но я видел, как он используется.   -  person akhisp    schedule 09.03.2012
comment
Удаленная машина в этом контексте — это машина в локальной сети, которую я могу идентифицировать, указав ее адрес как часть учетных данных, которые будут приняты LogonUser. Фактические вызовы, используемые для установки соединения: WNetAddConnection2, LogonUser, ImpersonateLoggedOnUser, RegConnectRegistry.   -  person ShiggityShiggityShwa    schedule 09.03.2012
comment
@akhisp Эти ключи, похоже, содержат интересующую меня информацию, хотя мне пришлось бы провести некоторый анализ, чтобы сократить их. Но почему не рекомендуется их использовать? Я пишу здесь код для коммерческого продукта, поэтому я бы предпочел не делать что-то, что сломается при X условиях.   -  person ShiggityShiggityShwa    schedule 09.03.2012
comment
Хорошо, прочитав немного о папках оболочки, я понимаю, почему это не рекомендуется. К сожалению, кажется, что на самом деле нет никакой последовательности, когда дело доходит до того, что вы найдете в этом месте. Но на всякий случай запомню все.   -  person ShiggityShiggityShwa    schedule 09.03.2012
comment
Я написал коммерческие продукты, которые используют этот ключ, единственное, что мы обнаружили, не работает, это то, что они пусты для некоторых пользователей. Это было, когда наши программы запускались под службой Windows. В этих ключах реестра есть одна запись, помещенная в мою Windows, которая говорит вам использовать API, а не сам ключ.   -  person akhisp    schedule 09.03.2012
comment
Ха-ха, я видел предупреждающие ключи Microsoft. Вы также можете найти их в скрытых областях реестра. Было довольно забавно столкнуться с этим. Идея SystemDrive от alexisdm может стать более надежным решением. Мне нужно время, чтобы поиграть с ним. Если у кого-то есть более элегантное решение, пожалуйста, дайте мне знать!   -  person ShiggityShiggityShwa    schedule 09.03.2012
comment
@ken-white Извините, я думаю, мне нужно специально упомянуть кого-то по имени, чтобы они знали, что я им ответил ... так что смотрите мой первый ответ выше, ха-ха. Спасибо.   -  person ShiggityShiggityShwa    schedule 09.03.2012
comment
Или @Ken, может быть. Давний наблюдатель, постер впервые.   -  person ShiggityShiggityShwa    schedule 09.03.2012


Ответы (1)


Если у вас есть доступ к удаленному реестру, вы сможете посмотреть ключ, в котором хранится каталог профиля и список профилей:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
person alexisdm    schedule 09.03.2012
comment
Я считаю, что эти ключи содержат переменные среды. Значения выглядят как %SystemDrive%\Users и так далее. Технически я мог бы получить эту информацию и использовать ее для создания того, что я хочу, но тогда мне также понадобится надежный способ определить, какой диск является правильным. - person ShiggityShiggityShwa; 09.03.2012
comment
Согласно этому вы можете получить %SystemDrive % от значения SystemRoot в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\. - person alexisdm; 09.03.2012
comment
Ах, да, мои тестовые установки Windows Server 2003 и Windows 7 имеют этот ключ в одном и том же месте с одинаковой информацией. Я проведу еще несколько исследований по этому вопросу, чтобы увидеть, сколько вариаций может быть. Это было бы не самое чистое решение, но оно полезно, спасибо. - person ShiggityShiggityShwa; 09.03.2012
comment
Я собираюсь отметить это как принятый ответ, учитывая последующий пост %SystemDrive%. Я действительно хотел бы, чтобы был лучший способ сделать это, но, хотя это решение не дает никаких гарантий, оно все равно должно выполнять свою работу. Я задам новый вопрос, если возникнут дополнительные проблемы. Спасибо еще раз. - person ShiggityShiggityShwa; 10.03.2012
comment
Итак, %SystemRoot% — это то, с чем нам нужно работать, как упоминалось выше. Я собираюсь разобрать диск из %SystemRoot% и, надеюсь, %SystemRoot% всегда будет содержать %SystemDrive%. По какой-то причине они не настроены в системе таким образом, но логично, что их значения будут такими во всех случаях. - person ShiggityShiggityShwa; 10.03.2012