Страницы

Поиск по вопросам

понедельник, 22 октября 2018 г.

Сохранение файла от имени пользователя C#

Вопрос: Можно ли сохранить файл в сетевую директорию используя учетную запись другого пользователя?
Подробности: Есть служба, работающая под учетно записью System. Служба, кроме прочего, занимается синхронизацией со сторонним сервисом из которого нужно выкачивать файлы и складывать в сетевую папку. Но у System нет прав доступа к сетевой папке. Зато служба знает логин/пароль пользователя, у которого такие права есть.
(Пока видится только сохранение файла в temp и запуск копирования через Process.Start, но может быть есть что-то более элегантное?)


Ответ

Вы можете выполнить код внутри своего процесса от другого пользователя. Сначала импортируем WinAPI функцию LogonUser
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)] public static extern bool LogonUser( string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr phToken);
А дальше вот так:
IntPtr token; if (LogonUser("SomeUser", "SomeDomain", "SomePwd", 2, 0, out token)) { var identity = new WindowsIdentity(token); using (identity.Impersonate()) { // здесь вы можете убедиться, что код выполняется под другим юзером Console.WriteLine(Environment.UserName); // делаем что-то File.WriteAllText(@"path.txt", "hello!"); } } else { Console.WriteLine("Invalid credentials"); }

Комментариев нет:

Отправить комментарий