Доступ к файлу на сетевом диске
Предыстория: у меня есть приложение, которое должно читать из файлов на сетевом диске (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();
}
Теперь вот интересная / странная часть. В моей сети приложение уже может получить доступ к сетевому диску, и если я попытаюсь выдать себя за активного пользователя (точно такого же пользователя, включая тот же домен), он не сможет получить доступ к сетевому диску.
Это оставляет меня беспомощным, так как теперь я понятия не имею, что работает, а что нет, а главное, будет ли это работать на месте?
Что мне не хватает?
РЕДАКТИРОВАТЬ: я забыл написать это, когда первоначально задавал вопрос: я попытался ввести действительное доменное имя, и это не сработало, поэтому после этого я попытался ввести нулевое значение, чтобы получить то же имя пользователя, что и без этого кода (так как он работает по умолчанию в нашем домене). Это не помогло, и вот как domain = null; оказался в этом вопросе.
2 ответа
Некоторые мысли:
- Не используйте логические пути дисков для доступа к сетевым ресурсам из кода. Всегда используйте UNC-пути (например,
\\SERVER\Share\Filename.ext
). - Включите аудит событий входа / выхода из локальной политики безопасности, чтобы при вызове метода Impersonate можно было детально отслеживать сбой / успех
- Лучше всего создать учетную запись в своем собственном домене, которая будет иметь то же имя пользователя и пароль, что и учетная запись в другом домене. Аутентификация на вашем домене и сквозная аутентификация предоставят вам доступ к общему сетевому ресурсу на другом домене.
Это может звучать глупо, но вы пытались изменить способ доступа к диску? Возможно, установите какой-нибудь виртуальный обработчик, который позволит вам просматривать информацию на диске. SSH например?