#c# #.net #shell #winapi #windows-shell
#c# #.net #оболочка #winapi #windows-оболочка
Вопрос:
Я использую API оболочки Windows для доступа к сетевым машинам и их папкам.
shellFolder.EnumObjects(hwnd, grfFlags, out enumIdList);
....
int result = shellEnum.Next(celt, out itemPidl, out numFetched);
Я использую IShellFolder.EnumObjects()
метод, который отлично работает, и я могу получить список компьютеров в моей сети.
Однако, когда я пытаюсь получить папки из этих сетей, это работает только тогда, когда нет необходимости в аутентификации на компьютере. Если требуется проверка подлинности, метод возвращает 0x80004005
( E_FAIL
) .
Проводник Windows показывает запрос на «Ввод сетевых учетных данных» для этих компьютеров. Как я могу показать то же приглашение из моей программы WPF и продолжить работу на основе учетных данных пользователя?
Комментарии:
1. Я полагаю, у вас нет IShellView, где отображаются эти папки IShellFolders? Что такое hwnd, переданный EnumObjects? Вероятно, в этих частях оболочки используются некоторые недокументированные интерфейсы.
2. См.: При необходимости отобразите «Ввод сетевых учетных данных» или используйте CredUIPromptForCredentials для создания стандартного диалогового окна учетных данных Windows.
3. @Anders Что вы имеете в виду? Я имею в виду, EnumObjects возвращает папки с общего сетевого компьютера, ЕСЛИ я иду и вручную выполняю аутентификацию на этом компьютере с помощью проводника Windows. В противном случае он возвращает E_FAIL. Я хочу, чтобы он вел себя так же, как File Explorer -> Показать всплывающее окно аутентификации (или, если есть лучшие способы сделать это, я открыт для них).
4. Предоставляете ли вы действительный HWND?
5. @SimonMourier Я снова отлажу его, но, поскольку он хорошо работает с другими сетями, не требующими аутентификации, я полагаю, я предоставляю действительный HWND.
Ответ №1:
В большинстве API оболочки можно передать дескриптор HWND, но это необязательно, и это также способ сказать «отключить пользовательский интерфейс».
Это относится к методу IShellFolder::EnumObjects
HRESULT EnumObjects(HWND hwnd, SHCONTF grfFlags, IEnumIDList **ppenumIDList);
официальная документация по параметру hwnd:
Если для выполнения перечисления требуется пользовательский ввод, этот дескриптор окна должен использоваться объектом перечисления в качестве родительского окна для ввода пользователем. Примером может служить диалоговое окно с запросом пароля или предложением пользователю вставить компакт-диск или дискету. Если для hwndOwner установлено значение NULL, перечислитель не должен отправлять никаких сообщений, и если требуется ввод данных пользователем, он должен автоматически завершиться ошибкой.