Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Манипуляции в AD из-под супер пользователя, КАК?
|
|||
|---|---|---|---|
|
#18+
Всем привет! Стоит задача создания объектов в AD, т.е. мне нужно приложение, которое может заводить группы рассылок для Exchange. Для таких операций требуются права администратора домена — это мне не подходит :(. Где-то читал, что можно выполнять все дейсвия из-под выделенного пользователя с такими привелегиями (как в линухе su). важно — нельзя менять на IIS пользователя IUSR_... и нельзя использовать имперсонейт (Web.Config). Может кто сталкивался с такой проблемой, подскажите решение плз! (Среда Win2003srv (IIS 6), ASP.NET 2.0, DC Win2k.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 16:06 |
|
||
|
Манипуляции в AD из-под супер пользователя, КАК?
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, <Аноним>, Вы писали: А>Стоит задача создания объектов в 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+ компонента.Я не злопамятный... Просто я злой, и память у меня хорошая! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 16:17 |
|
||
|
Манипуляции в AD из-под супер пользователя, КАК?
|
|||
|---|---|---|---|
|
#18+
Веб-сервис — гуд!!! :), как сам не сообразил :(, спасибо! Здравствуйте, 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+ компонента. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 16:23 |
|
||
|
Манипуляции в AD из-под супер пользователя, КАК?
|
|||
|---|---|---|---|
|
#18+
Есть ещё один альтернативный вариант, залезть в 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 17:02 |
|
||
|
|

start [/forum/topic.php?fid=18&fpage=857&tid=1388694]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
39ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
31ms |
get tp. blocked users: |
1ms |
| others: | 251ms |
| total: | 363ms |

| 0 / 0 |
