У меня есть приложение WebApi, которому нужно получить доступ к сетевому ресурсу на другом компьютере и открыть файлы Crystal Reports.
Я использую LogonUser
и WindowsIdentity.Impersonate
, чтобы выдавать себя за пользователя, который имеет права наобщий сетевой ресурс с использованием этого кода (не полный):
SafeTokenHandle safeTokenHandle;
const int LOGON32_PROVIDER_DEFAULT = 0;
const int LOGON32_LOGON_INTERACTIVE = 2;
bool returnValue = LogonUser(userName, domainName, userPassword, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, out safeTokenHandle);
if (returnValue == false)
{
int ret = Marshal.GetLastWin32Error();
throw new System.ComponentModel.Win32Exception(ret);
}
using (safeTokenHandle)
using (var newId = new WindowsIdentity(safeTokenHandle.DangerousGetHandle()))
using (var impersonatedUser = newId.Impersonate())
{
actionToExecute();
}
Это прекрасно работает, например, при выводе списка папок или удалении файлов с использованием управляемого кода (System.IO
).Однако мне нужно открыть файлы Crystal Reports (у меня последняя версия), и при этом я получаю исключение:
Доступ запрещен
Я предполагаю, чтоCR пытается загрузить файл в контексте пользователя пула приложений.
Я бы, вероятно, заработал, если бы я изменил пользователя пула приложений на пользователя домена с достаточными правами на сетевом ресурсе.Но я хочу избежать этого решения.
Будет ли использовать новую справку WindowsIdentity.RunImpersonated
для .NET4.6, или она будет иметь такой же результат.Если да, есть ли способ заставить CR работать в предоставленном пользовательском контексте вместо пользователя пула приложений / домена приложения?
ОБНОВЛЕНИЕ
У меня было частичноедобиться успеха, изменив параметры LogonUser
на LOGON32_LOGON_NEW_CREDENTIALS
и LOGON32_PROVIDER_WINNT50
.Затем я протестировал следующее:
Запустил проект локально из VS2017 (чтобы проект WebApi работал в локальном контексте IIS Express) и получил доступ к сетевому ресурсу с помощью клиентского приложения на моем компьютере.машина.Этот тест прошел успешно.
Опубликован проект WebApi на IIS на отдельной машине.Запустил клиентский проект (ClickOnce) на моем компьютере и получил доступ к тому же сетевому ресурсу.Этот тест не пройден.
То же, что (2), но клиент опубликован и установлен на другом компьютере, и доступ к нему осуществляется с помощью сервера терминалов.Этот тест не пройден.
Почему первый тест проходит успешно, а тесты 2 и 3 - неудачные?Какими должны быть правильные параметры входа в систему, если поставляемые параметры не всегда будут работать?