Задать вопрос
  • Как решить проблему с WDS?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Я не понял, что именно вы сделали, но по поводу настроек посмотрите эту статью: https://learn.microsoft.com/en-us/previous-version...
    Ответ написан
  • Почему винда создает неправильную запись в route table?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Неправильный шлюз по умолчанию прилетает вам по DHCP на следующий интерфейс: Ethernet adapter VMware Network Adapter VMnet8. Его создает VMware WorkStation, а используется он в настройках по умолчанию для выхода наружу через NAT виртуалок подсоединенных к соотвествующей сети.
    Т.к. я не знаю, для чего у вас на ПК используется VMWare (и используется ли вообще - у вас там вообще всё интересно: я вижу ещё следы VirtualBox и Hyper-V), то точно сказать, что вам надо сделать, я не могу. Но, как минимум, можно в Virtual Network Editor отключить DHCP на нем - а если у вас в этой виртуальной ести еесть виртуалки - настроить на них адрес IP вручную.
    Ответ написан
    Комментировать
  • Можно ли вручную монтировать и размонтировать диски на Windows?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Если вам нужно всего лишь монтировать вручную/не монтировать автоматически диски - смотрите в сторону команды mountvol.
    Но есть подозрение, что нужно вам, на самом деле, что-то другое.
    Ответ написан
    1 комментарий
  • Как сменить привязку DNS к старому IP?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    IP, как известно, скрываются в зоне DNS (запись типа A). Впрочем, Windows ищет КД по другим записям (SRV). Для начала: этот ваш КД указан на второй машине, как сервер DNS, причем - единственный? Если нет - укажите.
    Если уже указан - проверяйте работспособность поднятого КД - объявляет ли он себя контроллером? dcdiag (в командной строке в режиме администратора) - вам в помощь.

    PS Ещё IP может временно храниться в кэше DNS на клиенте, но если вы уже перезагружали клиент, то там его быть не может.

    PPS
    уже все перерыл
    Вы уверены, что перерыли действительно всё? В файл hosts на клиенте заглянули, например?
    Ответ написан
  • Как в C# на этапе AddCookie[options.Events.OnValidatePrincipal] проверять активность сессии пользователя в стороннем auth-server?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Подскажите, как делают refresh_token взрослые дяди в многопоточке.

    Если нужен ответ на это конкретный вопрос, причем если имеется в виду не просто многопоточка, а асинхронная, с await без блокировки потока - то на это есть такой SemaphoreSlim. Делается примерно так (надеюсь, идея будет понятна)
    //Попадаем сюда после получения существующего access token и выявления, что он просрочен
        SemaphoreSlim sem = GetSemaphore(clientId); 
       await sem.WaitAsync(); //timeot и CancellationToken добавить по вкусу
       try {
         //Получаем существующий access token повторно - вдруг его уже кто-нибудь до нас обновил 
        //   (используем double check pattern)
        //Если это не так,  выполняем тут всю логику обновления access token
      }
      finally {
          sem.Release(); //SemaphoreSlim - не мьютекс, сам не освободится в случае чего
      }


    GetSemaphore реализовать можно по-разному. Можно один на все приложение: static или Singleton - это если нагрузка небольшая.
    А можно кэшировать семафоры по одному для каждого пользователя (т.е. свой семафор для каждого clientID), чтобы пользователи не толклись около одного семафора на всех.
    Главное, чтобы этот семафор создавался с начальным значением 1 - тогда он будет пускать пользователей по одному.

    Ну, а если все делать без асинхронности, в одном потоке, блокируя его при необходимости (т.е. без await), то способов много. Простейший - блок lock вокруг кода обновления маркера доступа (access token), есть такде Monitor, Mutex, тот же Semaphore (хоть со Slim, хоть без)...
    Ответ написан
    1 комментарий
  • Не работает InterVLAN routing c3750g?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Как тут уже говорили в комментариях предполагаемая причина проблемы - настройки брандмауэра Windows по умолчанию: доступ по многим протоколам правила по умолчанию в брандмауэре разрешают только из локальной подсети.

    Для диагностики - добавьте какой-нибудь ПК в VLAN 102 и попробуйте сначала пропинговать 192.168.101.181 с него, а потом, наоборот - этот ПК со 192.168.101.181. Если ping идет только в одну сторону, то дело 100% в брандмауэре. Если дело в бранмауэре, то надо поменять правила. Если есть домен, это легко и просто: добавляете правило в политику для ПК. Если домена нет - придется побегать и поперенастраивать на каждом вручную (можно, вообще-то под это дело скрипт написать и куда-нибудь на файл-сервер выложить).
    Ответ написан
    3 комментария
  • Как уменьшить время на удаление (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 и пр. - работают только в пределах одной (под)сети. Как это сделать с вашим оборудованием - это я так сразу не подскажу: информации недостаточно.
    Ответ написан