Получить UNC-путь из отображенной буквы диска после олицетворения

#c #windows #unc #mapped-drive

#c #Windows #unc #отображенный диск

Вопрос:

Если я вызываю функцию WNetGetUniversalName() , чтобы получить UNC-путь с диска, отображенного в текущем сеансе, функция завершается успешно.

Но…

  • Если я создам новую процедуру входа в систему путем вызова LogonUser() (Пользователь для входа в систему совпадает с создателем процесса)
  • Олицетворять пользователя, вошедшего в систему, вызывая ImpersonateLoggedOnUser() функцию
  • И повторный вызов WNetGetUniversalName() , функция возвращает ошибку 2250 ( ERROR_NOT_CONNECTED )

Дело в том, что я должен запускать этот процесс как службу (в СИСТЕМНОЙ учетной записи), поэтому мне может потребоваться выдать себя за пользователя, чтобы получить отображенные диски этого пользователя и связанные сетевые пути. Как я проверил, информация не может быть доступна через пользовательские сеансы.

Где Windows хранит эту информацию, чтобы она могла переназначать диски при повторном входе пользователя в систему? Я обнаружил, что история отображенных сетевых путей хранится в реестре в разделе key: HKEY_USERS<User SID>SoftwareMicrosoftWindowsCurrentVersionExplorerMap Network Drive MRU но в нем не указано, будет ли отображен путь UNC при повторном входе пользователя в систему и соответствующая буква диска.

Пожалуйста, помогите.

Комментарии:

1. Нет ни одного места, где Windows хранит эту информацию, это зависит от настроек вашей сети. Диски чаще всего сопоставляются либо с помощью групповой политики, либо с помощью сценария входа в систему.

Ответ №1:

Если я правильно помню, я полагаю, что эти сопоставления дисков сохраняются в сеансе входа в систему. Поскольку LogonUser() создает новый сеанс входа в систему, у него не будет сопоставлений дисков; вам придется использовать ImpersonateLoggedOnUser() с существующим токеном.

Комментарии:

1. Спасибо, Люк. Как я уже сказал, процесс будет запущен как служба (в СИСТЕМНОЙ учетной записи), и пользователь не должен входить в систему. Всякий раз, когда пользователь сопоставляет сетевой диск, есть опция «Переподключиться при входе в систему». Таким образом, Windows должна сохранять эту информацию для следующего входа в систему. Вероятно, решение для этого вообще не требует олицетворения. Я все еще ищу ответ.

2. Если пользователь не вошел в систему, то его профиль не будет загружен. Вы могли бы загрузить его явно, но это плохая практика, поскольку попытка входа в систему во время загрузки приведет к плохим результатам.