Я пытаюсь выдать себя за пользователя в C#, чтобы подключиться к файлу Access на удаленном сервере. Нет разрешений на чтение или запись для всех пользователей, поэтому я решил выдать себя за пользователя с правами на выполнение запросов, которые мне нужны.
Проблема в том, что когда я выполняю олицетворение, все работает нормально (или кажется, ), но когда я делаю запрос и пытаюсь заполнить DataTable, выполнение закрывается (я делаю запрос в блоке try-catch, но не фиксирует ошибку).
Еще одна вещь это: когда я выполняю это на своем собственном компьютере, это работает, но когда кто-то пытается на другом компьютере с его собственным пользователем (и пытается выдать себя за моего пользователя, чтобы получить разрешение), это когда происходит сбой выполнения.
Может кто-нибудь help?
Блок олицетворения:
try
{
Console.WriteLine("Original user: " + WindowsIdentity.GetCurrent().Name);
System.Console.ReadLine();
context.Enter();
Console.WriteLine("Impersonated user: " + WindowsIdentity.GetCurrent().Name);
System.Console.ReadLine();
}
catch (Exception e)
{
System.Console.WriteLine("Error when impersonating user. \n Error: " + e.Message);
System.Console.ReadLine();
Environment.Exit(1);
}
Функция ввода получается из msdn:
[PermissionSetAttribute(SecurityAction.Assert, Name = "FullTrust")]
public void Enter()
{
if (this.IsInContext) return;
m_Token = new IntPtr(0);
try
{
m_Token = IntPtr.Zero;
bool logonSuccessfull = LogonUser(
m_Username,
m_Domain,
m_Password,
LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT,
ref m_Token);
if (logonSuccessfull == false)
{
int error = Marshal.GetLastWin32Error();
throw new Win32Exception(error);
}
WindowsIdentity identity = new WindowsIdentity(m_Token);
m_Context = identity.Impersonate();
}
catch (Exception exception)
{
// Catch exceptions here
throw exception;
}
}
и код чтения Access:
try
{
System.Console.WriteLine("Let's generate the adapter.");
System.Console.ReadLine();
PruebaIntegracionDataSetTableAdapters.ConsultaTableAdapter adapter = new PruebaIntegracionDataSetTableAdapters.ConsultaTableAdapter();
System.Console.WriteLine("Adapter generated. Let's read the file.");
System.Console.ReadLine();
// this is the line that crashes and closes the execution
adapter.Fill(dsIntegracion.Consulta);
System.Console.WriteLine("File readed. Let's show the reaults.");
System.Console.ReadLine();
foreach (PruebaIntegracionDataSet.ConsultaRow fila in dsIntegracion.Consulta)
{
System.Console.WriteLine(fila.Apellidos);
}
}
catch (Exception e)
{
System.Console.WriteLine("Access connection problems. \n Error: " + e.Message);
System.Console.ReadLine();
Environment.Exit(1);
}
System.Console.ReadLine();
Я попытался скопировать файл в локальную папку, и то же самое, когда другой пользователь пытается скопировать его. Если я не выполняю олицетворение, он показывает контролируемую ошибку: нет разрешений. Если я выполняю олицетворение, но другой пользователь не дает моим пользователям разрешения на запись в его собственной папке, это также показывает контролируемую ошибку: нет разрешений. Когда у олицетворенного пользователя есть все разрешения, необходимые для копирования из удаленной папки и записи в локальную папку при сбое.