• Что требуется для почты на физически разделенных серверах и доменах (теория)?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    1. Чтобы Exchange Server принимал почту для другого домена, этот домен в нем должен быть прописан в Обслуживаемых доменах с типом "Внутренняя ретрансляция". А для фактической отправки почты на другой домен нужно создать соединитель отправки для этого домена с назначением (smarthost) на сервер, фактически обслуживающий этот домен. Сервер на том конце может быть совершенно любым сервером SMTP.
    2. Адреса для п/я в Exchange настраиваются политиками адресов: в политике должен быть прописан первичный домен для адреса SMTP (используется и для отправки и для приема) и может быть несколько вторичных доменов. На той стороне, где нужно поменять адреса, просто добавьте в политику нужный домен с нужным типом. Кстати, если политика поменяет первичнй адрес п/я, то его бывший первичный адрес останется в качестве вторичного, так что, если новым пользователям не нужно добавлять адреса из старого домена, то в политике можно просто заменить первичный домен на новый, не оставляя старый вторичным.
    3. Чтобы письма с Exchange с адресом его обслуживаемого домена могли отправляться на другой сервер SMTP (в том числе - в Exchange в другом лесу), нужно сменить тип этого домена с полномочного на внутреннюю ретрансляциию и создать соединитель отправки аналогично п.1
    4. Вам наверняка потребуется синхронизировать адресные книги обоих Exchange. Раньше для этого можно было использовать бесплатный упрощенный вариант Microsoft Identity Integration Server (названия у него были разные, но суть одна: синхронизация AD между разными лесами, так чтобы пользователи с п/я из одного леса отображались как контакты в другом). Остался ли он сейчас - не интересовался. Но, в принципе, это может делаться и скриптом.
    5. Вариантов совместного использования Exchange много разных (например, можно сделать общие календари). Но тут я их рассматривать не буду - вы все равно, скорее всего, захотите все это поскорее мигрировать в один лес. Но если интересно - ищите книги/документацию по Exchange 2007: эта функция (называется "федерация") в современном виде появилась там, и лучшие описания относятся именно к этой версии. С тех пор мало что поменялось, потому что MS пошла в облака.
    6. При миграции есть возможность заводить п/я в одном лесу для пользователей из другого, доверенного леса (называется это Linked Mailbox, как по-русски - точно не помню). Для этого, кстати,в Exchange есть скрипт (его использовали для подготовки миграции с ADMT или ему подобными).
    Ответ написан
    Комментировать
  • Как в Powershell вывести сообщение из логов полностью?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Get-WinEvent -LogName Application -MaxEvents 10 | Format-List Machinename, TimeCreated, Message
    Ответ написан
    Комментировать
  • Почему не работает замена буфера?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Так, как вы сделали, приложения для Windows GUI не пишутся. У вас цикл с ожиданием сделан совершенно неправильно.
    Обработка всего графического интерфейса в программе (в том числе и буфера обмена) в Windows выполняется одним потоком, через цикл сообщений. А вы этот поток захватили и не отдаете. Возможно, именно поэтому не работает и установка содержимого буфера обмена: ЕМНИП она тоже реализована через сообщения (но точно не помню), а шанс обработать очередь сообщний у вашей программы нет.
    Короче, переписывайте цикл чтобы никаких Thread.Sleep в нем не было. Например - добавляйте в форму таймер (System.Windows.Forms.Timer) и переносите вашу обработку буфера обмена в обработчик его события Tick.
    А там уже смотрите - работает она, или нет.
    Ответ написан
    Комментировать
  • Как хранить товары с различными опциями в БД?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Ответ на вопрос "как хранить" зависит от того, какие данные вы будете запрашивать. То есть - от представлений данных, с которыми работает ваша программа (программы). Именно на основе этих представлений синтезируется полная модель даннных, хранящаяся в БД.
    В свое время, лет 25 назад, был (может, и сейчас есть) стандартизированный подход, называвшийся IDEF1 (это имя из стандарта) или Entity-RelationShip (это название процедуры), позволявший формальным образом синтезировать из этих, частных, представлений полную модель данных. И были программы, которые позволяли это делать. Я одной такой пользовался, ERwin называлась (AFAIK она жива и сейчас), но, в принципе, нужные процедуры можно выполнять и вручную. Описание процедуры на русском есть, как минимум одно, которое я знаю - в старой книге "Мартин Дж. Организация баз данных в вычислительных..."
    Короче, синтез модели ваших данных - это ваша задача, связанная со специфическими вашими задачами.
    Судя по информации из вашего вопроса, я могу только сказать, что:
    1. этот вариант вам явно не походит: данные из представления "Товары в корзине" включают товары из всех категорий, так что отделные таблицы для каждой категории - это костыль: ходить можно, а бежать - уже нет.
    2. В ItemOptions можно хранить данные для всех категорий - достаточно указать в каждой записи дополнительно к идентификатору товара идентификатор категории и идентификатор свойства. Потребуются ещё таблица категорий (идентификатор категории как первичный ключ плюс дополнительная информаци) и таблица свойств для каждой из категорий (идентифкатор свойства как первичный ключ, идентификатор категории - внешний, плюс дополнительная информация). Схема получается не очень уклюжая, но для работы в рамках реляционной модели более-менее годная (я когда-то такую и делал и с ней работал, но это было жутко давно). Насколько для вас такая схема пригодна - зависит от ваших моделей предствалений: например, будете ли вы в Корзине указывать дополнительную информацию из ItemOptions.
    3. NoSQL - это название больше коммерческое, а не техничекое: оно включает много разных технологий хранения в БД, единственным общим признаком которых является, что они - не реляционные. Под эту задачу мне видится годным вариант навигационной БД (это где каждая запись содержит физические ссылки на связанные с ней записи): сетевая, например. В настоящее время такие БД иногда ещё проходят под псевдонимом "графовая". Но, опять же, смотрите на нужные вам представления, в данном случае - обращайте внимание на пути доступа к данным (эти самые ссылки): навигационные БД в этом плане не так гибки, как реляционные, и отсутствие нужных ссылок может заставить ходить по кривым путям и убить тем самым производительность.
    Но это все теория, а что там сейчас на практике творится - я с уверенностью сказать не могу. Насколько я понимаю, там надо смотреь возможности конкретной СУБД - тем более, что производители часто называют их словом "гибридная", и надо понимать, что в этот гибрид попадает.
    Ответ написан
    2 комментария
  • Как в Windows Server DHCP добавить ip адрес в другой пул?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Во-первых, вы сделали суперобласть, включающую обе эти области ("пулы", если по-вашему)?
    Во вторых, если сделали, то проверьте MAC в записи аренды того адреса, который выдан: там иногда бывают чудеса - в виде дополнительных нулей, например.
    Ответ написан
    Комментировать
  • C# SqlTransaction блочит таблицу, как обойти блокировку или что делаю не так?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Игрался с уровнями блокировок connection.BeginTransaction(IsolationLevel.....) ни к чему это не привело.

    Попробуйте обе транзации - и основную, и в мелком методе - делать с уровнем изоляции Snapshot.
    По умолчанию изоляция транзакций в MS SQL реализуется через блокировки (изначально - обрабатываемых записей, но может переползти и на всю таблицу).
    А вообще, при работе с незакрытй транзакциейоя бы передавал в мелкий метод то подключение, на котором открыта транзакция, чтобы он работал с ней. Можно сделать этот параметр необязательным (null по умолчанию) и в случае, если он не передан - открывать дополнительное подключение.
    Ответ написан
    2 комментария
  • Код ошибки 10016 на Windows Server 2016 MSSQL, как исправить?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Чтобы устранить: запустите консоль конфигурирования DCOM (например dcomcfng.exe), перейдите в раздел Component Services/My Computer/DCOM Config, найдите там это приложение по имени (это некий "Flight API Settings Broker") или по AppId из события и дайте нужное разрешение указанной в событии учетной записи.
    Ответ написан
  • Как найти причину блокировки аккаунтов в Active Directory?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Включите аудит неудачных попыток входа в систему (через групповую политику) и смотрите в журналах Security событий Windows на КД и на всех серверах, куда пользователи не могут получить доступ.
    Предполагаемая причина, особенно, если у вас принята политика регулярной смены паролей для пользователей - устаревший запомненный пароль на устройствах пользователей. Обучите пользователей самостоятельно смотреть и удалять эти пароли.
    Ответ написан
  • Microsoft Exchange 2016 перестал работать после миграции на другой хост. Как исправить?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Чтобы вам помочь по существу, информации откровенно не хватает.
    Для ее получения, во-первых, надо анализировать журналы событий: какие там ошибки и предупреждения, во-вторых - логи IIS. У вас явно что-то с IIS. Запуск служб может не говорить ни о чем: например, вполне может не монтироваться БД (кажется, не ваш случай, но...).
    EMS не работает по понятной причине - он тоже в норме через IIS работает. Но если надо - то можно из Powershell добраться напрямую к Exchange: импортировать в сессию нужный для этого модуль командой
    Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn

    Запускать Powershell для этого надо пользователем, входящим (прямо или косвенно) в группы администраторрв леса и домена, где стоит Exchange, и администратора на самом Exchange, в режиме адинистратора.

    PS Как мигрировали-то? Вопрос, потому что сценарии миграции для виртуализованного Exchange поддерживаются весьма относительно. В частности, миграции через сохранение состояния VM не поддерживаются. Live Migration на Hyper-V поддерживается, на других гипервизорах - надо смотреть.
    Ответ написан
  • Как правильно называть такую композицию классов?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    IMHO это - вариант шаблона "Абстрактная фабрика"
    Первая приходящая на ум альтернтатива - та, в которой этот шаблон используется традиционно: реализации наследуются от абстрактного класса фабрики (см. пример для C# в статье по ссылке), а не получаются аггрегированием фактичекой реализации со статическим классом, предостатвляющим интерфейс, как у вас.
    Ответ написан
    Комментировать
  • Не пройдена проверка DFSREvent, как убрать ошибку?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    В журнал событий DFSR на DC08 загляните: там должно быть событие с ошибкой или предупреждением.
    Например - если перезагружали другой КД. Вот и смотрите, насколько там что-то серьезное сообщается.
    И да, эта проверка "вылечится" сама через, максимум, сутки - даже если репликация SYSVOL в реальности не работает ;-) .
    Ответ написан
  • Как записать названия папок в массив?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Есть: применить к каждому возвращенному имени папки функцию (статический метод) Path.GetRelativePath и записать результаты в новый массив. Короче всего это записать через LINQ, примерно так:
    String[] rel_folder_names = Directory.GetDirectories(RootFolder).Select(s=>Path.GetRelativePath(RootFolder,s)).ToArray();

    Но если пока не умеете или боитесь использовать LINQ, то можно это сделать в обычном цикле
    String[] full_folder_names=Directory.GetDirectories(RootFolder);
    String[] rel_folder_names = new String[](full_folder_names.Length);
    for(int i=0;i<full_folder_names.Length;i++) {
         rel_folder_names[i]=Path.GetRelativePath(RootFolder,full_folder_names[i]);
    }

    Как-то так.

    PS Весь код написан "из головы", так что ошибки могут быть.
    Ответ написан
    4 комментария
  • Гибридный Exchange, HELO и Ростелеком как победить?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    1. Правильно понимаете: всяческие антиспамы традиционно не любят, когда обратное разрешение IP в имя DNS дает не то имя, которое объявляется в HELO/EHLO.
    2. Если сервер у вас принимает почту из интернета напрямую, без Edge, то надо создать для этого специальный Receive Connector, чтобы почта из интернета воспринималась, как приходящая на него. Обычно этот Receive Connector привязывается к IP внешней сетевой карты (надеюсь, у вас есть такая?). Процедуры, в целом, описаны в документации: https://learn.microsoft.com/en-us/exchange/mail-fl...
    Ответ написан
    Комментировать
  • Большая очередь Exchange server 2016. Как исправить?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Я тут у вас на скриншоте не вижу никакой большой очереди. Вижу некоторое количество пустых очередей отправки на конкретные домены. Такие очереди живут после последней отправки нескоторое время (ради оптимизации - чтобы не создавать заново очередь для следующих сообщений в этот домен)
    Если у вас отправки в эти домены быть не должно, то причина может быть в том, что, как написал предыдущий автор, у вас отправляются NDR (отчет о недоставке) о несуществующем пользователе. Кстати, такие отчеты могут использоваться и для рассылки спама (так как адрес, куда идет отчет, контролирутся отправителем), так что рекомендую посылку их внешним получателям отключить (в Exchange Management Console): Set-RemoteDomain * -NDREnabled $false
    PS Настроить антиспам тоже будет не вредно.
    Ответ написан
    Комментировать
  • Откуда stackoverflow при работе с stackalloc c#?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Похоже (явного указания в документации я не нашел), что память в стеке освобождается только при выходе из всего метода, но не из блока внутри него. Освобождение памяти в стеке, как известно - это сдвиг указателя стека обратно, и похоже, этого в конце блока не происходит - только в конце метода. Косвенное подтверждение - в документации по stackalloc явно написано избегать вызовов stackalloc в цикле, как это у вас сделано: "Avoid using stackalloc inside loops. Allocate the memory block outside a loop and reuse it inside the loop." ( https://learn.microsoft.com/en-us/dotnet/csharp/la... )
    Ответ написан
    Комментировать
  • ASP.NET Core 6 Как устранить ошибку при выполнении команды update-database?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    'MultipleActiveResults=True'

    Уберите эти одинарные кавычки.
    Ответ написан
    Комментировать
  • Как реализовать расширяемость модулей с использованием интерфейсов?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Я бы в такой задаче попробовал сделать архитектуру, основываясь на виртуальных базовых классах - т.е. множественном наследовании, при котором многократно наследуемый класс везде, где он возникает, определяется как виртуальный базовый. Как известно, если класс (напрямую или через своих предков) многкратно наследует некий класс как виртуальный, то при содании экземпляра такого класса создается только один экземплярэтого базового класса.
    В частности, с помощью виртуального абстрактного базового класса, содержащего только чистые виртуальные методы, вполне можно сделать аналог интерфейсов, существующих в других языках: Java, C# и пр. - и пользоваться в C++ архитектурными наработками, сделанными с использованием интерфейсов.
    Ответ написан
    Комментировать
  • Почему ADFS бесконечно запрашивает логин и пароль?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Никто не сталкивался с тем что ADFS бесконечно запрашивает логин и пароль?

    Ну, я сталкивался - когда свой самописный модуль 2FA отлаживал. Только вряд ли вам это знание поможет: сомневаюсь, что вы занимаетесь именно этим, так что причина другая.
    А какая именно - это вам нужно в журнал событий смотреть: прежде всего - в журнал Applications and Serices Log/AD FS/Admin: ошибки пишутся туда. Если вы пользуетесб браузером, но ошибка, скорее всего будет иметь код 364 ("Encountered error during federation passive request.") Но это ошибка общего характера, причину ее надо смотреть в дополнительных данных.
    Ну, а ещё может помочь журнал событий Security- на Сервере AD FS и, возможно, на КД: смотрите, нет ли там ошибок в момент неудачной попытки (возможно, потребуется предварительно включить аудит этих ошибок, смотрите групповые политики, как там у вас настроен аудит).
    Ответ написан
    Комментировать
  • Реализовать ajax в asp dot net core 6?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Если вы умеете отправлять и получать запрос с фронта в формате JSON на голом JS через XMLHttpRequest или fetch (либо у вас есть фронтовой фреймворк для этого), то вам повезло: сама Microsoft о вас позаботилась. Как раз в ASP.NET 6 появился Minimal API. Суть его в том, что если раньше базовые делегаты-обработчики конечных точек маршрутизации (подключаемые через Map/MapGet/MapPost etc) должны были иметь тип RequestDelegate (HttpContext context на входе, Task на выходе, а в context.Response изволь писать сам), то теперь делегаты-обработчики могут иметь произвольный тип (ну, почти): принимать произвольное количество произвольных параметров - ASP.NET привяжет их к путям/параметрам в URL и содержимому тела запроса как надо - и возвращать произвольный объект в качестве результата - он будет правильно записан в context.Response: например, если это обычный объект, то он будет послан как JSON. То есть, Minimal API - это новый способ написания контроллеров API, безо всякого MVC.
    Что касается вашего вопроса: если вы передадите с фронта через XHR/fetch объект в JSON с полями и значениями в них, то ASP.NET привяжет параметры метода-обработчика к одноименным полям объекта, а объект, возвернутый из метода-обработчика, закодирует в JSON. И никакого дополнительного фреймворка не надо.
    Подключаются эти обработчики все теми же методами Map/MapGet/MapPost etc: просто в качестве делегата передаете не RequestDelegate а нужный метод-обработчик.
    Но есть нюанс: в документации по ASP.NET 6 все это великолепие еще толком не описано - читайте документацию по ASP.NET 7: она в целом подходит, только не испольуйте группы маршрутизации и фильтры - их в ASP.NET 6 ещё не было.
    PS Кому интересно: как это работает под капотом(конкретно для ASP.NET 7), описано в серии статей Эндрю Лока (знаете такого автора книжек по ASP.NET?).
    Ответ написан
  • Миграция группы серверов windows 2003 на 2019?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    С 2003 на 2019 домен AD напрямую мигрировать не получится: 2019 уже не поддерживает репликацию SYSVOL по протоколу FRS, а только по DFSR, а 2003 SYSVOL по DFSR реплицировать ещё не умеет. Придется вместо 2019 ставить пока 2016 максимум, заменять 2003 на них, а далее - как положено, мигрировать репликацию SYSVOL на DFSR (только аккуратно, по шагам, а не сразу в конечную стадию) , повышать уровень домена и леса до 2016 и заменять 2016 на 2019.
    Ответ написан
    Комментировать