Задать вопрос
  • Как уменьшить время на удаление (30 дней) после перемещения ящика Exchange в другую базу?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Вам точно нужно уменьшить именно whitespace (т.е. выпонить дефрагментацию БД), а не удалить из базы п/я, которые в ней остались в состоянии SoftDeleted (их можно увидеть командой Get-MailboxStatistics в EMS для БД, где они были)? Если нужно на самом деле удалить оставшиеся п/я (которые там по умолчанию болтаются упомянутые 30 дней), испольуйте команду Remove-StoreMailbox.

    PS Дефрагментация же БД (онлайновая) идет сама по себе своим чередом и обычно кушать не просит. Ну а автономная (offline) дефрагментация, с помощью eseutil - это вообще средство на крайний случай.
    Ответ написан
    4 комментария
  • Какой гипервизор (на базе основной ОС, а не автономный) из популярных (VirtualBox, VMWare и др) больше подходит для бэкенд разработки и тестирования?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Под такие требования подойдет любой. Кстати, чем вам встроененный в Windows Hyper-V не нравится? Или в испольуемой вами редакции его нет?
    Ответ написан
    1 комментарий
  • Как реализовать TcpLister, который будет ожидать запроса?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Зависит от того, чего вы хотите.
    Если вас устраивает, что задача, выполняющая HandleClientAsync для подключившегося клиента будет брошена на произвол судьбы, можно использовать оба варианта (но первый мне нравится больше). Если вы хотите узнать, чем она закончилась - надо делать по-друому.
    PS См. также комментарии к вопросу.
    Ответ написан
    Комментировать
  • Можно ли удалить вложения из писем?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Иной способ существует: написать скрипт, проходящий по всем письмам в п/я и удалить из них вложения. Комндлета для EMS для этого нет (AFAIK), но в PowerShell для этого можно использовать EWS Managed API.

    Только вот написать скрипт, да ещё чтобы он работал без ошибок и ничего не попортил в процессе отладки - это не так просто. Да и разрешения нужно ему дать (стандартных разрешений админинистратора не хватит). Так что лучше IMHO этим не заморачиваться, а для повышения радивости пользователей поставить им квоты на п/я: пусть чистят сами.
    Ответ написан
    1 комментарий
  • Консоль выдаёт ошибку в коде хотя там её явно не видно, как можно решить?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Смотреть, если не умеючи и без привычки, можно долго и бестолку.
    А чтобы посмотреть быстро и толково, разрабочики IDE дали нам отладчик.
    Судя по сообщению об ошибке, у вас список GeneratedRooms пустой (потому что ничего нет даже в начальной позиции - 0). Так что начать можно с того, что поставить в строке 143 точку останова и убедиться в этом.
    А можно сразу начать разбираться, почему он пустой: поставить точку останова (breakpoint) там, где этот список пополняется - у вас такое место одно, строка 106, где в этот список добавляется результат некой функции - и пройти в отладчике по шагам работу этой функции: начать с проверки ее параметров, затем смотреть, что управление пошо туда, куда вам надо и переменные имеют ожидаемое значение. Можно даже сразу поставить точку останова в начале функции, если она у вас ниоткуда больше не вызывается.
    Ответ написан
    3 комментария
  • Проблема с жёстким диском?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Раз у вас HDD, то очень вероятна проблема с фрагментацией файлов: куски файла разбросаны по диску и для чтения каждого надо гонять туда-сюда головки, что есть операция небыстрая. Проверить фрагментацию призвести дефрагментацию можно, например, в свойствах диска на вкладе Tools в окне по кнопке Optimize - если у вас там средство дефрагментации автор сборки не вырезал ;-). А ещё в современной Windows обычно бывает настроена переодическая дефрагментация, но ее автор сборки тоже мог вырезать. Так что, возможно, вы на диск зря грешите.
    С диском и его контроллером проблемы, конечно, тоже могут быть, но они обычно отображаются в SMART. Так что возьмите программу для просмотра SMART (лично я люблю Crystal Disk Info, но вообще - на ваш выбор) и посмотрите, не происходит ли там чего плохого. С дефрагментацией это никак не связано, так что можете проделать это независимо.
    PS Посмотреть, какие именно процессы активно работают у вас диском, можно в диспетчере задач, на вкладке Details - если у вас сборка не на базе Windows Server, конечно, из него (конкретно могу утверждать за Windows Server 2016) эту функциональность зачем-то вырезали (точнее, я знаю, зачем, но вам эти знания вряд ли потребуются). Настраиваете на этой вкладке колонки по вкусу - и смотрите, можно сортировать процессы.
    Ответ написан
    Комментировать
  • Как корректно завершить webapplication, чтобы вызвался и исполнился до конца IHostLifetime.ApplicationStopping.Register(mymethod)?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Для ответа на вопрос несколько не хватает информации - как у вас организована реакция на отмену IHostApplicationLifetime.ApplicationStoping (что и как делает регистрируемый callback при отмене), какие сервисы вы используете и как они реагируют на отмену того же маркера.
    И IMHO информацию лучше собирать методом проб и ошибок. Самое первое, что вы можете попробовать - это такой вариант. Во-первых, нужно зарегистрировать свой callback последним. А для этого нужно вызвать конструкторы всех сервисов в надежде, чо если они и регистрируют callback на этот маркер, то делают это у себя в конструкторах и только потом регистрировать свой callback (если вы эти сервисы получаете путем внедрения зависимостей через конструктор, это получится автоматически). Во-вторых, нужно выполнить всю работу в своем callback синхронно, в частности, если сообщения отправляются сервисами асинхронно, то подождать завершение каждого (Tasl.WaitAll вам в помощь), а не ждать каждый через await (или явно - используя ContinueWith - но сейчас так никто не делает).
    Идея рассчитана на то, что реализация IHostApplicationLifeTime отменяет (ЕМНИПпроверено в исходниках) этот маркер простым Cancel и ждет завершения отмены (и в документации об этом ожидании смутно упомянуто, т.е., это не хак, зависящий от реализации) , а Cancel вызывает все зарегистрированные callback синхронно, в порядке, обратном регистрации (это ЕМНИП тоже документированнное поведение).
    Попробуйте для начала так, прежде чем применять более крутые меры (например, подменять реализации IHostLifeTime и IHostApplicationLifetime(UPD: погорячился, эту реализацию подменять нельзя, там обязан быть класс ApplicationLifetime) - технически это реально, но лучше такое оставить на потом).
    Если не прокатит, я ответ постараюсь продолжить.

    PS По поводу способов закрытия приложения. AFAIK остановка через "красный квадратик" в VS и закрытие окна консоли вызывает просто уничтожение процесса, и это не перехватывается (могу ошибаться, конечно). А вот закрытие по Ctrl+C отлично перехватывается ConsoleLifeTime (обычно испольуемая для консольных приложений реализация IHostLifetime), так что именно этот способ закрытия можно считать штатным. А вообще по жизни, 100% срабатывающих способов реакции на прекращение работы приложения нет - ибо прекращение может быть вызвано такой причной, как пропадание питания (особенно - если вследствие перерубания кабелей топором ;-) ).
    Ответ написан
    1 комментарий
  • Почему в истории начал появляться коммит слияния?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Это - не баг, это - результат ваших (непродуманных?) действий.
    Revert (в отличие от reset) создаает commit. Поэтому у вас в main появилась цепочка commit после точки разделения (можете посмотреть любым средством просмотра веток - да хоть git log: git log с ключом --graph после слияния покажет это достаточно наглядно. Слить такие ветки быстрой перемоткой (fast-forward), как вам удавалось делать раньше, не получится, поэтому gitу приходится создавать merge commit с двумя родителями - исходными указателями сливаемых веток.
    Основных способов выйти их такого положения - два.
    Первый - сбросить указатель ветки main на точку разделения: переключиться на нее и выполнить git reset. Если вы действительно делали только отмену (revert) и отмену отмены, то вы ничего не должны потерять. Если опасаетесь потерять - создайте перед сбросом еще одну ветку на базе текущего main, потом вытащите в случае чего изменения из нее (а вообще-то в git зафиксированные изменения так сразу не теряются, и можно обычно вытащить их даже при отсутсвии ветки).
    Второй способ - перебазировать (git rebase) ветку update на текущий указатель ветки main. Правда, в этом варианте у вас останутся в истории обе ваши отмены.
    После этого вы сможете выполнить так нравящееся вам слияние быстрой перемоткой.
    PS Есть ещё и третий вариант решения - забрать изменения из update в main с помощью cherry-pick, но в данном случае это - лишние заморочки IMHO.
    Ответ написан
  • Как сделать общий appsettings.json для разных .sol?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Можно добавить произвольные файлы JSON в конфигурацию на этапе конфигурирования приложения. Используйте для этого метод расширения AddJsonFile интерфейса IConfigurationBuilder.
    В приложениях на современном (.NET 6+) шаблоне WebApplication этот интерфейс доступен через свойство WebApplicationBuilder.Configuration, примерно так:
    var builder = WebApplication.CreateBuilder(args);
    //...
    builder.Configuration.AddJsonFile("path_and_file.json");
    Ответ написан
    1 комментарий
  • Настройка 2FA ADFS в NEXTCLOUD?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    А настроили ли вы на стороне ADFS передачу утверждения (claim) о членстве в группе , по которой вы фильтруете пользователей?
    Пример настройки утверждения членства в группе есть в документации AD FS.

    PS Имя группы на скриншоте ищите сами: я его вижу, но мне его руками набивать лень, а скопировать-вставить со скриншота нельзя. Надеюсь это вас убедит в следующий раз вставлять информацию по вопросу текстом.
    Ответ написан
    2 комментария
  • Как предотвратить закрытие окна Powershell в случае ошибки, если powershell запущен из cmd?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    cmd /k powershell ...
    Ответ написан
    Комментировать
  • Можно ли изменить автора встреч в календаре (Exchange)?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Программный доступ к календарю (и другому содержимому п/я) возможен через Excange Web Services (EWS). В частности - из PowerShell можно туда добраться через EWS Managed API - он, вообще=то предназначен для работы из C# и прочих языков для .NET, но в PowerShell, посколько он тоже на базе .NET, тоже можно его использовать. Я не подскажу, можно ли там поменять свойство автора встречи, или оно только для чтения, но, в любом случае, можно создать встречи с новым автором и скопировать в них информацию из существующих встреч уволившегося сотрудника.
    Но все это требует самого натурального программирования, т.е. это непросто, и, возможно, встречи будет проще создать заново.
    Ответ написан
    Комментировать
  • Работает ли авторизация Kerberos на Linux?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Для аутентифкации по протоколу Kerberos на сервере клиент должен предъявить билет, кторый может выдать только третья сторона (KDC), которой доверяют и клиент и сервер. А откуда он у внешнего клиента-то возьмется, если он про ваш внутренний KDC (например, контроллер домена AD) ничего не знает?
    В Windows Kerberos для аутентификации на сайте Kerberos используется в комплекте с NTLM в рамках механизма аутентификации Negotiate. Клиент, увидев, что сервер предланает ему этот механизм, запрашивает у своего KDC билет для этого сервера, а если билет получить невозможно - переходит на аутентифкацию по NTLM, и для этого как раз и запрашивается имя пользователя и пароль в пресловутом окошке. А при использовании только Kerberos пароль запрашивать не нужно.
    PS Постарайтесь не путать аутентификацию (проверку подлинности пользователя) и авторизацию (проверку разрешения на операцию).
    Ответ написан
    Комментировать
  • Как настроить SMB с двумя роутерами?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Требуется дополнительная информация. Знать, что и куда подключено по кабелю - этого недостаточно. Требуется понимние на "уровне IP" (он же - "3-й уровень модели OSI") : нужно знать таблицы машрутизации на обоих маршрутизаторах и на типичных компьютерах в каждой из (под)сетей и, главное, включен ли на промежуточном маршрутизаторе (Redmi) NAT между интерфейсами в сети 192.168.1.0/24 и 192.168.2.0/24.
    Текущая картина похожа на то, что NAT включен. Если так, то вы из сети 192.168.1.0/24 к серверу в 192.168.2.0/24 не подключитесь - разве что, сервер у вас один, и вы прокинете на него 445 порт с Redmi, и работать это может только, если на Redmi нет Samba или другого сервера SMB, слушающего на этом порту.
    Чтобы после отключения NAT в сети 192.168.2.0/24 интернет не пропал, надо на Keenetic прописать маршрут к этой сети через интерфейс Redmi в сети 192.168.1.0/24. В принципе, этого должно хватить и для подключения к серверу по IP. Если не хватает - прверьте брандмауэр Windows на сервере, и разрешите подключение по SMB из сети 192.168.1.0/24 (по умолчанию ЕМНИП там разрешено подключение только из непосредственно подсоединенной (под)сети).
    Для подключения по имени сервера нужно настроить разрешение имен между этими сетями: по умолчанию все простейшие протоколы разрешения имен - NetBIOS и пр. - работают только в пределах одной (под)сети. Как это сделать с вашим оборудованием - это я так сразу не подскажу: информации недостаточно.
    Ответ написан
  • Какими настройками разрешений запретить открытие файла?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    1. Назначить для User1 стандартное разрешение "Список содержимого папки"
    2. Убедиться, что нет менее ограничивающих разрешений для каждой из групп (и псевдо-групп, типа "Прошедшие проверку"), куда входит User1.

    PS По жизни разрешения лучше назначать не отдельным пользователям, а группам. Т.е., в данном случае - создать группу, куда входит только User1 и дать разрешения этой группе. Так будет проще что-нибудь поменять, когда потребуется: заменить User1 на другого пользователя и т.п. А по жизни поменять что-нибудь потребуется обязательно.
    Ответ написан
    3 комментария
  • Есть ли такая архитектура?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Есть несколько соображений.
    Сображение первое, глубоко теоретическое. Логическая структура конкретного приложения - это вопрос специфичный именно для приложения. Думать о ней в терминах соответствия некой теоретической "архитектуре" (тем более - "чистой архитектуре") - это самоограничение, достойное только зеленых новичков. Настоящие программисты не используют чистую архитектуру. Кароче, как вы приложение напишете, такая у него архитектура и будет. Возможно, если ваше приложение будет в чем-то замечательным, то эта архитектура войдет в учебники по этой самой архитектуре, в качестве примера (может - положительного, но, скорее, отрицательного ;-) ). Но пока что вам нужно решать практические вопросы, и шаблоны т.н. "архитектуры" могут служить только в качестве подсказки, а решать придется вам, из чисто практических соображений.

    Соображение второе, практическое. Раз, как вы пишете "Domain содержит только сущности, Enum'ы", то выбросьте из головы слово Domain, оно вас только запутывает. Потому что намекает на DDD, а то, что у вас есть, в DDD обзывают "анемичной моделью", и сильно не любят. Т.е. сейчас, с нынешней структурой приложения, DDD - оно не про вас.

    Так что, по факту, у вас есть два слоя абстракций, описывающих функции классов и методов: UI и Application. И я подозреваю, что логика приложения - классы и методы, отнесенные к Application - использует в качестве средства доступа к БД EF напрямую. То есть - что там прямо в коде используются сущности под названием DbContext и DbSet.

    А это означает, если по жизни, что от EF вы в таком раскладе никуда впоследствии не денетесь. Хорошо это или плохо - решать вам. Однако о намерении прибить гвоздями свое приложение к EF вы не упоминали и, предполагаю, не думали. Если это так, то задумайтесь именно об этом. Не о замене БД - EF может работать поверх разных БД, так что к MS SQL вы, по факту, с EF привязаны не будете (ну, разве что, сами того очень захотите).

    А задуматься надо: EF - штука неоднозначная. Она, подобно любому средству ORM, полна абстракций, которые, так скажем, не совсем хорошо ложатся на логическую структуру реляционных БД, а потому в них есть заметные дыры, через которые эта структура будет проглядывать. В частности, это нередко касается вопросов производительности.

    Но если вы выберети жизнь EF и ни с чем другим, то о Repository и UoW можете больше не думать: EF будет для вас и тем, и другим.

    Кароче, выбирайте.
    Ответ написан
    7 комментариев
  • В чем причина ошибки Ms exchange 2013?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Эта ошибка означает, что возникло исключение при обработке некого сообщения. Не исключено (но и не факт), что это произошло из-за вмешательства этой самой DLP системы.
    Сообщение вызывающее исключении при обработке, помещается в очередь Poison message queue. Смотрите там - если сообщение есть, конечно: например, ваша DLP могла его удалить внезапно для службы транспорта Exchange, тип исключения вполне такому сценарию соответствует. Если подозреваете DLP - сопоставьте ваш лог Exchange с логом DLP на момент возникновения исключения, чтобы понять, что делала в этот момент DLP.
    Ответ написан
    3 комментария
  • Как написать свой кастомный EditorFor и получить значение свойства модели?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    У вас в поле _helper класса FormHelper<TModel> конструктор сохраняет ссылку на интерфейс IHtmlHelper<TModel>.
    Этот интерфейс содержит свойство ViewData типа ViewDataDictionary<TModel>. А в этом типе реализовано свойство Model (типа TModel), которое даст вам ссылку на экземпляр класса (типа TModel) модели для представления/страницы.
    Ну, а дальше, раз вы знаете имя нужного вам свойства объекта и имеете ссылку на экземпляр этого объекта, то можете получить значение этого свойства: либо через составление с последующей компиляцией и вычисление выражения, возвращающего его значение, либо через отражение.
    Как-то так.
    Ответ написан
    1 комментарий
  • Как переименовать папку `archive` в `Archive`?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    А в чем сложность? В командной строке, в той папке где эта пака archive находится, выполните команду:ren archive Archive - и папка будет переименована.
    Ответ написан
    Комментировать
  • Как удалить сессию из БД после истечения срока?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    В ASP.NET Core есть стандартный механизм сеансов (ISession): https://learn.microsoft.com/aspnet/core/fundamenta...
    Работает он на базе распределенного кэша (IDistributedCache), который штатными средствами можно базировать на MS SQL и на Redis (и, возможно, есть дополнительные сторонние пакеты для базирования на других СУБД,). Идентифкатор сессии хранится в куки (настраеваемой), по умолчанию - HTTP-only (но это настраивается).
    Механизм устаревания сеансов там есть, параметры тоже можно настроить.
    Кароче, если нет причин обязательно делать свой велосипед (типа, для учебной задачи) можно использовать этот стандартный механизм.
    Правда идея использовать этот механизм именно для авторизации у меня вызывает некоторые неясные опасения: он, вообще-то, не для того сделан. А именно для авторизации (плюс аутентифкация) в ASP.NET Core тоже есть штатное решение (Identity и политики авторизации). И вообще, аутентифкация/авторизация - это такое место, где легко накосячить, а потому лучше там обходиться без своих велосипедов.
    Ответ написан
    3 комментария