2010-03-23 22 views
11

Antecedentes: tengo una aplicación que tiene que leer de archivos en una unidad de red (Z :)Acceso a un archivo en una unidad de red

Esto funciona muy bien en mi dominio de la oficina, sin embargo, no funciona en sitio (en un dominio diferente). Por lo que puedo decir, los usuarios de dominio y las unidades de red se configuran de la misma manera, sin embargo, no tengo acceso a los usuarios, etc. en el dominio de los clientes.

Cuando no pude acceder a la unidad de red, pensé que necesitaba un token para un usuario. Esta es la forma en que el usuario 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(); 
} 

Ahora aquí es la parte interesante/raro. En mi red, la aplicación ya puede acceder a la unidad de red, y si intento suplantar al usuario activo (exactamente el mismo usuario, incluido el mismo dominio), no podrá acceder a la unidad de red.

Esto me deja indefenso ya que ahora no tengo idea de qué funciona y qué no, y más concretamente, ¿funcionará en el sitio?

¿Qué me estoy perdiendo?

EDIT: Olvidé escribir esto mientras originalmente preguntaba: He intentado ingresar un nombre de dominio válido y no funcionó, así que después de eso intenté ingresar null para obtener el mismo nombre de usuario que lo haría sin este código (ya que funciona por defecto en nuestro dominio). Esto no ayudó, y así es como domain = null; terminó en esta pregunta.

+3

Apuesto a que los chicos del Superusuario argumentarían lo contrario (ya que esto tiene código). – Codesleuth

+0

¿Por qué no le das a la cuenta que ejecuta este código acceso de lectura a la unidad? Entonces su código se convierte en esto: 'File.ReadAllBytes (filePath);' – ChaosPandion

+0

Hice una pregunta similar una vez; puede encontrarlo útil: http://stackoverflow.com/questions/659013/accessing-a-shared-file-unc-from-a-remote-non-trusted-domain-with-credentials – Randolpho

Respuesta

6

Algunos pensamientos:

  • no utilice rutas de unidades lógicas para acceder a los recursos de red de código. Siempre use rutas UNC (por ejemplo, \\SERVER\Share\Filename.ext).
  • Habilite la auditoría de los eventos de inicio y cierre de sesión de su política de seguridad local para que cuando llame al método Impersonate, pueda rastrear la falla/éxito en gran detalle
  • Sería mejor crear una cuenta en su propio dominio que tiene el mismo nombre de usuario y contraseña que una cuenta en el otro dominio. Autentique su dominio y la autenticación PassThrough le dará acceso a la red compartida en el otro dominio.
+0

Probará la ruta UNC. Sin embargo, siento que me has entendido mal sobre los dominios. Hay dos dominios separados en el entorno de prueba y uno en el sitio que nunca se comunican entre sí. En ambos lados, el usuario se encuentra en el dominio al que está intentando acceder. –

+0

Además, no estoy 100% seguro de que tendré la ruta UNC: los administradores del sistema del cliente han configurado un usuario de dominio para que pueda tener una unidad de red asignada. ¿Puedo seguir UNC para acceder a eso? –

0

Esto puede sonar estúpido pero ¿ha intentado cambiar la forma en que está accediendo a la unidad? Quizás instale alguna forma de controlador virtual que le permita ver información en la unidad. SSH, por ejemplo?

Cuestiones relacionadas