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.
Apuesto a que los chicos del Superusuario argumentarían lo contrario (ya que esto tiene código). – Codesleuth
¿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
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