2008-10-30 13 views
7

¿Cómo especifico el nombre de usuario y la contraseña para que mi programa abra un archivo para leer? El programa que necesita acceder al archivo se ejecuta desde una cuenta que no tiene acceso de lectura a la carpeta donde está el archivo. El programa está escrito en C# y .NET 2, ejecutándose bajo XP y el archivo está en un servidor de Windows Máquina 2003¿Cómo presentar las credenciales para abrir el archivo?

Respuesta

0

Puede suplantar a un usuario que tenga los derechos necesarios. Hay un article on MSDN que describe cómo hacer esto.

12

Desea suplantar a un usuario que tiene los derechos para acceder al archivo.

Recomiendo usar una clase como esta - http://www.codeproject.com/KB/cs/zetaimpersonator.aspx. Oculta toda la desagradable implementación de hacer suplantación.

using (new Impersonator("myUsername", "myDomainname", "myPassword")) 
{ 
    string fileText = File.ReadAllText("c:\test.txt"); 
    Console.WriteLine(fileText); 
} 
+0

Esto funciona genial. Descubrí que las rutas de archivos deben estar en formato UNC si están ubicadas en otra máquina. –

+1

Funciona para mí también, me llevó un tiempo hacerlo funcionar porque me perdí la observación hecha en la página referenciada: _Tenga en cuenta: El contexto del usuario que inicia la suplantación (es decir, no el contexto del usuario al que se cambia) necesita tiene el conjunto de privilegios "Actuar como parte del sistema operativo". –

+0

Es una pena que el autor del proyecto de código nunca lo haya movido a Nuget. El comentario de mi respuesta fue solo para divertirme; porque se entiende que respondiste esto hace 8 años antes que Nuget. – OmegaMan

5

He utilizado el paquete Nuget NuGet Gallery | Simple Impersonation Library 1.1.0 pero hay otros; búsqueda de Suplantación para los demás.

Ejemplo de uso mediante el inicio de sesión interactivo para trabajar con estructuras de archivos:

using (Impersonation.LogonUser("{domain}", 
           "{UserName}", 
           "{Password}", 
           LogonType.Interactive)) 
{ 
    var directory = @"\\MyCorpServer.net\alpha\cars"; 

    Assert.IsTrue(Directory.Exists(directory)); 
} 

respuesta de James abajo era antes Nuget y antes de que más tarde tendría el paquete más descargado en Nuget. Irónico, ¿eh?

+0

Simple, muchas gracias! –

Cuestiones relacionadas