Задать вопрос
  • Почему миграция данных происходит, а обновление базы нет из-за нарушения ограничения внешнего ключа?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    CityzenUNDEAD, сообщение об ошибке означает, что у вас таки действительно кривые данные, а именно - есть минимум одна запись в RiskLevels со значением поля OrganizationControlId = 0, для которой в таблице OrganizationControl нет записи с таким же значением первичного ключа (как я понял - поля Id).
    Вывести все такие записи из RiskLevels, которые ссылаются на отутствующие записи в OrganizationControl, можно SQL-запросом
    SELECT * FROM RiskLevels WHERE OrganizationControlId!=ALL(SELECT Id FROM OrganizationControl)

    И пока такие записи есть, наложить ограничение внешнего ключа не поле RiskLevels.OrganizationControlId у вас не получится. Ищите и разбирайтесь, что с этими записями делать.

    PS Entity Framework - он шибко умный, он сам находит связанные друг с другом поля, сам добавляет поля для чего-нибудь типа первичного ключа и т.д. Так что не удивляйтесь, что EF умничает, а если не хотите этого - жестко его контролируйте.
    Ответ написан
    Комментировать
  • Как загнать в dictionary key как null?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Условный оператор в возвращаемом выражении в лямбде в GroupBy формально имеет тип результата int?, и у ситаксического анализатора при выводе типа возвращаемого значения не хватило то ли мозгов догадаться, что результат не может быть null, то ли полномочий изменить тип возвращаемого выражения на int.
    Упростите ему задачу: используйте операцию объединения с null (?? - null-coalescing), тип ее результата гарантированно не-nullable:
    asd.Value?.GroupBy(x => x.ParentId??0 ).ToDictionary(gg => gg.Key, gg => gg.ToList());
    Ответ написан
    Комментировать
  • Как сделать автоответ в Exchange после увольнения сотрудников?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Создавайте п/я с тем же адресом, что был у отключаемого пользователя и настройте на нем автооответ (Set-MailboxAutoReplyConfiguration). Чтобы этот п/я не мешал в адресной книге - скройте его. Переадресацию, если нужно изменение темы, придется делать ЕМНИП транспортным правилом. Поэтому лучше тему не менять - достаточно будет того, что получателем будет отображаться уволенный сотрудник: в таком случае можно просто сделать переадресацию на самом п/я. Но я вообще бы предпочел подключить этот п/я (можно после увольнения: он сразу не удалится, а некоторое время будет обитать в числе отключенных) нужным людям как дополнительный в Outlook (перед этим нужно дать разрешение на него через Add-MailboxPermission ...-AccessRights FullAccess). Скрытый п/я подключается путем указания его legacyExchangeDN в качестве имени.
    Ответ написан
    Комментировать
  • Как правильно снять бекап с контроллера домена?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Вот вам ссылка на рекомендации изготовителя (Microsoft). Там - целый раздел, ссылка ведет на первую статью раздела. Если испытываете трудности с английским, то эти рекомедации переведены (как-то) и на русский язык.
    Резюме:
    1. встроенного средства архивирования Windows для резервного копирования и восстановления AD достаточно, но в плане удобства использования коммерческие решения лучше;
    2. одиночные контроллеры домена, не несущие других функций, восстанавливать нецелесообразно: никакой уникальной информации на них нет, и куда лучше просто добавить в AD новый КД с другим именем;
    3. берегитесь средств снятия и восстанвления образов диска, не поддерживающих AD специально, как средства резервного копирования и восстановления, такие средства безопасно использовать только в системе с ровно одним КД в лесу (по крайней мере - для физических КД, с виртуальными полегче - многие гипервизоры поддерживают идентификатор VM, а AD обучена правильно реагировать на его смену - но можно нарваться); однако при нужде использовать их можно - надо только отдельно копировать и восстанавливать до подключения в сеть Состояние системы.
    Ответ написан
    1 комментарий
  • Как исправить ошибку vector subscript out of range?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Как правильно замтили отвечашие ранее, такие вещи надо искать в отладчике, а при чтении кода можно, разве что, заметить подозрительные места. В частности, я вижу подозрительное место в функции buildFanoTable - вот этот оператор:
    if (abs(diff1 - diff2) < abs(diff1 - diff2 - frequencies[mid + 1].frequency)) {
            mid++;
            diff += frequencies[mid].frequency;
        }

    В предыдущем цикле mid может дойти до end-1, и обращение по индексу mid+1 будет как раз выходом за границу вектора.
    Ответ написан
    Комментировать
  • Как реализовать атомарное обновление 2 файлов?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Движок ESE от Microsoft (его используют системные БД MS Windows и MS Exchange) на для уменьшения объема просматриваемого журнала транзакций ("лога", он там хранится не в одном большом файле а в куче мелких) при рестарте создает и обновляет отдельный файл контрольной точки, в котором сохраняется ссылка на транзакцию, до которой все точно зафиксировано. А при рестарте - запускает применение журнала транзакций с контрольной точки.
    Попробуйте подумать в эту сторону - может, подойдет.
    PS А еще в Windows, в файловой системе NTFS есть встроенная поддержка транзакционного обновления. Но, во-первых - это только в Windows, а во-вторых, я не помню, чтобы в .NET была библиотека для использования этой возможности, так что, не исключено, что доступаться до нее придется через P/Invoke
    Ответ написан
    Комментировать
  • После передачи роли fsmo с контроллера домена AD роли на новом владельце не прижились. Что можно сделать?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Судя по симптомам, наиболее вероятная проблема - изначальная неисправность репликации SYSVOL, препятствующая этому КД объявить себя таковым. Перезапустите на каждом КД службу репликации DFS (она же DFSR) и смотрите наличие в его журнале событий ошибок или предупреждений в течение 15 минут после перезапуска. Дальнейшие действия зависят от того, что там зафиксировано.

    PS Официальные рекомендации от MS по аналогичным проблемам: https://learn.microsoft.com/en-us/troubleshoot/win...
    Ответ написан
    2 комментария
  • Почему после установки rds на сервере не подключиться по rdp?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Если вам нужно подключиться самому для администрирования сервера - попробуйте для подключения запустить mstsc /admin: подключитесь в режиме администрирования, без запроса лицензии, но число таких подключений ограничено (ЕМНИП до сих пор 2-мя).
    Ответ написан
    Комментировать
  • Не могу зайти на Windows Server - почему?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Если у вас установка свежая и ещё не в бою, считаю предпочтительным вариант выше, от Роман Безруков .
    Но есть альтернатива, которую можно попробовать: загрузиться в безопасном режиме восстановления службы каталогов (надеюсь пароль для этого режима у вас есть) и переименовать компьютер обратно, как было. После чего - помолиться своему богу или постучать по дереву и попробовать перезагрузиться.
    PS
    Непрошенный совет
    Раз уж вы взялись работать с AD, не набравшись перед этим знаний, как с не работать - работайте стандартно: выбирайте варианты по умолчанию, не пытайтесь прибумывать что-то свое и менять настройки вслепую. Варианты выборов по умолчанию в AD сейчас разумные, а сама по себе AD - штука очень сложная, накосячить по незнанию в ней можно легко. Впрочем, вы уже убедились в этом сами ;-)
    Ответ написан
    Комментировать
  • Как ограничить количество запросов на сервер при создании поисковика?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Не то, чтобы ответ, но идея ответа. И если чо непонятно - могу в каментах поуточнять.
    Со стороны тыла (на C#) можно ограничить число параллельных запросов в целом к сервису безо всяких там плагинов, а саморучно сделанным велосипедом: семафором (например, SemaphoreSlim, как самым модным в этом сезоне). Либо сделать его статическим, либо (чтобы веру в IoC свято блюсти и модульные тесты делать) - запихнув в Singleton-сервис с теми же свойствами/методами, что и у семафора используются, и получать этот сервис через конструктор (передавать через DI - в бою, напрямую - в тесте).
    Для семафора(сервиса) устанавливаете максимальное число параллельно выполняемых запросов в качестве начального значения. При входе в обработчик захватываете семафор (Wait/WaitAsync, таймаут - по вкусу), при выходе (лучше - в блоке finally того try, который начинается после захвата семафора) - освобождаете (Release).
    Таймаут выставляете в зависимости от поведения фронта: какие у него у самого таймауты на запрос (в том числе - на повторение) и как он реагирует на задержку ответа и на всякие разные коды статуса HTTP в ответе. В целом, стратегии тут две. Первая - пытаться захватывать семафор с коротким таймаутом и в случае неудачи - возвращать другой код статуса, кроме ОК, чтобы сказать фронту, что он не прав. Вторая - тормозить лишние запросы таймаутами. Кароче, без знания вашего фронтового плагина тут точно не скажешь, а я его знать не знаю и знать не хочу.
    Ответ написан
    Комментировать
  • Ваши пароли утекли в сеть, где я допустил ошибку в передаче пароля?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Это вам Google Chrome пишет, что этот пароль утек (где-то, когда-то): Google Chrome стал шибко умным и любит теперь поучать пользователей, что они должны делать, а что - не должны. На эту тему нынче даже статья на Хабре есть.
    Так что пароль, скорее всего, утек не у вас (ибо много кто из разработчиков пользуется сайтами в домене localhost ;-) ), но я бы, к примеру пароль сейчас поменял, чисто на всякий случай.
    Если вам надоела опека Google Chrome, то ее можно(пока?) отключитью Конкретно как включить (а, следовательно отключить) - про это в Интернете ссылок много, например, такая). Только потом, если чо, не жалуйтесь.

    PS Использовать самопальную аутентифкацию/авторизацию крайне не рекомендуется (если вы не Брюс Шнайдер, конечно, или кто-нибудь вроде него). Потому что в этом деле тонкостей много и накосячить можно влегкую. Совет тут простой: посмотреть, как в вашем стеке стандартным образом реализуется аутентифкация с авторизацией (про .NET - см. документацию, а ещё, если непонятно, есть куча учебников)и сделать именно так, стандартно. В частности, передавать каждый раз на сервер логин с паролем плохо из соображений даже не безопасности, а производительности: аутентификация (полноценнная) - довольно дорогая операция. Сейчас для этого стали модны token, раньше обходились cookie. Но выбор, как всегда - за вами.
    Ответ написан
    Комментировать
  • Почему метод Cancel() объекта cancelTokenSource действует и на объект Task, которому в параметры конструктора токен не передаётся (см. внутри)?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    CancellationToken, передаваемый коструктору Task, не имеет никакого отношения к делегату, составляющему тело задачи (у вас им является ваша лямбда-функция). Он служит для отмены самой задачи, пока она ещё не запущена на выполнение. А делегат тела задачи даже не может просто взять и обратиться к этому CancellationToken. И, чтобы делегат мог с ним работать, этот CancellationToken надо передать делегату каким-то другим образом.
    Вы передаете этот CancellationToken через замыкание лямбда-функции (это умное слово означает, что вы просто сослались в ней на эту переменную). Причем, вы его передаете в тело и той, и другой задачи, через одну и ту же переменную token. Именно поэтому при вызове Cancel() для источника этого CancellationToken (cancelTokenSource) обе задачи обнаруживают этот факт и прекращают свое выполнение.
    PS Если интересует, где про это прочитать побольше, то - в книге Дж.Рихтера "Программирование на платформе Microsoft .NET Framework 4.5 на языке Csharp, CLR via Csharp" в гл.27 (в более новом издании, если такое есть, номер главы может измениться).
    Ответ написан
    2 комментария
  • Как отлавливать курсор при наведении на дочернее окно?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Подключите с помощью subclassing свою оконную процедуру к окну кнопки и отслеживайте WM_MOUSEMOVE в ней.

    PS Поскольку subclassing для новой версии comctl32 улучшен, рекомендую также заглянуть сюда
    Ответ написан
    3 комментария
  • Как пропускать через ShadowSocks также FTP, P2P и в целом все протоколы?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Во времена оны были программы-"соксификаторы", которые перехватывали трафик, идущий через socket API (т.е. - практически любой TCP/UDP) и заворачивали на socks-прокси. Я судьбой тех программ давно не интересовался, но беглый поиск дал мне наводку на то, что такой функциональностью из современных обладает некая ProxiFire (статья про нее на Хабре).
    Личные рекомендации дать не могу: используйте на свой страх и риск. Или ищите альтернативы, ключивое слово для поиска - "socksify": именно так называлось в упомянутые времена заворачивание трафика сокетов на SOCKS proxi на уровне системных библиотек или ниже.
    Ответ написан
    Комментировать
  • Полезность моделей памяти которые отличный от linear?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Идея, которая вам пришла в голову, известна давно, ее общепринятое название: "сегментная адресация памяти"
    Про такую схему адресации и ее использование в ОС для защиты памяти я, к примеру, читал в книге по ОС ранних 80-х годов.
    Во времена 16-битных микропроцессоров семейства x86 (8086-80286) и 16-битного ПО для них сегментная адресация памяти примнялась очень широко, сначала - потому что одного 16-битного адреса для адреса не хватало для адресации типичного объема памяти ПК, затем - и для разграничения доступа к памяти ОС и разных задач. Самое, наверное, известное ПО, использовавшее сегментную адресацию - это семейство Windows 3.x.
    С появлением микропроцессоров этого семейства с 32-битной адресацией (80386 и далее), сегментная адресация была почти вытеснена линейной (т.к. разрядности адреса стало хватать для адресации всей памяти). Почти - но не совсем: в частности инфраструтура структурной обработки исключений (SEH) Windows NT использовала, а нынешних версий Windows, как ее потомков, и сейчас использует сегментный регистр FS. В частности, поэтому аппаратная поддержка этого регистра сохранилась в каком-то виде и в архитектуре x86-64, которая в целом от сегментной адресации отказалась.
    Ответ написан
    Комментировать
  • Как должен быть путь для контроллера?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Если вы, как у вас написано, передаете название страны и города через путь в URL, то параметры метода Action для URL второго формата должен привязываться к переменной маршрутизации, примерно так:
    [HttpGet("{country}/{city}")]
    public IActionResult ActionMethod([FromRoute] String country, [FromRoute] String city) 
    {
      //... method code
    }

    [FromRoute] можно и не писать, если параметров запроса (то, что после '?' в URL) нет: привязка по умолчанию выберет следующим источником переменные маршрутизации.
    PS Можно обойтись одним методом действия (Action), если указать что city - параметр необязательный
    [HttpGet("{country}/{city?}")]
    public IActionResult ActionMethod([FromRoute] String country, [FromRoute] String? city) 
    {
     if(city==null) {
      //... method 1 code 
     }
     else {
      //... method 2 code 
     }
    }
    Ответ написан
    Комментировать
  • Как получить логи открытия папок/файлов в WinServer 2019/Win10?

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

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Поток повторно запустить нельзя. После th1.join() (этот вызов дожидается завершения потока) cоздайте новый поток, присвойте его нужной переменой - да хоть той же th1 - и запустите его: будет функциональный аналог Task.ContinueWith(). Или же запустите th2, который у вас уже создан, но не запущен.
    Если вы хотите сделать два вызова Print в одном потоке - сделайте. Если между первым и вторым вызовом надо выполнить какой-нибудь код в основном потоке, то придется использовать объекты синхронизации, в данном случае - события, и ждать на них. Про это курите тему ManualResetEvent/AutoResetEvent, в двух словах в ответе всю эту тему не объяснить
    Ответ написан
    Комментировать
  • Не пингуется домен?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    1. Изменения в зону .ru на серверах RIPN (он за зону .ru отвечает) вносятся с задержкой, так что, возможно, придется подождать (сколько это сейчас - не знаю)
    2. Когда ждать надоест - займитесь диагностикой, с помощью команды nslookup. Полезны два ее варианта
    nslookup имя_DNS имя_DNS_сервера - чтобы получить адрес IP для имя_DNS или ссылку на сервер, который вам его должен вернуть и nslookup type=NS имя_DNS _зоны имя_DNS_сервера - чтобы посмотреть список имен серверов, ответсвенных за зону имя_DNS _зоны (зона DNS - это старшая, т.е. правая, часть имени DNS). Вот и смотрите, что там у вас по дороге от серверов RIPN, отвечающих за зону ru (a.dns.ripn.net - f.dns.ripn.net) до имени вашего сервера делается.
    3. Если не терпится работать с сервером и сайтом прямо немедленно - добавьте соответствие IP и имени DNS сайта в файл hosts на копьютере, откуда будете работать. Только потом, когда с DNS всё устаканится, стоит его оттуда убрать - чтобы через пару лет не гадать, чего это вдруг на этом компьютере сайт по новому IP недоступен.
    Ответ написан
    1 комментарий
  • Где ошибка, как из рекурсии цикл сделать?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    //...declarations and initializations omitted
               do
               {
                   //...some code omitted
                   if (j != i)
                   {
                       swap(i, j);
                       i = j; 
                   }
               } while (j != i);

    Не работает, потому что вы сначала присваете j значение i, если они не равны, а потом, в условии продолжения цикла, сравниваете их значения. Естественно, они будут равны и выход их цикла получится на первой же итерации. Проверять i==j как условие выхода из цикла надо чуть раньше, например, так:
    //...declarations and initializations omitted
               do
               {
                   //...some code omitted
                   if (j != i)
                   {
                       swap(i, j);
                       i = j; 
                   }
                   else break;
               } while (true);


    Ну, а что до второго вопроса, то в .NET, начиная с 6.0 есть класс System.Collections.Generic.PriorityQueue<TElement,...
    Ответ написан
    6 комментариев