Move что это такое

Погружение в Move — язык программирования блокчейна Libra от

move что это такое

Далее мы рассмотрим в деталях основные характеристики языка Move и в чем его ключевые различия с другим, уже популярным языком для смарт-контрактов — Solidity (на платформе Ethereum). Материал основан на изучении доступного он-лайн 26-страничного whitepaper-а.

Введение

Move — это исполняемый язык байт-кода, который используется для выполнения пользовательских транзакций и смарт-контрактов.

Обратите внимание на два момента:

  1. В то время как Move является языком байт-кода, который может напрямую выполняться на виртуальной машине Move, Solidity (язык смарт-контрактов в Ethereum) — язык более высокого уровня, который сначала компилируется в байт-код перед выполнением в EVM (Ethereum Virtual Machine).
  2. Move можно использовать не только для реализации смарт-контрактов, но и для пользовательских транзакций (подробнее об этом будет дальше), в то время как Solidity — это язык только для смарт-контрактов.

Перевод выполнен командой проекта INDEX Protocol. Ранее мы уже переводили большой материал, описывающий проект Libra, теперь настала очередь чуть более подробно взглянуть на язык Move.

Перевод выполнен совместно с хабраюзером coolsiu Ключевой особенностью Move является возможность определять пользовательские типы ресурсов с семантикой, основанной на линейной логике: ресурс никогда не может быть скопирован или неявно удален, только перемещен. Функционально, это схоже с возможностями языка Rust. Значения в Rust могут быть назначены только одному имени за раз.

Присвоение значения другому имени делает его недоступным под предыдущим именем.

Для примера, следующий фрагмент кода выведет ошибку: Use of moved value ‘x’. Это потому, что в Rust нет сборки мусора. Когда переменные выходят из области видимости, память, на которую они ссылаются, также освобождается. Проще говоря, может быть только один «владелец» данных. В этом примере x является первоначальным владельцем, а затем y становится новым владельцем. Подробнее о таком поведении здесь.

Представление цифровых активов в открытых системах

Существует два свойства физических активов, которые трудно представить в цифровом виде:

  • Редкость (Дефицитность, в оригинале — scarcity). Количество активов (эмиссия) в системе должна быть контролируемой. Необходимо запретить дублирование существующих активов, а создание новых — это привилегированная операция.
  • Контроль доступа. Участник системы должен иметь возможность защитить активы с помощью политик контроля доступа.

Эти две характеристики, которые естественны для физических активов, нужно реализовать и для цифровых объектов, если мы хотим считать их активами. Например, редкий металл — имеет естественный дефицит, и только у вас есть к нему доступ (держа в руках, например) и вы можете его продать или потратить.

Чтобы проиллюстрировать, как мы пришли к двум этим свойствам, давайте начнем со следующих предложений:

Предложение № 1: простейшее правило без дефицита и контроля доступа

  • G[K]:=n обозначает обновление числа, доступного по ключу К в глобальном состоянии блокчейна, новым значением n.
  • transaction ⟨Alice, 100⟩ означает установку баланса счета Алисы на 100.

Приведенное выше решение имеет несколько серьезных проблем:

  • Алиса может получить неограниченное количество монет, просто отправляя transaction ⟨Alice, 100⟩.
  • Монеты, которые Алиса посылает Бобу, бесполезны, так как Боб мог отправлять себе неограниченное количество монет, используя ту же технику.

Предложение № 2: Учитываем дефицит

Теперь мы отслеживаем ситуацию, чтобы количество монет Ka было как минимум, равно n перед транзакцией перевода. Тем не менее, хотя это решает проблему дефицита, нет никакой информации о том, кто может отправлять монеты Алисы (пока что это может сделать каждый, главное не нарушать правило ограничения количества).

Предложение № 3: Объединяем дефицит и контроль доступа

Мы решаем эту проблему с помощью механизма цифровой подписи verify_sig перед проверкой баланса, что означает, что Алиса использует свой закрытый ключ для подписания транзакции и подтверждения того, что она является владельцем своих монеты.

Языки программирования блокчейна

Существующие языки блокчейна сталкиваются со следующими проблемами (все они были решены в Move (прим.: к сожалению, автор статьи аппелирует только к Ethereum в своих сравнениях, поэтому стоит воспринимать их лишь в таком контексте. Например, большинство из нижесказанного также решено и в EOS)):

Непрямое представление активов.

Актив кодируется с использованием целого числа, но целочисленное значение — это не то же самое, что актив. На самом деле, нет типа или значения, представляющего биткойн / эфир / ! Это делает трудным и подверженным ошибкам написание программ, использующих активы.

Паттерны, такие как передача активов в/из процедур или хранение активов в структурах требуют специальной поддержки от языка.

Дефицит нерасширяем. Язык представляет только один дефицитный актив. Кроме того, средства защиты от дефицита жестко зашита непосредственно в самой семантике языка. Разработчик, если он хочет создать пользовательский актив, должен сам тщательно контролировать все аспекты ресурса. Это как раз проблемы смарт-контрактов Ethereum.

Пользователи выпускают свои активы, токены стандарта ERC-20, используя целые числа для определения как стоимости, так и общей эмиссии. Всякий раз, когда создаются новые токены, код смарт-контракта должен самостоятельно проверять соблюдения правил эмиссии. Кроме того, непрямое представление активов приводит, в ряде случаев, к серьезным ошибкам — дублированию, двойным тратам или даже полной потере активов.

ЭТО ИНТЕРЕСНО:  My как произносится на английском

Отсутствие гибкого контроля доступа. Единственная политика контроля доступа, применяемая сейчас — это схема подписи с использованием асимметричной криптографии. Как и защита от дефицита, политика контроля доступа глубоко заложена в семантике языка. Но как расширить язык, чтобы позволить программистам определять собственные политики контроля доступа — это, зачастую, очень нетривиальная задача.

Это также верно для Ethereum, где смарт-контракты не имеют родной поддержки криптографии для контроля доступа. Разработчики должны вручную прописать контроль доступа, например, используя модификатор onlyOwner. Несмотря на то, что я большой поклонник Ethereum, я считаю, что свойства активов должны изначально нативно поддерживаться языком в целях безопасности. В частности, передача Ether в смарт-контракт включает динамическую диспетчеризацию, которая привела к появлению нового класса ошибок, известных как повторный входа (re-entrancy vulnerabilities). Динамическая диспетчеризация здесь означает, что логика выполнения кода будет определяться во время выполнения (динамическая), а не во время компиляции (статическая).

Таким образом, в Solidity, когда контракт A вызывает функцию контракта B, контракт B может запускать код, который не был предусмотрен разработчиком контракта A, что может привести к уязвимостям повторного входа (контракт A случайно выполняет функцию контракта B, чтобы снять деньги до фактического вычета остатков из учетной записи).

Ресурсы первого порядка

Если говорить высокоуровнево, то взаимодействие между модулями/ресурсами/процедурами в языке Move очень напоминают отношения между классами/обьектами и методами в ООП-языках.

Модули в Move аналогичны смарт-контрактам в других блокчейнах. Модуль объявляет типы ресурсов и процедуры, которые задают правила для создания, уничтожения и обновления объявленных ресурсов. Но все это — лишь условности (“жаргон”) в Move. Чуть позже мы проиллюстрируем этот момент.

Гибкость

Move добавляет гибкости Libra через скрипты. Каждая транзакция в Libra включает в себя скрипт, который фактически является основной процедурой транзакции. Скрипт может выполнять или одно заданное действие, например, платежи по указанному списку получателей, или переиспользовать другие ресурсы — например, вызывая процедуру, в которой задана общая логика. Вот почему скрипты транзакций Move предлагают большую гибкость.

Скрипт может использовать как одноразовые, так и повторяющиеся варианты поведения, в то время как Ethereum может выполнять только повторяющиеся сценарии (вызывая один метод метод смарт-контракта). Причина, по которой он назван «многократным», заключается в том, что функции смарт-контракта могут выполняться несколько раз. (прим.: здесь момент очень тонкий. С одной стороны, скрипты транзакций в виде псевдо-байткода, есть и в Bitcoin.

С другой, как я понял — Move расширяет этот язык, по сути, до уровня полноценного языка смарт-контрактов).

Безопасность

Исполняемый формат Move — это байт-код, который, с одной стороны, язык более высокого уровня, чем ассемблер, но низкоуровневее, чем исходный код. Байт-код проверяется в ран-тайме (on-chain) на наличие ресурсов, типы и безопасности памяти с помощью верификатора байт-кода, а затем выполняется интерпретатором.

Такой подход позволяет Move предоставлять безопасность, характерную для исходного кода, но без процесса компиляции и необходимости добавлять компилятор в систему. Сделать Move языком байт-кода — это действительно хорошее решение.

Его нет нужды компилировать из исходников, как в случае с Solidity, не нужно беспокоиться о возможных сбоях или атаках на инфраструктуру компилятора.

Верифицируемость

Мы нацелены на выполнение как можно более легких проверок, так как все это идет on-chain (прим.

: он-лайн, в процессе выполнения каждой транзакции, поэтому любая задержка приводит к замедлению всей сети), однако изначально дизайн языка готов к использованию и off-chain средств статической верификации.

Хотя это и более предпочтительно, но пока разработка средств верификации (как отдельного тулкита) отложена на будущее, и сейчас поддерживается только динамическая верификация в ран-тайме (on-chain).

Модульность

Модули Move обеспечивают абстракцию данных и локализуют критические операции над ресурсами. Инкапсуляция, обеспечиваемая модулем, в сочетании с защитой, обеспечиваемой системой типов Move, гарантирует, что свойства, установленные для типов модуля, не могут быть нарушены кодом вне модуля. Это достаточно продуманный дизайн абстракции, означающий, что данные внутри контракта могут изменяться только в рамках выполнение контракта, но не извне.

Обзор Move

Пример скрипта транзакции демонстрирует, что злонамеренные или неосторожные действия программиста вне модуля не могут нарушить безопасность ресурсов модуля. Далее мы рассмотрим примеры того, как модули, ресурсы и процедуры используются для программирования блокчейна Libra.

Peer-to-Peer платежи

Заданное в amount количество монет будет переведено с баланса отправителя к получателю. Здесь есть несколько новых моментов (выделено красными надписями):

  • 0x0: адрес учетной записи, где хранится модуль
  • Currency: название модуля
  • Coin: тип ресурса
  • Значение coin, возвращаемое процедурой, является значением ресурса, тип которого 0x0.Currency.Coin
  • move(): значение не может быть использовано снова
  • copy(): значение может быть использовано позже

Разбираем код: на первом шаге отправитель вызывает процедуру с именем withdraw_from_sender из модуля, хранящегося в 0x0.Currency.

На втором этапе отправитель переводит средства получателю, перемещая значение ресурса монеты в процедуру депозита модуля 0x0.Currency. Вот три примера ошибок в коде, которые будут отклонены проверками:

Дублирование средств путем изменения вызова move(coin) на copy(coin). Ресурсы могут быть только перемещены.

Попытка дублировать количество ресурса (например, вызывая copy(coin) в приведенном выше примере) приведет к ошибке во время проверки байт-кода.

ЭТО ИНТЕРЕСНО:  Как по английски овца

Переиспользование средств, указав move(coin) дважды

Источник: https://habr.com/ru/post/459990/

Волшебная палочка от Sony. Как работает PlayStation Move

move что это такое

игрысерьезно изменились за последние 30 лет.В то же время способ взаимодействия сиграми изменился не так уж сильно.Появившийся в 1980 гг. на Nintendo EntertainmentSystem контроллер популяризировал средствоуправления игрой с помощью кнопок.Постепенно такой вид контроллеровэволюционировал — появлялось большекнопок, были изобретены стики дляуправления в трехмерном пространстве.Но радикально новых методов управленияизобретено не было.

Лишьв 2006 году схема управления на приставкахбыла изменена — появилась Nintendo Wii.Революционный виимоут использовалсядля управления играми с помощью движенийрук перед телевизором. Сам геймпадвыглядел как пульт от телевизора и былочень удобен и эргономичен. Nintendo Wiiпродалась большим тиражом, что заставилоSony и Microsoft задуматься над своими аналогамиреволюционной схемы управления.  

Всентябре 2010 года «Сони» запустиласобственный контроллер на системеотслеживания движений — PlayStation Move. Каки средство управления Wii, «Мув» выглядитточно как пульт для телевизора. Такимобразом компания надеялась забратьчасть рынка у Nintendo. Но что представляетсобой PlayStation Move и как он работает?Технология устройства отличается отаналога у «Нинтендо». В этой статье мырасскажем, как работает PlayStation Move.

PlayStationMove снаружи

БрендPlayStation пользуется огромной популярностьюу геймеров, потому Sony решила не рисковатьс дизайном контроллера Move. Как и геймпадPlayStation 3, палочка «Мув» выполнена изчерного матового пластика, а на ееповерхности находятся четыре маленькихкнопки со знакомыми символами: крестик,кружок, треугольник, квадрат. Маленькиекнопки окружают большую с логотипомсамого Move.

Поформе контроллер напоминает тонкиепесочные часы. Это позволяет удобнодержать геймпад в руках при игре: большойпалец точно ложится в ложбинку в центре«Мува». Поскольку геймпад работает надвижении, то большой нужды в кнопкахнет. Одной или нескольких рядом с пальцамивполне достаточно.  

Большаякнопка в центре контроллера имеет стылу логотип PlayStation. По нажатию вы можетесинхронизировать контроллер с консольюи выйти в главное меню PlayStation 3. Необходимыекнопки START и SELECT для паузы и меню опцийрасполагаются по бокам сверху. Наконец,с задней стороны девайса находитсяспециальная кнопка-курок T. Она хорошолежит под указательным пальцем ииспользуется в шутерах от первого лица.

Носамое главное, что привлекает вниманиев PlayStation Move — это светящаяся сфера вверхней части. Что же это такое? Давайтеразберемся.

Светящийсяшарик и PlayStation Eye

Добавлениек контроллеру светящейся сферы сверхуопределенно добавляет экзотичностивнешнему виду устройства, однако белыйшар — не только для привлечения внимания.Это существенная часть необычногоконтроллера. В тандеме с камеройPlayStation Eye (идет в составе набора Move) шарпозволяет отслеживать трехмерноеположение в пространстве в реальномвремени.

Источник: https://piterplay.com/statyi/volshebnaya-palochka-ot-sony-kak-rabotaet-playstation-move

Команда Move (Переместить)

move что это такое
Open topic as PDF Version 1.2

Здесь описываются синтаксис и правила использования команды Move (Переместить).

Чтобы ввести команду Move (Переместить) нажмите клавишу Move на консоли.

Описание

С помощью команды Move (Переместить) вы можете перемещать объекты, например:

Синтаксис

1. Перемещение группы на другую позицию.

2. Перемещение пресета на другую позицию.

3. Перемещение экзекьютора на другую позицию на той же странице.

4. Перемещение экзекьютора на другую позицию на другой странице.

5. Перемещение главного экзекьютора на экзекьютор 6 на странице 1.

Move Executor 0.1.1 at 1.6

Пример 1

Предположим, вы перемещаете группу 50 в группу 1.

Есть два способа это сделать:

a) Нажмите Move Group 50 At 1 Please.

б) Нажмите Move, нажмите на  Группа 50 в окне Группы, и затем нажмите Ячейку 1.

Группа 50 перемещена и стала группой 1.

Пример 2

Предположим, вы перемещаете пресет цвета 2 в пресет цвета 5.

Совет:
Если вы перемещаете пресет, который используется Кью, то привязка пресета к Кью будет автоматически перенаправлена в новое расположение пресета.

1. Откройте окно Color Пресеты.

Далее есть два способа это сделать:

a) Нажмите Move Preset 2 At 5 Please.

б) Нажмите Move, нажмите Пресет 2 в окне Color Пресеты и затем нажмите Ячейку 5.

Пресет цвета 2 перемещён и стал пресетом цвета 5.

Пример 3

Предположим, вы перемещаете экзекьютор с позиции 1 на позицию 6.

Есть три способа это сделать:

a) Нажмите Move Exec 1 At 6 Please.

б) Нажмите  Move, нажмите экзекьютор 1 в окне Экзекьюторы и затем нажмите экзекьютор 6.

в) Нажмите Move, нажмите клавишу  экзекьютора 1 на консоли и затем нажмите клавишу  экзекьютора 6 на консоли.

Экзекьютор перемещён с позиции 1 на позицию 6.

Пример 4

Предположим, вы перемещаете экзекьютор 1 со страницы 1 на страницу 2.

Есть три способа это сделать:

a) Нажмите Move Exec 1 (= страница 1) . 1 (= экзекьютор 1) At Exec 2 (= страница 2) . 1 (= экзекьютор 1) Please.

б) Нажмите Move, нажмите экзекьютор 1 на странице 1 в окне экзекьюторов и нажмите экзекьютор 1 на странице 2.

в) Нажмите Move, нажмите  экзекьютор 1 на странице 1 в полосе экзекьюторов и нажмите  экзекьютор 1 на странице 2.

Экзекьютор 1 перемещён со страницы 1 на страницу 2.

Пример 5

Предположим, вы перемещаете главный экзекьютор на экзекьютор 6 на странице 1.

Есть три способа это сделать:

a) Нажмите Move и затем одну из больших клавиш главного экзекьютора, например, большую Pause (Паузу) и затем нажмите клавишу  экзекьютора 6.

б) Нажмите Move Exec 0 . 1 . 1 (= главный экзекьютор] At Exec 1(= Страница 1) . 6 (= экзекьютор 6) Please.

в) Нажмите Move, затем нажмите главный экзекьютор в полосе экзекьюторов и нажмите на экзекьюторr 6 на странице 1.

Главный экзекьютор перемещён на экзекьютор 6 на странице 1.

Источник: https://help2.malighting.com/Page/MA_dot2/keyword_move/ru/1.2

Что такое std:: move (), и когда его следует использовать?

пока std::move() технически функция — я бы сказал это не действительно функция. Это своего рода конвертер между способами компилятор учитывает значение выражения.

ЭТО ИНТЕРЕСНО:  Как по английски будет пальцы на ногах

2. «Что он делает?»

первое, что нужно отметить, что std::move()не все.

если вы когда-нибудь смотрели мультсериал отбеливатель — он делает эквивалент Куинси Seele Schneider ' s Рейши размягчения.

серьезно, однако, он преобразует выражение изименующее или чисто правосторонним значением (например, переменная, которую вы можете использовать в течение длительного времени, или временная, которую вы передаете на некоторое время, соответственно), чтобы быть xvalue. В тихую говорит компилятор:

можно грабить я,движение все, что я держу и использую его в другом месте (так как я все равно скоро буду уничтожен)».

другими словами, когда вы используете std::move(x), вы позволяете компилятору раскулачить x. Таким образом, если x есть, скажем, свой собственный буфер в памяти — после std::move()рый компилятор может иметь другой объект, а не его владельцем.

3. «Когда его следует использовать?»

другой способ задать этот вопрос: «Что бы я использовать/раскулачить в ресурсы объекта для?»ну, если вы пишете код приложения, вы, вероятно, не будете много возиться с временными объектами, созданными компилятором. Так что в основном это делается в таких местах, как конструкторы, операторных методов, библиотеки STL-алгоритма-функции и т. д. где объекты создаются и уничтожаются автоматически много. Конечно, это всего лишь эмпирическое правило.

типичное использование-это «перемещение» ресурсов из одного объекта в другой вместо копирования. @Гийом ссылки на на этой странице который имеет простой короткий пример: замена двух объектов с меньшим количеством копирования.

template swap(T& a, T& b) { T tmp(a); // we now have two copies of a a = b; // we now have two copies of b (+ discarded a copy of a) b = tmp; // we now have two copies of tmp (+ discarded a copy of b)}

использование move позволяет менять местами ресурсы, а не копировать их вокруг:

template swap(T& a, T& b) { T tmp(std::move(a)); a = std::move(b); b = std::move(tmp);}

подумайте о том, что происходит, когда T, скажем,vector размера n.в первой версии вы читаете и записываете 3*n элементов, во второй версии вы в основном читаете и записываете только 3 указателя на буферы векторов. Конечно, класс T должен знать, как это сделать перемещение; у вас должен быть оператор назначения перемещения и конструктор перемещения для класса T, чтобы это работало.

Источник: https://codengineering.ru/q/what-is-stdmove-and-when-should-it-be-used-26016/

Move — ActiveMailboxDatabase (exchange)

Move — ActiveMailboxDatabase [-ActivatePreferredOnServer] [-Confirm] [-DomainController ] [-MountDialOverride ] [-MoveComment ] [-SkipActiveCopyChecks] [-SkipClientExperienceChecks] [-SkipCpuChecks] [-SkipHealthChecks] [-SkipLagChecks] [-SkipMaximumActiveDatabasesChecks] [-SkipMoveSuppressionChecks] [-TerminateOnWarning] [-WhatIf] [] Move — ActiveMailboxDatabase [-Identity] [[-ActivateOnServer] ] [-Confirm] [-DomainController ] [-MountDialOverride ] [-MoveComment ] [-SkipActiveCopyChecks] [-SkipClientExperienceChecks] [-SkipCpuChecks] [-SkipHealthChecks] [-SkipLagChecks] [-SkipMaximumActiveDatabasesChecks] [-SkipMoveSuppressionChecks] [-TerminateOnWarning] [-WhatIf] [] Move — ActiveMailboxDatabase [-Server] [[-ActivateOnServer] ] [-MoveAllDatabasesOrNone] [-Confirm] [-DomainController ] [-MountDialOverride ] [-MoveComment ] [-SkipActiveCopyChecks] [-SkipClientExperienceChecks] [-SkipCpuChecks] [-SkipHealthChecks] [-SkipLagChecks] [-SkipMaximumActiveDatabasesChecks] [-SkipMoveSuppressionChecks] [-TerminateOnWarning] [-WhatIf] [] Move — ActiveMailboxDatabase [-Identity] [-ActivateOnServer] [-SkipAllChecks] [-Confirm] [-DomainController ] [-MountDialOverride ] [-MoveComment ] [-SkipActiveCopyChecks] [-SkipClientExperienceChecks] [-SkipCpuChecks] [-SkipHealthChecks] [-SkipLagChecks] [-SkipMaximumActiveDatabasesChecks] [-SkipMoveSuppressionChecks] [-TerminateOnWarning] [-WhatIf] []

Для его запуска необходимо получить соответствующие разрешения. В этой статье перечислены все параметры командлета. Но некоторые из них могут быть вам не доступны, если они не включены в назначенные разрешения. Сведения о необходимых разрешениях для запуска командлетов и использования параметров в организации см. в статье Find the permissions required to run any Exchange cmdlet.

Examples

Пример 1

Move-ActiveMailboxDatabase DB2 -ActivateOnServer MBX1 -MountDialOverride:None

В данном примере выполняется переключение базы данных DB2 на почтовый сервер MBX1. После завершения команды на сервере MBX1 будет храниться активная копия DB2. Так как значение параметра MountDialOverride равно None, сервер MBX1 подключает базу данных с помощью собственных параметров автоподключения базы данных.

Пример 2

Move-ActiveMailboxDatabase DB1 -ActivateOnServer MBX3 -MountDialOverride:GoodAvailability

В данном примере выполняется переключение базы данных DB1 на почтовый сервер MBX3. После выполнения команды на сервере MBX3 будет храниться активная копия DB1. Так как значение параметра MountDialOverride равно Good Availability, сервер MBX3 подключает базу данных с помощью параметра автоподключения базы данных GoodAvailability.

Пример 3

Move-ActiveMailboxDatabase DB3 -ActivateOnServer MBX4

В данном примере выполняется переключение базы данных DB3 на почтовый сервер MBX4. После выполнения команды на сервере MBX4 будет храниться активная копия DB3. Так как значение параметра MountDialOverride не указано, сервер MBX4 подключает базу данных с помощью параметра автодозвона для подключения базы данных Lossless.

Пример 4

Move-ActiveMailboxDatabase -Server MBX1

В этом примере выполняется переключение сервера на почтовый сервер MBX1. Все активные копии базы данных почтовых ящиков на сервере MBX1 будут активированы на одном или нескольких других серверах почтовых ящиков с работоспособными копиями активных баз данных на сервере MBX1.

Parameters

-— MountDialOverride равно -— SkipClientExperienceChecks -— Активатепреферредонсервер -— Мовеаллдатабасесорноне -— Скипмаксимумактиведатабасесчеккс -— Скипмовесуппрессиончеккс

Inputs

Типы входных данных, поддерживаемые этим командлетом, см. в статье Типы входных и выходных данных для командлетов. Если поле «Типы входных данных» для командлета пустое, этот командлет не поддерживает ввода данных.

Outputs

Типы возвращаемых данных, или типы выходных данных, которые поддерживаются этим командлетом, см. в статье Типы входных и выходных данных для командлетов. Если поле «Типы выходных данных» пустое, командлет не возвращает данные.

Источник: https://docs.microsoft.com/ru-ru/powershell/module/exchange/move-activemailboxdatabase

Понравилась статья? Поделиться с друзьями:
English House