Привет, коллеги.
Есть
Интерактивный выбор объектов из Active Directory (Стандартный object picker диалог на C#) — оберточка для вывода нативного диалога.
Все это замечательно работает если программа запущена на компьютере, зарегистрированном в этом домене.
Если показать этот диалог на компьютере вне домена, вываливается стандартный диалог для ввода имени пользователя и пароля.
Вопрос — можно это как то избежать (программа будет работать с несколькими доменами)? Я с имперсонализацией не работал совсем и не знаю откуда копать.
paz>Я с имперсонализацией не работал совсем и не знаю откуда копать.
Копайте в
этуАвтор(ы): Агуров П.В.
При написании программ особенно важно не тратить время на поиск стандартных решений, а сосредоточиться на решении конкретной задачи, используя готовый эффективный код, разработанный и проверенный коллегой-программистом. В этой книге собраны лучшие рецепты и решения, которые пригодятся вам при разработке программ любой сложности и помогут создать действительно качественный и быстрый код. Вам не потребуется читать множество документации — ведь можно просто взять готовый пример. Книга будет полезна как разработчикам программ на С#, так и тем, кто переходит на язык С# с других языков программирования.
На компакт-диске размещены все исходные коды, приведенные в книге.
сторону
using System;
using System.Runtime.InteropServices;
using System.Security.Principal;
namespace LogonUser
{
class Class1
{
private const int LOGON32_LOGON_INTERACTIVE = 2;
private const int LOGON32_LOGON_NETWORK_CLEARTEXT = 3;
private const int LOGON32_PROVIDER_DEFAULT = 0;
[DllImport("advapi32.dll", CharSet=CharSet.Auto)]
static extern int LogonUser (string lpszUserName,
string lpszDomain, string lpszPassword, int dwLogonType,
int dwLogonProvider, ref IntPtr phToken);
[DllImport("advapi32.dll", CharSet=CharSet.Auto,
SetLastError=true)]
static extern int DuplicateToken (IntPtr hToken,
int impersonationLevel, ref IntPtr hNewToken);
[STAThread]
static void Main(string[] args)
{
// Печатаем текущего пользователя
WindowsIdentity wi = WindowsIdentity.GetCurrent();
Console.WriteLine("Name={0} --> {1}", wi.Name,
wi.IsAuthenticated);
string UserName = "Administrator";
string Password = "123";
// Для сохранения текущей имперсонации
WindowsImpersonationContext impersonationContext = null;
try
{
// Имперсонируем другого пользователя
WindowsIdentity newIdentity;
IntPtr token = IntPtr.Zero;
IntPtr tokenDuplicate = IntPtr.Zero;
if(LogonUser(UserName, Environment.MachineName, Password,
LOGON32_LOGON_NETWORK_CLEARTEXT,
LOGON32_PROVIDER_DEFAULT, ref token) != 0)
{
if(DuplicateToken(token, 2, ref tokenDuplicate) != 0)
{
newIdentity = new WindowsIdentity(tokenDuplicate);
// При имперсонации возвращается текущее значение
impersonationContext = newIdentity.Impersonate();
}
}
}
catch(Exception Ex)
{
Console.WriteLine("Ошибка ммперсонации
пользователя {0}: {1}", UserName, Ex);
}
// Новая имперсонация
WindowsIdentity wi1 = WindowsIdentity.GetCurrent();
Console.WriteLine("Name={0} --> {1}",
wi1.Name, wi1.IsAuthenticated);
// Возвращаем предыдущую имперсонацию
if (impersonationContext != null)
impersonationContext.Undo();
// Печатаем снова
WindowsIdentity wi2 = WindowsIdentity.GetCurrent();
Console.WriteLine("Name={0} --> {1}",
wi2.Name, wi2.IsAuthenticated);
}
}
}