Ver Mensaje Individual
  #3 (permalink)  
Antiguo 20/09/2005, 12:40
Diana
 
Fecha de Ingreso: febrero-2002
Mensajes: 9
Antigüedad: 22 años, 2 meses
Puntos: 0
Hola, si ya me funciono era justo eso lo q me faltaba, ahora tengo otro problema, mira lo platico q ver si tienes alguna sugenrecia:

sucede q tengo q hacer una pagina donde voy a desplegar un rpt , dicho rpt se toma en base a la validacion de un usuario que esta en una base de datos, en la bd se tiene la ruta en la q se encuentra el archivo rpt dentro de la intranet, por lo q seun el usuario q ingrese es el reporte q le mando , el usuario es un usuario valido para los equipos en la red, el ejemplo q puse es un usuario q tiene acceso a la carpeta donde esta el rpt, si por ejemplo entro a Inicio- Ejecutar y le pongo la ip \\172.16.0.67 me manda la ventana para q ponga el usuario y el pass y ya entra a la carpeta donde estan los rpt de esa maquina.
Ahora bien esto lo quiero haces en el asp, pido el usuario y el pass, y voy a la bd y checo q reporte debe ver y en q ruta esta, y es lo q le mando al dll, como ya te habia comentado si ejecuto el dll en una aplicacion de windows si me crea el reporte en mi maquina para asi asignarselo a un visor de reportes, pero al usar el dll en el asp me manda esto:

Server Error in '/SVRClient' Application.
--------------------------------------------------------------------------------

Error de inicio de sesión: nombre de usuario desconocido o contraseña incorrecta.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.IO.IOException: Error de inicio de sesión: nombre de usuario desconocido o contraseña incorrecta.

Source Error:


Line 40: //string sUser=WindowsIdentity.GetCurrent().Name;
Line 41:
Line 42: WebResponse oWebResp= oWebReq.GetResponse();
Line 43:
Line 44: if ( oWebResp.ContentLength>0 )


Source File: e:\proyectos asci\proyecto cocoon\dll\classlibrary1\class1.cs Line: 42

Stack Trace:


[IOException: Error de inicio de sesión: nombre de usuario desconocido o contraseña incorrecta.
]
System.IO.__Error.WinIOError(Int32 errorCode, String str) +723
System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, Boolean useAsync, String msgPath, Boolean bFromProxy) +888
System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, Boolean useAsync) +46
System.Net.FileWebStream..ctor(String path, FileMode mode, FileAccess access, FileShare sharing, Int32 length, Boolean async)
System.Net.FileWebResponse..ctor(Uri uri, FileAccess access, Boolean asyncHint)

[WebException: Error de inicio de sesión: nombre de usuario desconocido o contraseña incorrecta.
]
System.Runtime.Remoting.Proxies.RealProxy.EndInvok eHelper(Message reqMsg, Boolean bProxyCase) +497
System.Runtime.Remoting.Proxies.RemotingProxy.Invo ke(Object NotUsed, MessageData& msgData) +598
System.Net.AsyncGetResponse.EndInvoke(IAsyncResult result) +0
System.Net.FileWebRequest.EndGetResponse(IAsyncRes ult asyncResult)
System.Net.FileWebRequest.GetResponse()
ClassLibrary1.Class1.AddReport(String sName, String sPass, String Domain, String File) in e:\proyectos asci\proyecto cocoon\dll\classlibrary1\class1.cs:42
SVRClient.WebForm1.Page_Load(Object sender, EventArgs e) in c:\inetpub\wwwroot\svrclient\frmcarga.aspx.cs:83
System.Web.UI.Control.OnLoad(EventArgs e)
System.Web.UI.Control.LoadRecursive()
System.Web.UI.Page.ProcessRequestMain()




--------------------------------------------------------------------------------
Version Information: Microsoft .NET Framework Version:1.1.4322.573; ASP.NET Version:1.1.4322.573

Cheq con string sUser=WindowsIdentity.GetCurrent().Name; que usuario esta activo y me manda el de DIANAPC\ASPNET, pero si le pongo lo de impersonate y le paso los datos de por ejemplo INFORMADOR\ale me manda como usuario el de DIANAPC\Invitado y aun asi me manda el fallo.

Mi codigo es el siguiente:
el codigo q puse para el Dll q es el que se conecta al servidor remoto toma el archivo y lo copia en mi servidor:

public void AddReport(string sName,string sPass, string Domain,string File)
{
string sUserName=sName;//@"INFORMADOR\ale";
string sPassword=sPass;//"avalos";
string sDomain=Domain;//"INFORMADOR"; // con los datos del password.
string sUri=File;//"file:////172.16.0.67/Sitio/Caj/Reportes/P5rEntregaCajaSuscripciones.rpt";
Uri oNewUri = new Uri(sUri);
string sFile = sUri.Substring(sUri.LastIndexOf("/")+1);

FileWebRequest oWebReq = (FileWebRequest) WebRequest.Create(oNewUri);

oWebReq.Method="GET";//"POST";
CredentialCache wrCache = new CredentialCache();
wrCache.Add(new Uri(sUri),"Digest",new NetworkCredential(sUserName,sPassword,sDomain)); // aqui se ponen los datos de login
oWebReq.Credentials = wrCache;

WebResponse oWebResp= oWebReq.GetResponse();

if ( oWebResp.ContentLength>0 )
{
byte[] bytes = new byte[oWebResp.ContentLength];

Stream oStreamOut = oWebResp.GetResponseStream ();
oStreamOut.Read(bytes,0,bytes.Length);
FileStream fs = new FileStream(sFile,FileMode.CreateNew);
fs.Write(bytes,0,bytes.Length);
fs.Close();
oStreamOut.Close();

}

Y ahora si esta dll la agrego en un proyecto de winforms funciona bien pero la mismas lineas donde la mando llamar en un web form no funciona, aqui el codigo:

private void Page_Load(object sender, System.EventArgs e)
{
// Put user code to initialize the page here

this.ImpersonateUser("Diana","diana","DIANAPC");
string sUser=WindowsIdentity.GetCurrent().Name;

Class1 oClass = new Class1();
oClass.AddReport(@"INFORMADOR\ale","avalos","INFOR MADOR","file:////172.16.0.67/Sitio/Caj/Reportes/P5rEntregaCajaSuscripciones.rpt");

}

Meti lo de impersonate para ver si era por eso q no me dejaba aqui la funcion:

[DllImport("advapi32.dll", SetLastError=true)]
private static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
[DllImport("kernel32.dll", CharSet=CharSet.Auto)]
private static extern bool CloseHandle(IntPtr handle);
// constants used by LogonUser() method
private const int LOGON32_LOGON_NETWORK = 3;
private const int LOGON32_PROVIDER_DEFAULT = 0;

private WindowsImpersonationContext wic = null;
private WindowsIdentity currentIdentity = null;
public void ImpersonateUser(string login, string password, string domain)
{
// Get current Identity
currentIdentity = WindowsIdentity.GetCurrent();
// handle returned from the LogonUser() method
IntPtr handle = new IntPtr(0);
handle = IntPtr.Zero;
// try to login to the domain
bool logonUser = LogonUser(login, domain, password,
LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, ref handle);
// login unsuccessful
if(!logonUser)
{
// get the error
int lastWin32Error = Marshal.GetLastWin32Error();
throw new Exception("ImpersonateUser failed<br>Win32Error: " +
lastWin32Error);
}
// create a new WindowsIdentity, set the CurrentPrincipal and Impersonate the user
WindowsIdentity wi = new WindowsIdentity(handle, "NTLM", WindowsAccountType.Normal, true);
Thread.CurrentPrincipal = new WindowsPrincipal(wi);
wic = wi.Impersonate();
// close the handle
CloseHandle(handle);
}
public void Undo()
{
// Impersonate back to original identity
wic.Undo();
Thread.CurrentPrincipal = new WindowsPrincipal(currentIdentity);
currentIdentity.Impersonate();
}

Bueno espero pueda darme alguna sugerencia en verdad ya una semana con esto y me esta volviendo loca, de antemano muchisimas gracias
Saludos!!