Как открыть «Ввод сетевых учетных данных» в Windows 10

#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, перечислитель не должен отправлять никаких сообщений, и если требуется ввод данных пользователем, он должен автоматически завершиться ошибкой.