8

How do I specify the username and password in order for my program to open a file for reading? The program that needs to access the file is running from an account that does not have read access to the folder the file is in. Program is written in C# and .NET 2, running under XP and file is on a Windows Server 2003 machine.

3 Answers3

12

You want to impersonate a user who does have the rights to access the file.

I recommend using a class like this - http://www.codeproject.com/KB/cs/zetaimpersonator.aspx. It hides all the nasty implementation of doing impersonation.

using (new Impersonator("myUsername", "myDomainname", "myPassword"))
{
  string fileText = File.ReadAllText("c:\test.txt");
  Console.WriteLine(fileText);
}
James Newton-King
  • 48,174
  • 24
  • 109
  • 130
  • This works great. I found the file paths must be in UNC format if located on another machine. –  Oct 30 '08 at 11:12
  • 1
    Works for me too, took me a while get it to work because I missed the remark made on the referenced page: _Please note: The user context that initiates the impersonation (i.e. not the user context to which it is switched to) needs to have the "Act as part of operating system" privilege set._ – user254875486 Mar 07 '12 at 13:04
  • It's a shame that the codeproject's author never moved it into Nuget. My answer's commentary was only meant for fun; for it is understood that you answered this 8 years ago before Nuget. – ΩmegaMan Feb 18 '16 at 21:44
6

I have used the Nuget package NuGet Gallery | Simple Impersonation Library 1.1.0 but there are others; search on Impersonation for the others.

Example usage using the interactive login to work with file structures:

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

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

James' answer below was before Nuget and before he would later have the most downloaded package on Nuget. Ironic eh?

ΩmegaMan
  • 29,542
  • 12
  • 100
  • 122
0

You can impersonate a user who has the necessary rights. There is an article on MSDN that describes how to do this.

Joe
  • 122,218
  • 32
  • 205
  • 338