powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Манипуляции в AD из-под супер пользователя, КАК?
4 сообщений из 4, страница 1 из 1
Манипуляции в AD из-под супер пользователя, КАК?
    #34047912
Аноним
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!

Стоит задача создания объектов в AD, т.е. мне нужно приложение, которое может заводить группы рассылок для Exchange.
Для таких операций требуются права администратора домена — это мне не подходит :(. Где-то читал, что можно выполнять все дейсвия из-под выделенного пользователя с такими привелегиями (как в линухе su).

важно — нельзя менять на IIS пользователя IUSR_... и нельзя использовать имперсонейт (Web.Config).

Может кто сталкивался с такой проблемой, подскажите решение плз!

(Среда Win2003srv (IIS 6), ASP.NET 2.0, DC Win2k.)
...
Рейтинг: 0 / 0
Манипуляции в AD из-под супер пользователя, КАК?
    #34047959
Gollum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте, <Аноним>, Вы писали:

А>Стоит задача создания объектов в AD, т.е. мне нужно приложение, которое может заводить группы рассылок для Exchange.
А>Для таких операций требуются права администратора домена — это мне не подходит :(. Где-то читал, что можно выполнять все дейсвия из-под выделенного пользователя с такими привелегиями (как в линухе su).
А>важно — нельзя менять на IIS пользователя IUSR_... и нельзя использовать имперсонейт (Web.Config).
А>(Среда Win2003srv (IIS 6), ASP.NET 2.0, DC Win2k.)

Вынести работу с AD в отдельный веб-сервис, ему в application pool в IIS 6.0 установить пользователя, обладающего нужными правами. Настроить веб-сервис таким образом, чтобы его могли вызывать только те приложения, которые имеют на это право.

Вариант номер 2 — не web service, а windows service, вариант номер 3 — COM+ компонента.Я не злопамятный... Просто я злой, и память у меня хорошая!
...
Рейтинг: 0 / 0
Манипуляции в AD из-под супер пользователя, КАК?
    #34047982
Аноним
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Веб-сервис — гуд!!! :), как сам не сообразил :(, спасибо!




Здравствуйте, Gollum, Вы писали:

G>Здравствуйте, <Аноним>, Вы писали:

А>>Стоит задача создания объектов в AD, т.е. мне нужно приложение, которое может заводить группы рассылок для Exchange.
А>>Для таких операций требуются права администратора домена — это мне не подходит :(. Где-то читал, что можно выполнять все дейсвия из-под выделенного пользователя с такими привелегиями (как в линухе su).
А>>важно — нельзя менять на IIS пользователя IUSR_... и нельзя использовать имперсонейт (Web.Config).
А>>(Среда Win2003srv (IIS 6), ASP.NET 2.0, DC Win2k.)

G>Вынести работу с AD в отдельный веб-сервис, ему в application pool в IIS 6.0 установить пользователя, обладающего нужными правами. Настроить веб-сервис таким образом, чтобы его могли вызывать только те приложения, которые имеют на это право.

G>Вариант номер 2 — не web service, а windows service, вариант номер 3 — COM+ компонента.
...
Рейтинг: 0 / 0
Манипуляции в AD из-под супер пользователя, КАК?
    #34048187
Dmitry Uvarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть ещё один альтернативный вариант, залезть в AD прямо из текущего потока. Код не помню откуда стырил, так что без копирайтов. Как пользоваться - надеюсь, догадаешься. Единственный минус - придется в шифрованном виде где-то держать пароль и логин на этот аккаунт. Зато не надо выставлять и шифровать веб-сервис :)

using System;
using System.Security;
using System.Runtime.InteropServices;
using System.Security.Principal;
using System.Security.Permissions;
[assembly:SecurityPermissionAttribute(SecurityAction.RequestMinimum, UnmanagedCode=true)]
[assembly:PermissionSetAttribute(SecurityAction.RequestMinimum, Name = "FullTrust")]
namespace bla-bla-bla
{
 /// <summary>
 /// Summary description for Impersonation.
 /// </summary>
 public class Impersonation
 {
  private const int LOGON32_PROVIDER_DEFAULT = 0;
  //This parameter causes LogonUser to create a primary token.
  private const int LOGON32_LOGON_INTERACTIVE = 2;
  private const int SecurityImpersonation = 2;
  private WindowsImpersonationContext _impersonatedUser;
  private IntPtr _tokenHandle = IntPtr.Zero;
  private IntPtr _dupeTokenHandle = IntPtr.Zero;
  private static string _lastError;
  public static Impersonation Impersonate( string userName, string machineName, string password )
  {
   IntPtr tokenHandle = IntPtr.Zero;
   IntPtr dupeTokenHandle = IntPtr.Zero;
   // Call LogonUser to obtain a handle to an access token.
   bool retVal = LogonUser(userName, machineName, password,
    LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
    ref tokenHandle);
   
   if (false == retVal)
   {
    int ret = Marshal.GetLastWin32Error();
    _lastError = string.Format("LogonUser failed with error code : {0}\nError: [{0}] {1}\n", ret, GetErrorMessage(ret) );
    return null;
   }
   retVal = DuplicateToken( tokenHandle, SecurityImpersonation, ref dupeTokenHandle);
   if (false == retVal)
   {
    CloseHandle(tokenHandle);
    _lastError = "Exception thrown in trying to duplicate token.";
    return null;
   }
   // The token that is passed to the following constructor must
   // be a primary token in order to use it for impersonation.
   WindowsIdentity newId = new WindowsIdentity(dupeTokenHandle);
   WindowsImpersonationContext impersonatedUser = newId.Impersonate();
   
   Impersonation imp = new Impersonation();
   imp._impersonatedUser = impersonatedUser;
   imp._tokenHandle = tokenHandle;
   imp._dupeTokenHandle = dupeTokenHandle;
   return imp;
  }
  public static string LastError
  {
   get
   {
    return _lastError;
   }
  }
  
  public void Undo()
  {
   _impersonatedUser.Undo();
  
   // Free the tokens.
   if (_tokenHandle != IntPtr.Zero)
    CloseHandle(_tokenHandle);
   if (_dupeTokenHandle != IntPtr.Zero)
    CloseHandle(_dupeTokenHandle);
  }
  [DllImport("advapi32.dll", SetLastError=true)]
  public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword,
   int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
  [DllImport("kernel32.dll", CharSet=System.Runtime.InteropServices.CharSet.Auto)]
  private static extern int FormatMessage(int dwFlags, ref IntPtr lpSource,
   int dwMessageId, int dwLanguageId, ref String lpBuffer, int nSize, ref IntPtr Arguments);
  [DllImport("kernel32.dll", CharSet=CharSet.Auto)]
  public extern static bool CloseHandle(IntPtr handle);
  [DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]
  public extern static bool DuplicateToken(IntPtr ExistingTokenHandle, int SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle);
  // GetErrorMessage formats and returns an error message
  // corresponding to the input errorCode.
  public static string GetErrorMessage(int errorCode)
  {
   int FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x00000100;
   int FORMAT_MESSAGE_IGNORE_INSERTS = 0x00000200;
   int FORMAT_MESSAGE_FROM_SYSTEM  = 0x00001000;
   int messageSize = 255;
   String lpMsgBuf = "";
   int dwFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS;
   IntPtr ptrlpSource = IntPtr.Zero;
   IntPtr prtArguments = IntPtr.Zero;
       
   int retVal = FormatMessage(dwFlags, ref ptrlpSource, errorCode, 0, ref lpMsgBuf, messageSize, ref prtArguments);
   if (0 == retVal)
   {
    throw new Exception("Failed to format message for error code " + errorCode + ". ");
   }
   return lpMsgBuf;
  }
 }
}

 
 http://ln.com.ua/~openxs/articles/smart-questions-ru.html
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Манипуляции в AD из-под супер пользователя, КАК?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]