Как я могу запросить доступ к общему ресурсу Windows в приложении толстого клиента .NET?

У нас есть толстый клиент, которому требуется доступ к ресурсам в общей папке, где клиент не может войти в систему. Клиент может находиться в домене Windows или в смешанной среде без домена, поэтому пользователю придется входить на сервер локально. Раньше одним из способов решения проблемы было создание на рабочем столе пользователя ярлыка для общего ресурса, который открывает проводник Windows, открывающий запрос пароля, который разрешает или запрещает доступ к общему ресурсу. Как я могу заставить пользователя войти в общую папку, не полагаясь на проводник Windows? Что делает проводник Windows, чтобы приложение могло запрашивать доступ к общему ресурсу?

Я прочитал Доступ к файлам из общего сетевого ресурса в веб-приложении C #, но я делаю это в приложении WinForms и хочу, чтобы оно было интерактивным. Я также прочитал Как запрашивать пароль , но этот код просто запрашивает строки у пользователя, а не вызывает пользовательский интерфейс, который требует и предоставляет доступ к общему ресурсу. Я бы предпочел, чтобы мое приложение не знало пароль пользователя, а лишь заставляло ОС запрашивать доступ к сетевому ресурсу.


person flipdoubt    schedule 02.06.2009    source источник


Ответы (1)


Вы можете взглянуть на Win32 API CredUIPromptForCredentials (или CredUIPromptForWindowsCredential, если вы работаете в Vista / Win2k8, вы должны проверить winver, чтобы решить, какой вызов сделать).

Этот метод фактически вызывает обычный запрос учетных данных, но вы получаете учетные данные (ужасно, я знаю).

PInvoke.Net имеет образец кода, показывающий, как вызвать эту функцию из C #. (в примере PInvoke вы должны передать CREDUI_FLAGS.DO_NOT_PERSIST для флагов, если вы указали false в save. Странно, я знаю).

Дополнительная информация (и неуправляемый образец) на замечательной викибуке Кита Брауна по безопасности

Как только вы получите учетные данные (в защищенной строке), вы можете выдать себя за пользователя, чтобы получить доступ к ресурсу (используя logonuser).

И это некрасиво. Я понимаю, что вы хотите, чтобы Windows отображала стандартное диалоговое окно с запросом, и вы не хотите знать об учетных данных.

Мне интересно, не поможет ли такой уродливый взлом, как использование System.Diagnostics.Process для запуска скрытого explorer.exe на удаленном UNC. Вам нужно будет найти способ дождаться, пока пользователь введет учетные данные, а затем убить созданный процесс проводника.

person Yann Schwartz    schedule 02.06.2009
comment
Привет, Янн, спасибо за быстрый ответ, но разве я не сослался на ту же страницу Кейта Брауна, которая использует Win32 API CredUIPromptForCredentials в моем исходном вопросе? Разве пример из PInvoke.NET не тот же, что я уже пробовал с сайта Кейта Брауна. За исключением того факта, что пример кода PInvoke.NET дает результат ERROR_INVALID_PARAMETER, вызов для меня выглядит одинаково. - person flipdoubt; 02.06.2009
comment
Я отредактировал свой пост (включая инструкции о том, как заставить работать образец кода PInvoke). Но это не совсем то, о чем вы просили. - person Yann Schwartz; 03.06.2009
comment
Спасибо за помощь, Янн. Но я нашел свой ответ в другом вопросе ТАК. Код здесь: lookfwd.doitforme.gr/blog/media/PinvokeWindowsNetworking.cs - person flipdoubt; 03.06.2009