2010-03-23 2 views
11

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

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

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

[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(); 
} 

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

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

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

EDIT: Я забыл написать это, изначально задавая вопрос: я попытался ввести действительное имя домена, и это не сработало, поэтому после этого я попытался ввести null, чтобы получить то же имя пользователя, что и я, без этот код (поскольку он работает по умолчанию в нашем домене). Это не помогло, и именно так domain = null; в этом вопросе.

+3

Держу пари, что ребята из суперпользователя будут спорить об обратном (поскольку у этого есть код). – Codesleuth

+0

Почему бы вам не дать учетной записи, выполняющей этот код, читать доступ к диску? Тогда ваш код станет следующим: 'File.ReadAllBytes (filePath);' – ChaosPandion

+0

Я задал один вопрос один раз; вам может быть полезно: http://stackoverflow.com/questions/659013/accessing-a-shared-file-unc-from-a-remote-non-trusted-domain-with-credentials – Randolpho

ответ

6

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

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

Будет проверять UNC-путь. Однако я чувствую, что вы неправильно поняли меня о доменах. В тестовой среде есть два отдельных домена и один на сайте, которые никогда не обмениваются друг с другом. С обеих сторон пользователь находится в домене, к которому он пытается получить доступ. –

+0

Кроме того, я не уверен на 100%, что у меня будет UNC-путь - системные администраторы клиентов настроили пользователя домена, чтобы иметь подключенный сетевой диск. Могу ли я еще UNC получить доступ к этому? –

0

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

Смежные вопросы