Как предоставить учетные данные для открытия файла?

Как указать логин и пароль, чтобы моя программа открыла файл для чтения? Программа, которой необходим доступ к файлу, запускается из-под учетной записи, у которой нет доступа для чтения к папке, в которой находится файл. Программа написана на C# и .NET 2, работает под XP, а файл находится на компьютере с Windows Server 2003.


person Community    schedule 30.10.2008    source источник


Ответы (3)


Вы хотите выдать себя за пользователя, у которого есть права доступа к файлу.

Я рекомендую использовать такой класс: http://www.codeproject.com/KB/cs/zetaimpersonator.aspx. Он скрывает всю неприятную реализацию олицетворения.

using (new Impersonator("myUsername", "myDomainname", "myPassword"))
{
  string fileText = File.ReadAllText("c:\test.txt");
  Console.WriteLine(fileText);
}
person James Newton-King    schedule 30.10.2008
comment
Это прекрасно работает. Я обнаружил, что пути к файлам должны быть в формате UNC, если они расположены на другом компьютере. - person ; 30.10.2008
comment
У меня тоже работает, мне потребовалось некоторое время, чтобы заставить его работать, потому что я пропустил замечание, сделанное на странице, на которую ссылаются: Обратите внимание: пользовательский контекст, который инициирует олицетворение (т. е. не пользовательский контекст, на который он переключается) должен иметь Act как часть набора привилегий операционной системы. - person rael_kid; 07.03.2012
comment
Жаль, что автор codeproject так и не перенес его в Nuget. Комментарий моего ответа был предназначен только для развлечения; ибо понятно, что вы ответили на это 8 лет назад до Nuget. - person ΩmegaMan; 19.02.2016

Я использовал пакет Nuget NuGet Gallery | Простая библиотека олицетворения 1.1.0, но есть и другие; поиск на Олицетворение для других.

Пример использования интерактивного входа для работы с файловыми структурами:

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

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

Ответ Джеймса ниже был до Nuget и до того, как он позже получит самый загружаемый пакет в Nuget. Иронично, да?

person ΩmegaMan    schedule 18.02.2016

Вы можете выдавать себя за пользователя, имеющего необходимые права. В MSDN есть статья, в которой описывается, как это сделать.

person Joe    schedule 30.10.2008