Имперсонализация
От: paz  
Дата: 29.04.08 04:30
Оценка:
Привет, коллеги.

Есть Интерактивный выбор объектов из Active Directory (Стандартный object picker диалог на C#) — оберточка для вывода нативного диалога.
Все это замечательно работает если программа запущена на компьютере, зарегистрированном в этом домене.
Если показать этот диалог на компьютере вне домена, вываливается стандартный диалог для ввода имени пользователя и пароля.
Вопрос — можно это как то избежать (программа будет работать с несколькими доменами)? Я с имперсонализацией не работал совсем и не знаю откуда копать.
Re: Имперсонализация
От: Pavel_Agurov Россия  
Дата: 29.04.08 12:51
Оценка:
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);
    }
  }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.