Доступ к файлу на сетевом диске

Фон: У меня есть приложение, которое должно читать файлы на сетевом диске (Z:)

Это отлично работает в моем офисном домене, однако он не работает на сайте (в другом домене). Насколько я могу судить, пользователи домена и сетевые диски установлены одинаково, однако у меня нет доступа к пользователям и т.д. В домене клиентов.

Когда я не мог получить доступ к сетевому диску, я понял, что мне нужен токен для пользователя. Вот как я изменяю пользователя:

[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

...

const string userName = "USER";
const string pass = "PASS";
const string domainName = "VALIDDOMAIN.local"  //tried with valid domain name and with null, same result
const int LOGON32_PROVIDER_DEFAULT = 0;
const int LOGON32_LOGON_INTERACTIVE = 2;

IntPtr tokenHandle = new IntPtr(0);

bool returnValue = LogonUser(userName, domainName, pass,
            LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
            ref tokenHandle);

if (!returnValue)
    throw new Exception("Logon failed.");

WindowsImpersonationContext impersonatedUser = null;
try
{
    WindowsIdentity wid = new WindowsIdentity(tokenHandle);
    impersonatedUser = wid.Impersonate();

}
finally
{
    if (impersonatedUser != null) impersonatedUser.Undo();
}

Теперь вот интересная/странная часть. В моей сети приложение уже может получить доступ к сетевому диску, и если я попытаюсь выдавать себя за активного пользователя (точно такой же пользователь, включая тот же домен), он не сможет получить доступ к сетевому диску.

Это оставляет меня беспомощным, так как теперь я понятия не имею, что работает, а что нет, и более того, будет ли он работать на сайте?

Что мне не хватает?

РЕДАКТИРОВАТЬ: Я забыл написать это, изначально задавая вопрос: я попытался ввести действительное доменное имя, и оно не сработало, поэтому после этого я попытался ввести null, чтобы получить то же имя пользователя как я бы без этого кода (поскольку он работает по умолчанию в нашем домене). Это не помогло, и как domain = null; в этом вопросе.

Ответ 1

Некоторые мысли:

  • Не используйте логические пути для доступа к сетевым ресурсам из кода. Всегда используйте UNC-пути (например, \\SERVER\Share\Filename.ext).
  • Включить аудит событий входа/выхода из локальной политики безопасности, чтобы при вызове метода олицетворения вы могли подробно отслеживать неудачу/успех
  • Лучше всего было бы создать учетную запись в своем собственном домене с одинаковым именем пользователя и паролем в качестве учетной записи в другом домене. Аутентификация вашего домена и сквозная аутентификация предоставят вам доступ к сетевому ресурсу в другом домене.

Ответ 2

Это может показаться глупым, но пытались ли вы изменить способ доступа к диску? Возможно, установите какую-то форму виртуального обработчика, который позволяет просматривать информацию о диске. SSH, например?