Вопрос:
Можно ли сохранить файл в сетевую директорию используя учетную запись другого пользователя?
Подробности:
Есть служба, работающая под учетно записью 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");
}
Комментариев нет:
Отправить комментарий