Мой хост Hyper-V в Windows 10 или Windows Server 2016 показывает более интенсивное использование ресурсов процессора, чем предыдущие версии. Почему?

При взгляде на уровень использования процессора хоста в диспетчере Task Manager на системах до Windows Server 2016 мы видим, что использование процессора виртуальных машин не отображается, и многих это приводит замешательство. В Windows Server 2016 и Windows 10 ситуация изменилась, так что использование процессора виртуальными машинами мы уже будем видеть. Это приводит к тому, что вам кажется, будто процессор используется больше в Windows 10 или Server 2016, но на самом деле вы видите обычное использование процессора виртуальной машиной. На экране 1 представлен пример, показывающий четыре выделенных ядра, которые задействуются виртуальной машиной с четырьмя виртуальными процессорами vCPU при запуске на ней утилиты, проверяющей использование ресурсов.

 

Использование процессора виртуальной машиной
Экран 1. Использование процессора виртуальной машиной

 

Какие уровни настройки Windows Server 2016 можно использовать для компонентов инфраструктуры SDNv2?

Windows Server 2016 Datacenter (Центр данных Windows Server 2016) имеет новую программно-определяемую сеть Software Defined Networking v2 (SDNv2), появление которой было вызвано требованиями Azure. Частью SDNv2 является ряд развертываемых виртуальных машин, включая Network Controller и SLB MUX. Они сконструированы из обработанного SYSPREP файла Windows Server 2016 VHDX. Поддерживаемые уровни настройки:

  • Server with Desktop Experience;
  • Server Core.

Nano Server на сегодня не может поддерживать роли SDNv2 (однако Nano Server может быть запущен на действующих хостах Hyper-V).

Как разделить строку PowerShell на части?

Строки кода PowerShell обладают функцией разделения на части, которая активирует простое разделение строки на массив строк за счет символа-разделителя.

Ниже приведен пример разделения с использованием символа пробела; здесь удаляются любые элементы, в которых нет актуального контента:

$FullName = "John Savill "
$Names = $FullName.Split(" ",[StringSplitOptions]'RemoveEmptyEntries')

$Names содержит два элемента: John и Savill. Хвостовые пробелы удалены.

Как мне с помощью команд PowerShell задать атрибуты службы каталогов, которые не входят в стандартный набор?

Такие команды, как New-ADUser и Set-ADUser, поддерживают наиболее распространенные атрибуты, которые вы можете при желании настроить. Но что если вам нужно настроить другие атрибуты? Параметры -add («Добавить»), -replace («Заменить») и -remove («Удалить») для Set-ADUser можно использовать для настройки любых атрибутов. Например, чтобы задать местоположение Exchange, я бы использовал следующую команду (где $NewUser является пользовательским объектом):

$NewUser | Set-Aduser -Replace @{msExchUsageLocation=»US«}

Как проще всего удалить виртуальные машины в Azure, которые были остановлены?

Если вы выключаете виртуальную машину изнутри этой виртуальной машины, то, пока виртуальная машина остановлена, она все еще развернута в инфраструктуре Azure, и это означает, что вы продолжаете платить за нее. Я написал сценарий (см. листинг 1), который следует запускать по расписанию каждые 20 минут. Сценарий будет находить виртуальные машины, которые остановлены более 20 минут назад и за это время не были перезапущены. Он ищет остановленные виртуальные машины, и, если остановка происходит с машиной впервые и она до этого не перезапускалась, такая виртуальная машина записывается в файл. Если сценарий эту машину находит остановленной во второй раз (то есть он видит ее в предыдущем списке исполнения), то машина удаляется. Я пытаюсь найти способ выполнить процесс автоматически с помощью Azure Automation. Я расскажу об этом, когда у меня будет версия для Azure Automation. Возможно, вы захотите запускать ее в Azure вместо запуска из локальной сети.

Как управлять группами безопасности сети Network Security Groups в ARM при помощи PowerShell?

В листинге 2 представлен пример кода PowerShell, который я снабдил комментариями. Код показывает различные действия по управления сетевыми группами безопасности в ARM при помощи PowerShell.

Как изменить подсеть и IP-адрес виртуальной машины в Azure RM с помощью PowerShell?

Чтобы изменить подсеть, в которой находится виртуальная машина в Azure RM, и задать статический IP-адрес, используйте приведенный в листинге 3 код PowerShell. Измените значения переменных таким образом, чтобы они соответствовали вашей среде.

Каким образом можно просмотреть журналы аудита Azure при помощи PowerShell?

Команда Get-AzureRmLog покажет журналы конкретной ресурсной группы для определенного момента. Затем журнал можно просмотреть на предмет конкретных действий. Например, чтобы найти все виртуальные машины, запущенные за последний час, я могу использовать следующую команду:

Get-AzureRmLog -ResourceGroup $rgname -StartTime
(Get-Date).AddHours(-1) |
                               Where-Object OperationName -eq
                               Microsoft.Compute/virtualMachines/start/action

Как мне проверить с помощью PowerShell, остановлена виртуальная машина или отменено ее распределение в инфраструктуре Azure?

У команды Get-AzureRmVM есть параметр -Status, который показывает ряд аспектов, связанных с виртуальной машиной. Можно найти массив статусов для каждой виртуальной машины, и вам нужно посмотреть атрибут DisplayStatus, состоящий из нескольких статусов, чтобы у них не было кода ProvisioningState/succeeded (состояние инициализации/успешно). Например:

$VMDetail = Get-AzureRmVM -ResourceGroupName
$RG.ResourceGroupName -Name $VM.Name -Status
                              foreach ($VMStatus in $VMDetail.Statuses)
                              {
                               if($VMStatus.Code.CompareTo("ProvisioningState/
                               succeeded") -ne 0) #don't want to the provisioning
                               status
                               {
                                   $VMStatusDetail = $VMStatus.DisplayStatus
                               }
                              }

Если виртуальная машина остановлена, но все еще развернута в инфраструктуре Azure (то есть вы платите за нее), у ее статуса будет значение VM stopped. Если распределение для виртуальной машины отменено, то у ее статуса будет значение VM deallocated.

Я получаю сообщение об ошибке, когда пытаюсь запустить защищенную виртуальную машину Shielded VM, если режим изоляции пользователя User Mode выключен.

Защищенные виртуальные машины требуют режима изоляции пользователя User Mode, для того чтобы обеспечить безопасность. Для активации режима изоляции пользователя машина должна быть настроена на безопасную загрузку Secure Boot, а соответствующая политика настраивается таким образом:

  1. Откройте объект локальной или групповой политики, который загружает машину.
  2. Пройдите по маршруту Computer Configuration — Administrative Templates — System — Device Guard.
  3. Двойным щелчком мыши по Turn on Virtualization Based Security откройте окно настройки.
  4. Установите для политики режим Enabled.
  5. Настройте уровень безопасности платформы Select Platform Security Level на значение Secure Boot, а две другие настройки установите в Disabled. Эти две настройки Virtualization Based Protection of Code Integrity и Credential Guard Configuration.
  6. Нажмите кнопку ОК.

Я пытаюсь удалить диск, который заменил другим, из пула носителей Storage Pool, но процесс виснет. Почему?

Пространство хранения Storage Spaces присутствует как в клиентской, так и в серверной версии Windows. У вас, вероятно, имеется пространство Storage Spaces, которое использует зеркалирование, Mirroring. Это означает, что каждый блок данных на одном диске записывается и на другой диск. Если вы хотите заменить диск, вам нужно выключить компьютер, заменить диск новым, а затем в панели управления в модуле Storage Spaces добавить новый диск в пул, в котором Storage Spaces будет использовать его в качестве замены старого диска. Тогда вариант удаления старого диска станет доступным. Однако, когда вы выполните действие Remove, диск зависнет, как показано на экране 2.

 

Зависание диска при попытке его удаления из пула
Экран 2. Зависание диска при попытке его удаления из пула

 

Дело в том, что, даже если вы заменили диск, процесс восстановления, который запускает автоматическую процедуру регенерации для копирования всех блоков на новый диск, еще не завершился. Вы сможете убедиться в этом, если запустите команду PowerShell Get-StorageJob (см. экран 3).

 

Проверка состояния диска
Экран 3. Проверка состояния диска

 

До тех пор пока не завершатся регенерация данных и восстановление, вы не сможете удалить диск. Вот почему процесс его удаления из пула зависает. Я предпочитаю выполнять весь процесс, используя код PowerShell, а не модуль Storage Spaces панели управления. Например, я просматриваю пулы носителей, добавляю новые диски в пул, изымаю из обращения старый диск и запускаю процесс автоматического восстановления. После завершения процесса восстановления я удаляю диск. Если вы не уверены в серийном номере виртуального диска, который хотите добавить, запустите команду Get-PhysicalDisk (см. экран 4).

 

Получение информации о диске
Экран 4. Получение информации о диске

 

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

 

Изменение имени диска
Экран 5. Изменение имени диска

 

Как мне остановить перехват OneDrive действия клавиши Print Screen?

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

  1. Откройте настройки OneDrive Settings.
  2. Выберите вкладку Auto Save.
  3. Снимите флажок у параметра Automatically save screenshots I capture to OneDrive (см. экран 6).
  4. Нажмите ОК.
  5. Теперь вы можете использовать клавишу Print Screen с другими приложениями.

 

Отключаем перехват действия клавиши печати экрана
Экран 6. Отключаем перехват действия клавиши печати экрана

 

Как сообщить инфраструктуре Azure, что на виртуальную машину был установлен Azure VM Agent?

Если вы выгрузили виртуальную машину в Azure или создали собственный шаблон, в котором нет установленного агента Azure VM Agent, то вы можете вручную загрузить его по адресу: http://go.microsoft.com/fwlink/? LinkID=394789. Затем сообщите инфраструктуре Azure, что на виртуальную машину установлен агент виртуальной машины VM Agent. Чтобы сделать это при помощи ARM, выполните код:

$vm = Get-AzureRmVM -ResourceGroupName $rg -Name $name
$vm.OSProfile.windowsConfiguration.provisionVMAgent = $True
Update-AzureRmVM -ResourceGroupName $rg -VM $vm

Какие основные действия нужно выполнить при первом использовании контейнеров Containers на Windows Server 2016?

Вероятно, после установки хоста контейнеров вы захотите создать контейнер. По умолчанию установка Containers задает настройку сети NAT, которая делает созданные контейнеры доступными по сети при использовании IP-адреса хоста контейнеров.

Первый шаг — это загрузка образа операционной системы контейнера. Обычно требуется образ Nano Server и образ Server Core. Загрузить их вы можете так:

1. Откройте окно командной строки с повышенными привилегиями.

2. Загрузите следующие команды:

docker images   (пока без образов);
docker pull microsoft/windowsservercore;
docker pull nanoserver/iis;
docker images    (уже с образами).

3. Теперь вы можете создать экземпляр контейнера с запущенным Server Core, с которым можно взаимодействовать:

docker run -it microsoft/windowsservercore cmd.exe

exit   (when finished)

4. Контейнер все еще существует, но закрыт (поскольку его задача, cmd.exe, уже завершена)

docker ps -a

5. Для удаления контейнера запустите команду

docker rm .

Пример показан на экране 7.

 

Работа с контейнером
Экран 7. Работа с контейнером

 

Вы также можете создать пользовательский образ IIS. Например, можно поискать существующий образ в архиве данных:

docker search iis
docker pull microsoft/iis

Теперь вы можете создать экземпляры контейнера, основанные на IIS, и подогнать их под свои требования, но это уже повышенный уровень управления. Вот теперь вы можете использовать контейнер.

Если у меня есть контроллеры домена в Azure, то как мне контролировать их при помощи Advanced Threat Analytics?

В версии 1.6 Advanced Threat Analytics (АТА) существует новый вариант шлюза, который устанавливается напрямую на контроллеры домена и отсылает трафик на сервер АТА. Таким образом, исчезает необходимость в отдельном шлюзе АТА, который выполнял зеркальное отражение трафика с контроллеров домена, что в свою очередь требовало привязки контроллеров домена к шлюзу для гарантии того, что трафик будет зеркально отображаться в рамках хоста.

Существует ли список групповых политик, которые не работают с вариантами поставки Windows 10, не основанными на редакции Windows 10 Enterprise?

Да. В документе по адресу: https://technet.microsoft.com/en-us/itpro/windows/manage/group-policies-for-enterprise-and-education-editions указаны настройки групповой политики, которые работают только в редакциях Enterprise и Education. В эти настройки входят:

  • возможность блокировки магазина Windows Store;
  • возможность показывать только личный магазин Private Store и корпоративный Windows Store for Business;
  • запрет поиска в Web и вывода результатов поиска в Web;
  • настройка формата меню Start;
  • настройка изображения для экрана блокировки;
  • настройка возможностей функции Spotlight;
  • запрет пользовательских настроек.

Как мне удалить диск виртуальной машины ARM, которого больше не существует?

В менеджере служб Azure Service Manager (ASM) был предусмотрен ряд команд для управления диском Azure, включая удаление дисков. Эта операция проводилась по-другому, через старый портал Azure. Менеджер ресурсов Azure Resource Manager (ARM) управляет дисками совершенно иначе. Диск виртуальной машины на самом деле является файлом VHD, который хранится в страничном двоичном объекте. Управление дисками в ARM осуществляется через ресурс виртуальной машины: например, получить доступ к дискам виртуальной машины вы можете так:

$vm = Get-AzureRmVM -Name testvm
-ResourceGroupName RG-SCUSA
                              $vm.StorageProfile

Через свойство StorageProfile для управления доступны OSDisk и массив DataDisks, включая настройки кэша и изменение размера. Можно добавлять и перемещать диски виртуальных машин командой AzureRmVMDataDisk. Чтобы совсем удалить VHD, который больше не требуется и не подсоединен к виртуальной машине, нужно удалить сам страничный двоичный объект. Чтобы просмотреть все используемые VHD, введите команду:

Get-AzureRMStorageAccount -Name savtechsalrsscus
-ResourceGroupName rg-scusa |
                              Get-AzureStorageContainer | where {$_.Name
                              -eq 'vhds'} | Get-AzureStorageBlob | where
                              {$_.Name.EndsWith('.vhd')}

Для полного удаления файла используйте команду:

Remove-AzureStorageBlob -Blob  -Container
   'vhds' -Context $

У меня есть действующий сетевой адаптер для виртуальной машины Azure ARM. Каким образом для него можно добавить правило NAT?

Обычно правила NAT назначаются для сетевого адаптера в процессе его создания, например следующим образом:

$nic = New-AzureRmNetworkInterface -Force -Name
   ('nic' + $vmname) -ResourceGroupName $rgname `
    -Location $loc -SubnetId $subnetId -LoadBalancerInboundNatRule
    $NRPLB.InboundNatRules[0]

Если вы хотите добавить новое правило NAT для существующего сетевого адаптера, добавьте новое правило NAT для балансировщика нагрузки, а затем примените его для сетевого адаптера. Чтобы просмотреть уже существующие правила NAT для балансировщика нагрузки, используйте команду $.InboundNatRules, как в следующем примере:

#Add a new rule
$NRPLB | Add-AzureRmLoadBalancerInboundNatRuleConfig
   -Name "RDP2" -FrontendIpConfiguration $frontendIP `
    -Protocol TCP -FrontendPort 3442 -BackendPort 3389
#Get an object to the NIC to update
$nic = Get-AzureRmNetworkInterface -ResourceGroupName $rgName
    -Name ""
#Add a NAT Rule to existing NIC
$nic.IpConfigurations[0].LoadBalancerInboundNatRules.Add
   ($NRPLB.InboundNatRules[1]) #Remember NAT rules start at index 0
Set-AzureRmNetworkInterface -NetworkInterface $nic #Update
   the NIC configuration

Возможно ли развертывание сервера Nano посредством утилиты SYSPREP?

Нет. Сервер Nano не включает в себя утилиту SYSPREP. Предварительную настройку развертывания необходимо произвести посредством модификации файла ответов unattend.xml. Альтернативный подход к настройке развертывания заключается в использовании декларативных технологий, таких, например, как PowerShell DSC, Chef или Puppet. Однако имейте в виду, что, если предполагается использование DSC с сервером Nano, необходимо добавить компонент DSC в образ вашего сервера Nano с помощью команды add -Packages Microsoft-NanoServer-DSC-Package.

Куда подевались действия на портале Azure?

Изначально на портале Azure был раздел «Путешествия», который давал пользователю нового портала Azure возможность перемещаться между различными действиями, не теряя при этом текущий прогресс. Затем в интерфейсе вкладка «Путешествия» была переименована в «Действия», однако по прошествии времени была оттуда убрана. Чтобы получить доступ к различным колонкам и открытым на данный момент действиям, нужно щелкнуть направленную вниз стрелку в правом верхнем углу экрана. В данном меню можно перемещаться между всеми открытыми действиями, а также закрывать те, которые необходимо.

Как можно использовать существующий образ виртуального жесткого диска при создании виртуальной машины посредством AzureRM?

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

$osDiskName = $vmname+'_osDisk'
$osDiskCaching = 'ReadWrite'
$osDiskVhdUri = "https://$stoname.blob.core.windows.net/
vhds/"+$vmname+"_os.vhd"
                             
# Setup OS & Image
$user = "localadmin"
$password = 'Pa55word5'
$securePassword = ConvertTo-SecureString $password
   -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential
   ($user, $securePassword)
$vm = Set-AzureRmVMOperatingSystem -VM $vm -Windows
   -ComputerName $vmname -Credential $cred
$vm = Set-AzureRmVMSourceImage -VM $vm -PublisherName
   $AzureImage.PublisherName -Offer $AzureImage.Offer `
    -Skus $AzureImage.Skus -Version $AzureImage.Version
$vm = Set-AzureRmVMOSDisk -VM $vm -VhdUri $osDiskVhdUri -name $osDiskName -CreateOption fromImage -Caching $osDiskCaching

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

$osDiskName = $vmname+'_osDisk'
$osDiskCaching = 'ReadWrite'
$osDiskVhdUri = "https://$stoname.blob.core.windows.net/
   vhds/"+$vmname+"_os.vhd"
$vm = Set-AzureRmVMOSDisk -VM $vm -VhdUri $osDiskVhdUri
   -name $osDiskName -CreateOption attach -Windows -Caching
   $osDiskCaching

Обратите внимание, что здесь аналогичным образом задаются соответствующие переменные для имени диска, кэширования и местоположения, однако для создания образа диска вместо fromImage используется команда подключения (attach).

Как для предложения от Azure использовать самую свежую версию существующей редакции продукта?

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

$AzureImageSku = Get-AzureRmVMImage -Location $loc
   -PublisherName "MicrosoftWindowsServer" `
    -Offer "WindowsServer" -Skus "2012-R2-Datacenter"
$AzureImageSku = $AzureImageSku | Sort-Object Version -Descending
   #put the newest first
$AzureImageSku[0] #Newest

Мне не удается удаленно подключиться посредством RDP к своей виртуальной машине Azure. Что можно с этим сделать?

В подобной ситуации можно попробовать выполнить несколько различных действий.

1. Убедитесь, что виртуальная машина запущена. Также попробуйте выключить ее через портал и перезапустить.

2. Если вы подключаетесь через Интернет, убедитесь в том, что используются правильные имя службы и конечная точка (для ASM) для вашей виртуальной машины. Или же, если у вас виртуальная машина ARM, убедитесь, что у вас есть PIP для виртуальной машины или балансировщик нагрузки с настроенным правилом NAT, указывающим на порт 3389 для вашей виртуальной машины.

3. Если вы подключаетесь через ExpressRoute или S2S VPN, убедитесь, что соединение работает и доступно.

4. Если на вашей виртуальной машине установлен агент Azure, запустите PowerShell и выполните следующие команды, чтобы перезапустить службу RDP и убедиться, что она работает и соответствующее правило брандмауэра разрешает подключение:

$AzureVM = Get-AzureVM -ServiceName 
   -Name 
$AzureVM | Set-AzureVMAccessExtension | Update-AzureVM
   #Enable RDP

5. Если подключение посредством RDP все еще не заработало, проверьте, существует ли сетевая группа безопасности, включающая подсеть, в которой находится ваша виртуальная машина. Если да, то удалите ее (если имеете основания полагать, что она может блокировать доступ посредством RDP) или создайте новую сетевую группу безопасности, переопределяющую доступ посредством RDP.

Get-AzureNetworkSecurityGroupForSubnet -VirtualNetworkName
    -SubnetName 
Get-AzureNetworkSecurityGroup -Name " -SubnetName
   

6. Если ничего не помогает, попробуйте удалить виртуальную машину, оставив при этом ее хранилище, а затем создайте ее заново.

7. Наконец, скачайте виртуальный жесткий диск вашей виртуальной машины и попробуйте отладить ее на локально развернутом экземпляре Hyper-V.

Как мне создать учетную запись нового пользователя с правами администратора для сервера ESXi?

Недавно я настраивал резервирование виртуальной машины ESXi в Azure, используя Azure Site Recovery. В процессе работы требовалась административная учетная запись на хосте ESXi. Для создания учетной записи нового пользователя с правами администратора на ESXi с помощью диспетчера vCenter выполните следующие шаги:

  1. Выберите хост ESXi на клиентской системе vSphere- и откройте вкладку Users, находясь в рабочей области Inventory.
  2. Щелчком правой кнопки мыши по области пользователя откройте контекстное меню и выберите Add…
  3. Введите новое имя учетной записи, имя пользователя и пароль, затем нажмите ОК.
  4. Чтобы создать учетную запись нового пользователя с правами администратора, щелчком правой кнопки мыши на хосте ESXi в панели навигации откройте контекстное меню и выберите Add Permission…
  5. Нажмите Add и выберите учетную запись нового пользователя, которую добавили, затем щелкните ОК.
  6. На вкладке назначения ролей Assigned Role выберите Administrator, затем нажмите ОК (см. экран 8).

 

Создание учетной записи нового пользователя с правами администратора
Экран 8. Создание учетной записи нового пользователя с правами администратора

Как проще всего добавить временную метку к любому текстовому выводу в PowerShell?

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

filter timestamp {"$(Get-Date -Format G): $_"}

Еще я могу послать вывод в фильтр по конвейеру, например:

PS C:\> write-output "hello world" | timestamp
                              8/10/2016 3:45:22 PM: hello world

Обратите внимание, что время добавляется в начале текста.

Будут ли новые сборки Windows Server 2016 Nano Server Current Branch for Business устанавливаться автоматически?

Нет. Оставаться в исходном состоянии важно, поскольку в рамках плана обслуживания Current Branch for Business (CBB) только текущая и предыдущая сборки поддерживаются, и автоматическое обновление не предусмотрено. Вместо него вы будете выполнять обновление по мере выпуска новых сборок, а сам процесс будет несложным, таким, например, как обновление по выбору через Windows Update или локальные решения типа WSUS. Вы не сможете использовать менеджер Configuration Manager, так как он сейчас не работает с Nano Server.

Как работает оптимизация доставки Delivery Optimization службы обновления Windows Update в Windows 10?

В Windows 10 реализована оптимизация доставки, которая дает возможность системам делиться загруженными обновлениями с другими системами по локальной сети и даже через Интернет. Вы можете настроить оптимизацию доставки в меню Settings, Update & security, Windows Update, Advanced options, Choose how updates are delivered (см. экран 9).

 

Настройка функции оптимизации доставки обновлений
Экран 9. Настройка функции оптимизации доставки обновлений

На самом деле в фоновом режиме работает служба Delivery Optimization (DoSvc), которая отвечает за оптимизацию доставки обновлений и внесение различных исключений брандмауэра, которые делаются на базе внесенных настроек (их можно увидеть в Windows Firewall; там две настройки, обе названы Delivery Optimization, только первая для TCP, а вторая — для UDP, но обе для порта 7680).

В отличие от таких технологий, как BranchCache, которая использует широковещательные пакеты для поиска систем, требующих обновления, Delivery Optimization (DO) задействует «облачную» службу для обнаружения одноранговых узлов и управления ими. Эта служба использует соединение HTTPS с доменом *.do.dsp.mp.microsoft.com (должно быть дано разрешение на внешнее подключение к нему по Интернету, даже если разрешено только локальное совместное использование ресурсов).

Служба DO управляет портом 7680 для прослушивания входящих соединений от одноранговых узлов сети. Порт 3544 является портом Teredo, который используется для преобразования NAT, например для систем в сети Интернет или если доступ к одноранговой сети использует NAT (режим Group DownloadMode).

У Microsoft имеется документ, который можно найти по адресу: https://technet.microsoft.com/en-us/itpro/windows/manage/waas-delivery-optimization. В нем рассказано о групповых политиках, связанных со службой DO. Если вы не можете использовать DO, тогда можно воспользоваться BranchCache, если вы используете редакцию Enterprise в Windows 10 (но убедитесь, что вы блокировали DO и настроили DownloadMode на пропуск пакетов, как описано в упомянутой статье).

Как переместить виртуальную машину из менеджера служб Azure Service Manager в менеджер ресурсов Azure Resource Manager?

У Microsoft есть инструмент (он доступен по адресу: https://blogs.msdn.microsoft.com/tomholl/2016/07/16/migrating-azure-iaas-solutions-from-asm-to-arm-using-migaz/), позволяющий выбирать ресурсы в ASM, которые вы хотите переместить. Данный инструмент создает шаблон JSON, который представляет «новую» версию этих объектов в ARM. Кроме того, он создает файл BlobCopy.ps1, копирующий страницы двоичных объектов, содержащие файлы VHD, которые используются виртуальными машинами для вновь созданных учетных записей хранилища данных. Существует также решение asm2arm, доступное по адресу: https://github.com/fullscale180/asm2arm, а решение от производителя описано по адресу: https://azure.microsoft.com/en-us/blog/iaas-migration-classic-resource-manager/.

Если вы хотите выполнить перемещение вручную, используя код PowerShell, то вы можете вручную скопировать файлы VHD из учетной записи хранилища данных ASM в учетную запись хранилища данных ARM, используя Azure Storage Explorer (http://storageexplorer.com/) или выполнить копирование внутри Azure.

После копирования файлов VHD в учетную запись хранилища данных ARM можно создать новую виртуальную машину в виртуальной сети ARM, используя скопированные файлы VHD. Пример показан в листинге 4. Предполагается, что диском операционной системы является -OS.vhd, а диском данных — -Data.vhd (измените эти имена, как вам нужно).

Листинг 1. Удаление остановленных виртуальных машин
# FindShutnotDeprovVMs.ps1
# John Savill 7/27/2017
#
# Script should be run every 20 minutes and is designed to deprovision
VMs from Azure that have been stopped for more
# than 20 minutes.
# On each execution it loads in the previous executions list of VMs that were stopped and had not been restarted/stopped within
# the last 20 minutes. If the VM on this execution is still stopped and has not been restarted/stopped within that time
# the VM is stopped so it is no longer charged.

#Modify this as needed. Note there are different ways to store the credential such as at
#http://windowsitpro.com/development/save-password-securely-use-powershell
$user = "account"
$password = 'password'
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential ($user, $securePassword) 
Login-AzureRmAccount -Credential $cred #ARM logon
Select-AzureRmSubscription -SubscriptionId 

$VMStateFile = 'D:\temp\AzureStoppedVMs.csv'
$RGs = Get-AzureRMResourceGroup
$VMList = @()
#read in previous list to $VMListPrev
if(Test-Path $VMStateFile) #if file exists
{
    $VMListPrev = Import-Csv $VMStateFile
}
else
{
    $VMListPrev = $null
}
foreach($RG in $RGs)
{
    $VMs = Get-AzureRmVM -ResourceGroupName $RG.ResourceGroupName
    foreach($VM in $VMs)
    {
        $VMDetail = Get-AzureRmVM -ResourceGroupName $RG.
        ResourceGroupName -Name $VM.Name -Status
        foreach ($VMStatus in $VMDetail.Statuses)
        {
            if($VMStatus.Code.CompareTo("PowerState/stopped")
            -eq 0) #if VM is stopped but not deprovisioned
            {
                $tarvmname = $VM.Name.ToLower()
                $tarrg = $VM.ResourceGroupName
                $tarVMObj = [PSCustomObject]@{"Name"=$tarvmname;
                "ResourceGroup" = $tarrg}
                Write-Output "VM $tarvmname in RG $tarrg is stopped but not
                deprovisioned"
                #Check the VM has not been started in last 20 minutes as it
                could have been started then stopped again
                #in which case we should not take action
                $StartedRecent = $false
                #Get all start logs. Could technically optimize this and move
                out of loop if group all VMs by RG
                $logs = Get-AzureRmLog -ResourceGroup $tarrg -StartTime
                (Get-Date).AddMinutes(-20) |
                    Where-Object OperationName -eq Microsoft.Compute/
                    virtualMachines/start/action
                #Need to check to only do this if there are logs
                if($logs -ne $null)
                {
                    foreach($log in $logs)
                    {
                        if($log.Authorization.Scope.ToLower().
                        EndsWith($tarvmname)) #if its this VM
                        {
                            $StartedRecent = $true
                            Write-Output "VM $tarvmname in RG $tarrg has been
                            started in time interval. No action will be taken."
                        }
                    }
                }
                if(!$StartedRecent)
                {
                    #Check if the VM is in the list of VMs that were down
                    previously and if so stop it
                    if(($VMListPrev | ? {$_.Name -eq $tarvmname -and
                    $_.ResourceGroup  -eq $tarrg}) -ne $null)  #if found a match
                    {
                        Write-Output "VM $tarvmname in RG $tarrg was found in
                        previous execution and will be stopped"
                        Stop-AzureRmVM -Name $tarvmname
                        -ResourceGroupName $tarrg -Force
                    }
                    else
                    {
                        #If not add to new list which will be checked next time
                        $VMList += $tarVMObj
                    }
                }   
            }
        }
    }
}

#Save the current list to file for checking next time
$VMList | Export-csv $VMStateFile -notypeinformation 
Листинг 2. Управление сетевыми группами безопасности
#Set variables for the Resource Group and the location
$RGName = ‘RG-SCUSA’
$Location = ‘South Central US’

#Create a new rule to allow traffic from the Internet to port 443
$NSGRule1 = New-AzureRmNetworkSecurityRuleConfig -Name ‘WEB’ -Direction Inbound -Priority 100 `
    -Access Allow -SourceAddressPrefix ‘INTERNET’ -SourcePortRange ‘*’ `
    -DestinationAddressPrefix ‘*’ -DestinationPortRange ‘443’ -Protocol TCP

$Create a new NSG using the Rule created
New-AzureRmNetworkSecurityGroup -Name "NSGFrontEnd" -Location $Location -ResourceGroupName $RGName `
    -SecurityRules $NSGRule1 #could use array of rules or separate by
    comma, e.g. $Rule1, $Rule2

$NSG = Get-AzureRmNetworkSecurityGroup -Name "NSGFrontEnd" -ResourceGroupName $RGName

#Add rule to existing to allow RDP
Add-AzureRmNetworkSecurityRuleConfig -NetworkSecurityGroup $NSG -Name ‘RDP’ -Direction Inbound -Priority 101 `
    -Access Allow -SourceAddressPrefix ‘INTERNET’ -SourcePortRange ‘*’ `
    -DestinationAddressPrefix ‘*’ -DestinationPortRange ‘3389’ -Protocol TCP
Set-AzureRmNetworkSecurityGroup -NetworkSecurityGroup $NSG #Apply the change to the in memory object

#Remove a rule
Get-AzurermNetworkSecurityGroup -Name "NSGFrontEnd" -ResourceGroupName $RGName |
    Remove-AzureRmNetworkSecurityRuleConfig -Name ‘RDP’ |
    Set-AzureRmNetworkSecurityGroup

#NSG must be same region as the resource
#Associate a NSG to a Virtual machine NIC
$NICName = ‘dummyvm292’
$NIC = Get-AzureRmNetworkInterface -Name $NICName -ResourceGroupName $RGname
$NIC.NetworkSecurityGroup = $NSG
Set-AzureRmNetworkInterface -NetworkInterface $NIC

#Remove a NSG from a VM NIC
$NIC.NetworkSecurityGroup = $null
Set-AzureRmNetworkInterface -NetworkInterface $NIC

#Associate a NSG to a subnet
$VNetName = ‘vnetRG-SCUSA’
$VNetRG = ‘RG-SCUSA’
$SubnetNm = ‘Subnet2’
$VNET = Get-AzureRmVirtualNetwork -Name $VNetName -ResourceGroupName $VNetRG
Set-AzureRmVirtualNetworkSubnetConfig -VirtualNetwork $VNET -Name $SubnetNm `
    -AddressPrefix 10.0.1.0/24 -NetworkSecurityGroup $NSG
Set-AzureRmVirtualNetwork -VirtualNetwork $VNET

#Remove a NSG from the subnet
$VNET = Get-AzureRmVirtualNetwork -Name $VNetName -ResourceGroupName $VNetRG
$VNSubnet = Get-AzureRmVirtualNetworkSubnetConfig -VirtualNetwork $VNET -Name $SubnetNm
$VNSubnet.NetworkSecurityGroup = $null
Set-AzureRmVirtualNetwork -VirtualNetwork $VNET

#Delete a NSG
Remove-AzureRmNetworkSecurityGroup -Name "NSGFrontEnd" -ResourceGroupName $RGName
# Настройка переменных ресурсной группы и местоположения:
$RGName = 'RG-SCUSA'
$Location = 'South Central US'

# Создание нового правила, чтобы разрешить трафик из Интернета на порт 443:
$NSGRule1 = New-AzureRmNetworkSecurityRuleConfig -Name 'WEB' -Direction Inbound -Priority 100
    -Access Allow -SourceAddressPrefix 'INTERNET' -SourcePortRange '*' `
    -DestinationAddressPrefix '*' -DestinationPortRange '443' -Protocol TCP

$ Создание новой NSG с использованием созданного правила
New-AzureRmNetworkSecurityGroup -Name "NSGFrontEnd" -Location $Location -ResourceGroupName $RGName `
    -SecurityRules $NSGRule1 #можно использовать массив или разделять правила запятой, например $Rule1, $Rule2

$NSG = Get-AzureRmNetworkSecurityGroup -Name "NSGFrontEnd" -ResourceGroupName $RGName

# Добавление правила к существующему, чтобы разрешить RDP:
Add-AzureRmNetworkSecurityRuleConfig -NetworkSecurityGroup $NSG -Name 'RDP' -Direction Inbound -Priority 101 `
    -Access Allow -SourceAddressPrefix 'INTERNET' -SourcePortRange '*' `
    -DestinationAddressPrefix '*' -DestinationPortRange '3389' -Protocol
    TCP
Set-AzureRmNetworkSecurityGroup -NetworkSecurityGroup $NSG # применение изменения к объекту в памяти;
# Удаление правила:
Get-AzurermNetworkSecurityGroup -Name "NSGFrontEnd" -ResourceGroupName $RGName |
    Remove-AzureRmNetworkSecurityRuleConfig -Name 'RDP' |
    Set-AzureRmNetworkSecurityGroup
# NSG должна быть в том же регионе, что и ресурс
# Связывание NSG и NIC виртуальной машины:
$NICName = 'dummyvm292'
$NIC = Get-AzureRmNetworkInterface -Name $NICName -ResourceGroupName $RGname
$NIC.NetworkSecurityGroup = $NSG
Set-AzureRmNetworkInterface -NetworkInterface $NIC

# Отвязывание  NSG от NIC виртуальной машины:
$NIC.NetworkSecurityGroup = $null
Set-AzureRmNetworkInterface -NetworkInterface $NIC

# Связывание NSG с подсетью:
$VNetName = 'vnetRG-SCUSA'
$VNetRG = 'RG-SCUSA'
$SubnetNm = 'Subnet2'
$VNET = Get-AzureRmVirtualNetwork -Name $VNetName -ResourceGroupName $VNetRG
Set-AzureRmVirtualNetworkSubnetConfig -VirtualNetwork $VNET -Name $SubnetNm `
    -AddressPrefix 10.0.1.0/24 -NetworkSecurityGroup $NSG
Set-AzureRmVirtualNetwork -VirtualNetwork $VNET
# Отвязывание NSG от подсети:
$VNET = Get-AzureRmVirtualNetwork -Name $VNetName -ResourceGroupName $VNetRG
$VNSubnet = Get-AzureRmVirtualNetworkSubnetConfig -VirtualNetwork $VNET -Name $SubnetNm
$VNSubnet.NetworkSecurityGroup = $null
Set-AzureRmVirtualNetwork -VirtualNetwork $VNET
# Удаление NSG:
Remove-AzureRmNetworkSecurityGroup -Name "NSGFrontEnd" -ResourceGroupName $RGName
Листинг 3. Изменение подсети и IP-адреса виртуальной машины в Azure RM
$RGname = 'RGVM01' #VM and NIC RG
            $VNetRG = 'RGNet01' #Virt Net RG
            $VMName = 'VM01' #VM Name
            $NICName = 'VM01100' #NIC Name
            $VNetName = 'VNet01' #Virt Net name
            $TarSubnetName = 'Subnet10' #Target subnet name
           
            $VM = Get-AzureRmVM -Name $VMName -ResourceGroupName
            $RGname
           
            $VNET = Get-AzureRmVirtualNetwork -Name $VNetName
            -ResourceGroupName $VNetRG
            $TarSubnet = Get-AzureRmVirtualNetworkSubnetConfig
            -VirtualNetwork $VNET -Name $TarSubnetName
           
            $NIC = Get-AzureRmNetworkInterface -Name $NICName
            -ResourceGroupName $RGname
            $NIC.IpConfigurations[0].Subnet.Id = $TarSubnet.Id
            Set-AzureRmNetworkInterface -NetworkInterface $NIC
           
            #Once the subnet has been set and that applied can apply
            the static IP address
            $NIC = Get-AzureRmNetworkInterface -Name $NICName
            -ResourceGroupName $RGname
            $NIC.IpConfigurations[0].PrivateIpAddress = ‘10.1.1.20'
            $NIC.IpConfigurations[0].PrivateIPAllocationMethod = 'Static'
            #$NIC.DnsSettings.DnsServers = '10.1.1.10'
            Set-AzureRmNetworkInterface -NetworkInterface $NIC
Листинг 4. Создание новой виртуальной машины в виртуальной сети ARM
#Resource Group name, VM size and name for new VM
$rgname = 'RGSCUSInfra'
$vmsize = 'Standard_A2'
$vmname = 'savazudc01'
#Network to connect to
$virtnetname = 'VNet115'
# Storage account (assumed to be in same Resource Group as the target for VM)
$stoname = 'sascusgrsinfra'
#location to create new VM
$loc = 'SouthCentralUS'

#Get the storage account
$stoaccount = Get-AzureRmStorageAccount -ResourceGroupName $rgname -Name $stoname;

# Create VM Object
$vm = New-AzureRmVMConfig -VMName $vmname -VMSize $vmsize

# Setup Networking
$vnet = Get-AzureRmVirtualNetwork -Name $virtnetname -ResourceGroupName $rgname
$subnetId = $vnet.Subnets[0].Id #Attach the VM to the first subnet

$nic = New-AzureRmNetworkInterface -Force -Name ('nic' + $vmname) -ResourceGroupName $rgname `
-Location $loc -SubnetId $subnetId # if wanted static IP and DNS add -PrivateIpAddress 10.7.115.13 -DnsServer 10.7.115.13

# Add NIC to VM
$vm = Add-AzureRmVMNetworkInterface -VM $vm -Id $nic.Id

$osDiskName = $vmname+'_osDisk'
$osDiskCaching = 'ReadWrite'
$osDiskVhdUri = "https://$stoname.blob.core.windows.net/vhds/"+$vmname+"-OS.vhd"
$vm = Set-AzureRmVMOSDisk -VM $vm -VhdUri $osDiskVhdUri -name $osDiskName -CreateOption attach -Windows -Caching $osDiskCaching

#Add a data disk
$dataDiskVhdUri = "https://$stoname.blob.core.windows.net/vhds/"+$vmname+"-Data.vhd"
$dataDiskName = $vmname+'_dataDisk'
$vm = Add-AzureRmVMDataDisk -VM $vm -Name $dataDiskName -Caching None -CreateOption Attach -DiskSizeInGB 1023 -VhdUri $dataDiskVhdUri

# Create Virtual Machine
New-AzureRmVM -ResourceGroupName $rgname -Location $loc -VM $vm