Я меняю порядок привязки адаптеров в Windows 10 и Windows Server 2016, но изменения не сохраняются. Как мне изменить порядок?

В Windows 10 и Windows Server 2016 отсутствуют компоненты, которые используют порядок привязки, поэтому изменения и не сохраняются. Если вы хотите изменить приоритет конкретной сетевой карты, то можете сделать это при помощи PowerShell:

  1. Откройте окно PowerShell с административными правами.
  2. Просмотрите адаптеры в системе с помощью команды netstat -rn.
  3. Измените метрику, используя команду Get-NetIPInterface, чтобы просмотреть текущие значения. Затем измените их при помощи команды Set-NetIPInterface. Например:
Set-NetIPInterface -InterfaceIndex  -InterfaceMetric
   

Как проверить, какой модуль содержит команду PowerShell?

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

Get-Command -type cmdlet <команда> | fl *

Выведенное значение — это объект ModuleName, который показывает модуль, содержащий команду.

Каково общее описание, которое помещают в профиль PowerShell?

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

Set-Location c:\
                   #Set window colors and title
                   $shell = $Host.UI.RawUI
                   $shell.WindowTitle="John's PowerShell"
                   $shell.BackgroundColor = "Black"
                   $shell.ForegroundColor = "White"
                   #Set the window size
                   $size = $Shell.WindowSize
                   $size.width=70
                   $size.height=25
                   $Shell.WindowSize = $size
                   #Set the buffer sizes
                   $size = $Shell.BufferSize
                   $size.width=70
                   $size.height=5000
                   $Shell.BufferSize = $size
                   #Load modules
                   #Import-Module ....
                   #Create a notepad alias
                   New-Item alias:np -value c:\windows\system32\notepad.exe
                   #Clear the screen
                   Clear-Host

Как я могу вставить в комментарий большой блок кода в PowerShell?

Обычно строку PowerShell можно сопроводить комментарием с помощью добавления префикса # к строке. Однако если вы хотите указать в качестве комментария несколько строк, то самый простой способ — заключить содержание в пару <# #>. Например:

write-output "Start of something"
                              <# all of this
                              content will be
                              commented out #>
                              write-output "Now stuff again"

Как мне задать параметры настройки запускаемых команд при открытии экземпляра PowerShell?

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

 

Шесть профилей PowerShell

Как правило, применяется профиль для текущего пользователя и хоста, который хранится в файле $HOME\Documents\WindowsPowerShell\Microsoft. Ссылка на PowerShell_profile.ps1 идет через переменную $profile. Вот простой способ создать такой профиль:

#Check if exists
                              Test-Path $profile
                              #Create if does not exist
                              New-Item -Path $profile -ItemType file -Force
                              #Then edit in notepad
                              Notepad $profile

Мне нужно подсоединиться к целевому серверу через HTTPS при помощи PowerShell, используя имя, отличное от публичного имени сертификата. Могу ли я сделать это?

Да, это возможно, но я рекомендую поступить иначе. Использование HTTPS дает клиенту два преимущества: шифрование и гарантию того, что целевым сервером является тот, который себя таковым называет (взаимная аутентификация). При блокировке проверки имени целевым сервером может назвать себя любой сервер, поскольку имя не обязано соответствовать сертификату. Чтобы пропустить проверку имени, необходимо создать и использовать дополнительный объект сессии:

$option = New-PSSessionOption -SkipCNCheck
                   Enter-PSSession -computerName workgroupsrv
                   -sessionOption $option -credential $cred -useSSL

Теперь можно подсоединиться, используя другое имя, а не серверное имя в сертификате. Шифрование все еще присутствует, но взаимная аутентификация больше не обеспечивается.

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

Существует ли простой способ создать исключения брандмауэра для Skype for Business Server?

Код, представленный в листинге 1, был создан моим другом Тимом Вилером. Этот код создает исключения брандмауэра, необходимые для различных ролей и компонентов Skype for Business Server.

Могут ли у меня быть разные профили PowerShell для сессии с повышенными привилегиями и сессии с обычными привилегиями?

Желательно иметь разные профили PowerShell в зависимости от того, запускается сессия с повышенными или обычными привилегиями. Специального профиля для сессии с повышенными привилегиями, отличающегося от сессии с обычными привилегиями, не существует. Однако в качестве альтернативы вы можете вставить блок логики в профиль, чтобы проверить, запущена ли сессия с повышенными привилегиями или нет, а затем запускать разные блоки кода.

Самый простой способ проверить, запущена ли сессия с повышенными привилегиями, обеспечивает проверка SID администратора (с повышенными привилегиями):

(whoami/all | Select-String S-1-16-12288) -ne $null

Затем этот код используется в сценарии. В примере в листинге 2 я настроил окрашивание фона окна сессии в темно-красный цвет. Цвет служит подсказкой: темно-красный означает, что сессия с повышенными привилегиями, и с обычными, если фон стандартного черного цвета.

Как мне активировать CredSSP для хостов с целью обеспечения переключения при удаленной работе в PowerShell?

При использовании обычной аутентификации Kerberos вы не можете переключаться между удаленными серверами. Например, я не могу подсоединиться к серверу А, а затем выполнить действие в удаленном режиме на сервере В. Чтобы активировать такой тип аутентификации, следует использовать CredSSP. Нужно активировать CredSSP на клиентской системе с PowerShell и на системе-посреднике, а способность делегировать новые учетные данные необходимо включить через политику.

  • Включите CredSSP для клиента:
Set-Item WSMAN:\localhost\client\auth\credssp -value $true.
  • Включите CredSSP для службы на сервере-посреднике (запустите эту команду на всех серверах-посредниках, с которых идет переключение):
Set-Item WSMAN:\localhost\service\auth\credssp -value $true.
  • Включите делегирование новых учетных данных для списка целевых серверов. Поскольку вы выполняете это действие для всех серверов, лучше ограничить их набор, например всеми системами в домене. Откройте объект групповой политики Group Policy Object и перейдите по папкам Computer Configuration, Policies, Administrative Templates, System, Credential Delegation, Allow Delegation of Fresh Credentials. Включите политику и задайте значение через кнопку Show, например *.savilltech.net (см. экран 1). Затем нажмите ОК. После изменения GPO потребуется некоторое время, чтобы применить его на всех машинах.

 

Настройка делегирования учетных данных
Экран 1. Настройка делегирования учетных данных

Как можно активировать SSL для управления через WS-Management?

Чтобы активировать SSL для HTTP, основанного на удаленном режиме управления Windows Remote Management, вам потребуется сертификат, который соответствует имени, используемому клиентами при подсоединении. Вы можете применить файл makecert.exe, но это не совсем удачная идея, поскольку ему не доверяют клиенты, которым требуется подсоединение при использовании ключа SkipCNCheck. Последний же удаляет точку взаимной аутентификации, поскольку нет доверия сертификату. Вместо этого используйте сертификат своего внутреннего удостоверяющего центра или какого-либо внешнего удостоверяющего центра. Сертификат должен быть сертификатом SSL, который называется так же, как сертификат веб-сервера. Убедитесь, что общее имя сертификата точно соответствует имени, которое будет использоваться для подсоединения к серверу, например полностью определенному имени домена. Когда у вас есть сертификат и он установлен на локальных системах, выполните следующие действия в сессии PowerShell:

1. Найдите подпись сертификата, который будете использовать. Самый простой способ — обратиться к провайдеру сертификата и посмотреть в папке\LocalMachine\My store. Просмотрите все элементы (с помощью Get-ChildItem) и запишите подпись сертификата или просто сохраните ее в переменной

$cert = Get-ChildItem cert:\LocalMachine\My

Вы можете просмотреть подпись при помощи $cert.thumbprint.

2. Создайте нового слушателя HTTP, используя полное имя хоста и подпись сертификата, например:

New-WSManInstance winrm/config/Listener `
-SelectorSet @{Address='*';Transport='HTTPS'} `
-ValueSet @{HostName='workgroupsrv.savilltech.net';
   CertificateThumbprint=$cert.thumbprint}

3. Заключительный шаг — это создание исключения брандмауэра для порта 5986. Данный порт используется для управления по SSL:

New-NetFirewallRule -DisplayName "Windows Remote Management
   (HTTPS-In)" -Name "Windows Remote Management (HTTPS-In)" `
-Profile Any -LocalPort 5986 -Protocol TCP

Теперь вы сможете подсоединиться к системе, используя SSL, что требует передачи учетных данных, например:

$cred=get-credential
         Enter-PSSession workgroupsrv.savilltech.net -Credential
         $cred -UseSSL

В чем разница между конструкциями ForEach и foreach?

Для PowerShell предусмотрено две разных конструкции ForEach. Одна из них — команда ForEach-Object, которая является частью модуля Microsoft.PowerShell.Core. Эта команда запускает цикл по объекту, выполняет код в блоке сценария и ссылается на перебираемые объекты как на переменную $_. Например:

$names = @("Julie","Abby","Ben","Kevin")
$names | ForEach-Object -Process { Write-Output $_}

Обратите внимание, что для ForEach-Object существует два псевдонима; ForEach и % вы также можете встретить на практике. Эквивалентом указанного выше кода могут быть такие команды:

$names | ForEach -Process { Write-Output $_}
$names | ForEach { Write-Output $_}
$names | % { Write-Output $_}

Другим типом конструкции ForEach является оператор foreach, который раз за разом запускает процесс в коллекции и выполняет код в блоке сценария для каждого элемента, но на этот раз используется конкретное имя для ссылки на каждый элемент в коллекции. Приведу пример:

foreach ($name in $names) {Write-Output $name}

Обратите внимание, что выходные данные такие же: объекты в коллекции перебираются в цикле по одному объекту за раз. Итак, в чем же разница? Обычно оператор foreach работает быстрее, поскольку он составляет одно выражение, тогда как команда ForEach составлена из нескольких выражений. Однако потенциальный недостаток оператора foreach состоит в том, что, поскольку он представляет собой одиночное выражение, всю коллекцию нужно сохранять в памяти, а данные команды ForEach загружаются в память по мере необходимости. Загрузка всех данных в память может в целом происходить быстрее, но при работе будет использоваться все больше и больше памяти.

На практике процесс выглядит так: оператор foreach прежде всего загружает все данные в память в процессе перебора каждого файла в папке Windows. При запуске кода, показанного ниже, наблюдается задержка инициализации, поскольку каждый элемент загружается в память до его вывода на экран.

foreach ($file in (Get-ChildItem C:\Windows -Recurse)) {$file.Name}

Этот код отличается от такого же кода, использующего команду ForEach, который активизирует вывод на экран немедленно.

Get-ChildItem C:\Windows -Recurse | ForEach-Object {$_.Name}

Тем не менее суммарное время обработки меньше в случае применения оператора foreach (хотя он и использует больше памяти).

$Time1 = (Measure-Command {Get-ChildItem C:\Windows
   -Recurse | ForEach-Object {$_.Name}}).TotalMilliseconds
                      $Time2 = (Measure-Command {foreach ($file in
                      (Get-ChildItem C:\Windows -Recurse))
                      {$file.Name}}).TotalMilliseconds
                      Write-Output "Time using ForEach-Object is $Time1"
                      Write-Output "Time using ForEach statement is $Time2"
                      Time using ForEach-Object is 16617.7766
                      Time using ForEach statement is 15433.7096

Где можно получить больше провайдеров PowerShell для настройки желаемого состояния Desired State Configuration?

Существует много сайтов и сообществ, которые создают новых провайдеров настройки DSC. Однако простой способ расширения встроенных двенадцати — это наборы ресурсов DSC Resource Kits, которые во время написания имеют версию 10. Просто загрузите набор ресурсов и разархивируйте подпапки в свои модули, и вы сможете постоянно добавлять сотни новых провайдеров настроек, таких как SQL Server, Exchange, System Center и т. д., в DSC.

Загрузите набор по адресу: https://gallery.technet.microsoft.com/DSC-Resource-Kit-All-c449312d и извлеките содержимое в $env: ProgramFiles\WindowsPowerShell\Modules (то есть C:\Program Files\WindowsPowerShell\Modules). Убедитесь, что вы открываете папку All Resources в загруженном архивном файле, и восстановите подпапки в папку Modules, иначе они не будут работать. Проделав все это, вы сможете увидеть новые провайдеры DSC с помощью команды Get-DscResource.

Как мне модифицировать файл TrustedHosts с помощью PowerShell?

Чтобы модифицировать TrustedHosts, используя PowerShell, задействуйте провайдер WSMan и задайте значение TrustedHosts в localhost\Client. Например, чтобы настроить TrustedHosts в каждой системе в пространстве имен вашего домена, используйте команду:

Set-Item -Path WSMan:\localhost\Client\TrustedHosts
   -Value '*.savilltech.net'

Чтобы указать, что у вас нет хостов доверия, введите команду:

Set-Item -Path WSMan:\localhost\Client\TrustedHosts -Value ''

Чтобы скрыть запрос на ввод данных, внесите изменение, добавив -Force, например:

Set-Item -Path WSMan:\localhost\Client\TrustedHosts -Value '' -Force

Существует ли встроенный эквивалент Ping в PowerShell?

Ping — это полезная утилита, которая тестирует базовое соединение между системами, используя протокол ICMP (при условии, что на целевой машине активно исключение брандмауэра для ответов ICMP, которое позволяет откликаться на запрос проверки связи по Ping). В PowerShell доступен файл ping.exe, но есть и команда PowerShell, которая имеет эквивалентную и даже более широкую функциональность; это Test-NetConnection.

Проверка связи по Ping работает с использованием ICMP, а Test-NetConnection может тестировать множество портов TCP, чтобы проверить работоспособность специфического приложения. Базовую функцию запроса ответа можно использовать так:

PS C:\> Test-NetConnection savdaldc01
                             
                             
                              ComputerName : savdaldc01
                              RemoteAddress : 10.7.173.10
                              InterfaceAlias : Ethernet
                              SourceAddress : 10.7.173.131
                              PingSucceeded : True
                              PingReplyDetails (RTT) : 1 ms

Другой пример — это тестирование общих портов TCP, например HTTP (порт 80):

PS C:\> Test-NetConnection savdalfs01 -CommonTCPPort HTTP
                             
                             
                              ComputerName : savdalfs01
                              RemoteAddress : 10.7.173.175
                              RemotePort : 80
                              InterfaceAlias : Ethernet
                              SourceAddress : 10.7.173.131
                              PingSucceeded : True
                              PingReplyDetails (RTT) : 0 ms
                              TcpTestSucceeded : True

Можно также протестировать соединение с другими портами, которые не определены как общие порты, например RDP (порт 3389):

PS C:\> Test-NetConnection savdalfs01 -Port 3389
                             
                             
                              ComputerName : savdalfs01
                              RemoteAddress : 10.7.173.175
                              RemotePort : 3389
                              InterfaceAlias : Ethernet
                              SourceAddress : 10.7.173.131
                              PingSucceeded : True
                              PingReplyDetails (RTT) : 1 ms
                              TcpTestSucceeded : True

Кроме того, можно выполнить упрощенный тест, который просто вернет двоичный код состояния — значение true или false, в зависимости от успешности выполнения процесса:

Test-NetConnection savdalfs01-InformationLevel Quiet

Как мне настроить нажатие NumLock в Hyper-V?

В последней версии настройка NumLock была удалена из инструмента управления Hyper-V, но ее параметры все еще можно задать, используя команду Set-VMBios. Например:

Set-VMBios -VMName  [-DisableNumLock
   or -EnableNumLock]

Как лучше сослаться на локальные переменные в удаленной сессии PowerShell?

PowerShell версии 3 и выше упрощает этот процесс. До версии 3, для того чтобы использовать переменные в удаленной сессии PowerShell, требовалось передать переменные как аргументы, например так:

$Name = «John»
Invoke-Command -ComputerName savxvinode1-ScriptBlock
   {Write-Output "Hello $args"} -ArgumentList $Name

Начиная с третьей версии PowerShell вы можете управлять переменной $using:, чтобы получить доступ к локальным переменным, например:

$Name = "John"
Invoke-Command -ComputerName savxvinode1 -ScriptBlock
   {Write-Output "Hello $using:name"}

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

Необходимо изменить настройки виртуальной машины, в которую вы собираетесь установить Hyper-V (для составной виртуализации), чтобы показать нужные функции виртуализации. В документации Microsoft показано, как это сделать с помощью команды PowerShell:

Invoke-WebRequest https://raw.githubusercontent.com/Microsoft/
   Virtualization-Documentation/master/hyperv-tools/Nested/
   Enable-NestedVm.ps1 `
                                  -OutFile ~/Enable-NestedVm.ps1
                              ~/Enable-NestedVm.ps1 -VmName "savnest01"

Изучив приведенный в команде код PowerShell, вы сможете увидеть все необходимые изменения:

  • во время применения изменений виртуальная машина должна быть выключена;
  • любое сохраненное состояние должно быть удалено;
  • динамическая память должна быть отключена и виртуальная машина должна иметь объем как минимум 4 Гбайт (точный объем зависит от того, сколько виртуальных машин вы хотите запустить);
  • требуется имитация МАС-адреса, если виртуальные машины, запускаемые внутри другой виртуальной машины, нуждаются в соединении по сети;
  • самое важное, и это является причиной ошибки, заключается в том, что расширения виртуализации должны быть включены в виртуальной машине. В представленном выше сценарии они включаются с помощью
Set-VMProcessor -VMName $vmName
   -ExposeVirtualizationExtensions $true.

Проделав все это, вы сможете запускать виртуальные машины, работающие внутри других виртуальных машин, с Hyper-V 2016, (см. экран 2).

 

Виртуальная машина с Hyper-V 2016, работающая внутри другой виртуальной машины
Экран 2. Виртуальная машина с Hyper-V 2016, работающая внутри другой виртуальной машины

Как можно просмотреть регионы Azure, используя PowerShell в AzureRM?

Мне не удалось найти простую команду, с помощью которой можно просмотреть регионы, но есть способ увидеть регионы, доступные для определенных типов ресурса. Указание виртуальных машин (которые доступны во всех регионах) позволяет просмотреть все Azure-регионы. Ниже приведен пример кода. Обратите внимание, что, если вы хотите проверить все регионы для определенного типа ресурса, замените параметр virtualMachines на тип ресурса, который хотите проверить. Вы можете выполнить проверку через портал, обратившись по адресу: https://azure.microsoft.com/en-us/regions/#services.

$resources = Get-AzureRmResourceProvider
   -ProviderNamespace Microsoft.Compute
                              $resources.ResourceTypes.Where{
                              ($_.ResourceTypeName -eq
                              'virtualMachines')}.Locations
                              East US
                              East US 2
                              West US
                              Central US
                              South Central US
                              North Europe
                              West Europe
                              East Asia
                              Southeast Asia
                              Japan East
                              Japan West
                              North Central US
                              Brazil South

Как мне просмотреть все типы провайдеров ресурсов Resource Providers, которые доступны в Azure?

Менеджер ресурсов Azure Resource Manager содержит несколько провайдеров ресурсов Resource Providers (RP). Каждый из них обеспечивает различные типы ресурса (соответственно имени). Чтобы просмотреть все доступные типы RP, используйте команду:

Get-AzureRmResourceProvider

Чтобы просмотреть подробную информацию о конкретном провайдере ресурсов, введите команду:

Get-AzureRmResourceProvider -ProviderNamespace
   Microsoft.Compute

У Microsoft есть хорошая статья, опубликованная по адресу: https://azure.microsoft.com/en-us/documentation/articles/

resource-manager-supported-services/. В ней рассматривается детальная информация о типах ресурсов, а также приводятся дополнительные сведения о них.

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

Принято передавать информацию в виде параметров, однако можно получить входные данные от пользователя и так:

$name = Read-Host "Who are you?"

Если данные не следует выводить на экран, добавьте ключ -AsSecureString, например:

$pass = Read-Host "What's your password?" -AsSecureString

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

[Runtime.InteropServices.Marshal]:: PtrToStringAuto
   ([Runtime.InteropServices.Marshal]::

Нужно ли мне вручную добавлять исключения при добавлении роли, используя Windows Defender в Windows Server 2016?

Нет. Windows Defender в Windows Server 2016 назначает исключения автоматически, как описано в статье по адресу: https://technet.microsoft.com/en-us/library/dn913616.aspx. Дело в том, что некоторые роли, которые требуют исключений, автоматически включают исключения на брандмауэре, как только роли активируются. Чтобы блокировать автоматическую активацию исключений, используйте такой код:

Set-MpPreference -DisableAutoExclusions $true

Что такое $ConfirmPreference в PowerShell?

Вы могли сталкиваться с тем, что иногда в PowerShell выводится запрос на подтверждение того или иного действия, а иногда нет. Каждая команда имеет уровень воздействия, согласно которому, если он равен или выше, чем $ConfirmPreference, вы получите запрос на подтверждение. Чтобы просмотреть текущее значение $ConfirmPreference, просто откройте переменную, которая должна иметь значение High. Если, например, вы задаете переменной значение Medium, вы получите запрос на подтверждение при остановке процессов, но запроса не будет, если $ConfirmPreference имеет значение по умолчанию High. Обратите внимание, что если вы понизите $ConfirmPreference, то сможете избежать появления запроса на подтверждение посредством добавления ключа -confirm:$false в команде. Кроме того, вы можете настроить переменную $ConfirmPreference на значение None, чтобы никогда не получать запрос на подтверждение.

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

Обычно у объектов есть ряд доступных методов, к которым можно получить доступ с помощью обращения ., то есть $string.ToUpper (). Если вы попытаетесь использовать этот способ в рамках рабочего процесса, то получите сообщение об ошибке, в котором будет сказано, что вызов методов в рабочем процессе не поддерживается. Так происходит потому, что объекты в рабочем процессе десериализированы (то есть преобразованы из последовательной формы в параллельную) и, таким образом, потеряли свои методы. Решение проблемы состоит в том, чтобы выполнять любые методы объекта в рамках блока InlineScript. Приведу пример:

Workflow RestrictionCheck
                 {
                     $msgtest = "Hello"
                     $msgtest = InlineScript {($using:msgtest).ToUpper()}
                     Write-Output $msgtest
                 }
                 RestrictionCheck

Для того чтобы вы могли получить доступ к любым переменным в рамках InlineScript, они должны иметь префикс $using: учитывая, что InlineScript фактически создает отдельный процесс PowerShell, исполняет код и возвращает управление объектам. Именно поэтому, как правило, доступа к объектам в родительском процессе PowerShell не бывает.

Листинг 1. Создание исключений брандмауэра для различных ролей и компонентов Skype for Business Server
import-module netsecurity
                             
                              new-netfirewallrule -name FE_5060_TCP -DisplayName "FE 5060 TCP" -Protocol TCP -localport 5060 -Enabled True
                              -Profile Any -Action Allow
                              new-netfirewallrule -name FE_5061_TCP_TLS -DisplayName "FE 5061 TCP/TLS" -Protocol TCP -localport 5061 -Enabled
                              True -Profile Any -Action Allow
                              new-netfirewallrule -name FE_444_TCP_HTTP_Focus -DisplayName "FE 444 TCP/HTTP Focus" -Protocol TCP -localport 444
                              -Enabled True -Profile Any -Action Allow
                              new-netfirewallrule -name FE_5062_TCP -DisplayName "FE 5062 TCP" -Protocol TCP -localport 5062 -Enabled True -Profile Any
                              -Action Allow
                              new-netfirewallrule -name FE_8057_TCP_TLS -DisplayName "FE 8057 TCP/TLS" -Protocol TCP -localport 8057 -Enabled True
                              -Profile Any -Action Allow
                              new-netfirewallrule -name FE_8058_TCP_TKS -DisplayName "FE 8058 TCP/TKS" -Protocol TCP -localport 8058 -Enabled True
                              -Profile Any -Action Allow
                              new-netfirewallrule -name FE_5063_TCP_AV -DisplayName "FE 5063 TCP AV" -Protocol TCP -localport 5063 -Enabled True -Profile
                              Any -Action Allow
                              new-netfirewallrule -name FE_57501-65535_TCP_AV_Conf -DisplayName "FE 57501-65535 TCP AV Conf" -Protocol TCP
                              -localport 57501-65535 -Enabled True -Profile Any -Action Allow
                              new-netfirewallrule -name FE_57501-65535_UDP_AV_Conf -DisplayName "FE 57501-65535 UDP AV Conf" -Protocol UDP
                              -localport 57501-65535 -Enabled True -Profile Any -Action Allow
                              new-netfirewallrule -name FE_80_HTTP -DisplayName "FE 80 HTTP" -Protocol TCP -localport 80 -Enabled True -Profile Any
                              -Action Allow
                              new-netfirewallrule -name FE_4443_HTTPS -DisplayName "FE 4443 HTTPS" -Protocol TCP -localport 4443 -Enabled True -Profile
                              Any -Action Allow

                              new-netfirewallrule -name FE_8060_TCP_MTLS -DisplayName "FE 8060 TCP (MTLS)" -Protocol TCP -localport 8060 -Enabled True
                              -Profile Any -Action Allow
                              new-netfirewallrule -name FE_8061_TCP_MTLS -DisplayName "FE 8061 TCP (MTLS)" -Protocol TCP -localport 8061 -Enabled True
                              -Profile Any -Action Allow
                              new-netfirewallrule -name FE_5086_TCP_MTLS -DisplayName "FE 5086 TCP (MTLS)" -Protocol TCP -localport 5086 -Enabled True
                              -Profile Any -Action Allow
                              new-netfirewallrule -name FE_5087_TCP_MTLS -DisplayName "FE 5087 TCP (MTLS)" -Protocol TCP -localport 5087 -Enabled True
                              -Profile Any -Action Allow
                              new-netfirewallrule -name FE_443_HTTPS -DisplayName "FE 443 HTTPS" -Protocol TCP -localport 443 -Enabled True -Profile Any
                              -Action Allow
                              new-netfirewallrule -name FE_5064_TCP_SIP_Conference -DisplayName "FE 5064 TCP SIP Conference" -Protocol TCP -localport
                              5064 -Enabled True -Profile Any -Action Allow
                              new-netfirewallrule -name FE_5072_TCP_SIP_Attendant -DisplayName "FE 5072 TCP SIP Attendant" -Protocol TCP -localport 5072
                              -Enabled True -Profile Any -Action Allow
                              new-netfirewallrule -name FE_5070_TCP_Mediation -DisplayName "FE 5070 TCP Mediation" -Protocol TCP -localport 5070 -Enabled
                              True -Profile Any -Action Allow
                              new-netfirewallrule -name FE_5067_TCP_TLS_PSTN -DisplayName "FE 5067 TCP/TLS PSTN" -Protocol TCP -localport 5067
                              -Enabled True -Profile Any -Action Allow
                              new-netfirewallrule -name FE_5068_TCP_PSTN -DisplayName "FE 5068 TCP PSTN" -Protocol TCP -localport 5068 -Enabled True
                              -Profile Any -Action Allow
                              new-netfirewallrule -name FE_5081_TCP_SIP_Out -DisplayName "FE 5081 TCP SIP Out" -Protocol TCP -localport 5081
                              -Enabled True -Profile Any -Action Allow
                              new-netfirewallrule -name FE_5082_TCP_TLS_SIP_Out -DisplayName "FE 5082 TCP/TLS SIP Out" -Protocol TCP -localport 5082
                              -Enabled True -Profile Any -Action Allow
                              new-netfirewallrule -name FE_5065_TCP_SIP_App_Sharing -DisplayName "FE 5065 TCP SIP App Sharing" -Protocol TCP -localport
                              5064 -Enabled True -Profile Any -Action Allow
                              new-netfirewallrule -name All_49152-65535_TCP_App_Sharing -DisplayName "All 49152-65535 TCP App Sharing" -Protocol TCP
                              -localport 49152-65535 -Enabled True -Profile Any -Action Allow
                              new-netfirewallrule -name All_49152-65535_UDP_App_Sharing -DisplayName "All 49152-65535 UDP App Sharing" -Protocol UDP
                              -localport 49152-65535 -Enabled True -Profile Any -Action Allow
                              new-netfirewallrule -name FE_5073_TCP_Conf_Announcement -DisplayName "FE 5073 TCP Conf Announcement" -Protocol TCP
                              -localport 5073 -Enabled True -Profile Any -Action Allow
                              new-netfirewallrule -name FE_5075_TCP_SIP_Call_Park -DisplayName "FE 5075 TCP SIP Call Park" -Protocol TCP -localport 5075
                              -Enabled True -Profile Any -Action Allow
                              new-netfirewallrule -name FE_5076_TCP_SIP_Audio_Test -DisplayName "FE 5076 TCP SIP Audio Test" -Protocol TCP -localport
                              5076 -Enabled True -Profile Any -Action Allow
                              new-netfirewallrule -name FE_5066_TCP_E911 -DisplayName "FE 5066 TCP E911" -Protocol TCP -localport 5066 -Enabled True
                              -Profile Any -Action Allow
                              new-netfirewallrule -name FE_5071_TCP_Response_Group -DisplayName "FE 5071 TCP Response Group" -Protocol TCP -localport
                              5071 -Enabled True -Profile Any -Action Allow
                              new-netfirewallrule -name FE_8404_TCP_MTLS_Response_Group -DisplayName "FE 8404 TCP (MTLS) Response Group" -Protocol
                              TCP -localport 8404 -Enabled True -Profile Any -Action Allow
                              new-netfirewallrule -name FE_5080_TCP_AV_Edge_TURN -DisplayName "FE 5080 TCP AV Edge TURN" -Protocol TCP -localport
                              5080 -Enabled True -Profile Any -Action Allow
                              new-netfirewallrule -name FE_448_TCP_Call_Admission_Control -DisplayName "FE 448 TCP Call Admission Control" -Protocol TCP
                              -localport 448 -Enabled True -Profile Any -Action Allow
                              new-netfirewallrule -name FE_445_TCP_Config_Central_Management_Store -DisplayName "FE 445 TCP Config
                              Central Management Store" -Protocol TCP -localport 445 -Enabled True -Profile Any -Action Allow
                              # All Internal Servers
                              new-netfirewallrule -name All_49152-57500_TCP_Media_Audio_Conferencing -DisplayName "All 49152-57500 TCP Media Audio
                              Conferencing" -Protocol TCP -localport 49152-57500 -Enabled True -Profile Any -Action Allow
                              new-netfirewallrule -name All_49152-57500_UDP_Media_Audio_Conferencing -DisplayName "All 49152-57500 UDP Media Audio
                              Conferencing" -Protocol UDP -localport 49152-57500 -Enabled True -Profile Any -Action Allow
                             
                              # Office Web Apps Server
                              new-netfirewallrule -name OWA_443 -DisplayName "OWA 443" -Protocol TCP -localport 443 -Enabled True -Profile Any -Action Allow
                              # Director
                              new-netfirewallrule -name Dir FE_5060_TCP_RCC_Routing -DisplayName "Dir FE_5060 TCP RCC Routing" -Protocol TCP -localport
                              5060 -Enabled True -Profile Any -Action Allow
                              new-netfirewallrule -name Dir FE_444_HTTPS_TCP -DisplayName "Dir FE_444 HTTPS/TCP" -Protocol TCP -localport 444 -Enabled
                              True -Profile Any -Action Allow
                              new-netfirewallrule -name Dir 80_TCP -DisplayName "Dir 80 TCP" -Protocol TCP -localport 80 -Enabled True -Profile Any -Action Allow
                              new-netfirewallrule -name Dir 443_HTTPS -DisplayName "Dir 443 HTTPS" -Protocol TCP -localport 443 -Enabled True -Profile Any
                              -Action Allow
                              new-netfirewallrule -name Dir 5061_TCP -DisplayName "Dir 5061 TCP" -Protocol TCP -localport 5061 -Enabled True -Profile Any
                              -Action Allow
                              # Mediation Server
                              new-netfirewallrule -name Med_5070_TCP_Med->FE -DisplayName "Med 5070 TCP Med->FE" -Protocol TCP -localport 5070
                              -Enabled True -Profile Any -Action Allow
                              new-netfirewallrule -name Med_5067_TCP_TLS_SIP --> PSTN -DisplayName "Med 5067 TCP/TLS SIP --> PSTN" -Protocol TCP
                              -localport 5067 -Enabled True -Profile Any -Action Allow
                              new-netfirewallrule -name Med_5068_TCP_SIP --> PSTN -DisplayName "Med 5068 TCP SIP --> PSTN" -Protocol TCP -localport
                              5068 -Enabled True -Profile Any -Action Allow
                              new-netfirewallrule -name Med_5070_TCP_MTLS_SIP --> FE_-DisplayName "Med 5070 TCP (MTLS) SIP --> FE" -Protocol TCP
                              -localport 5070 -Enabled True -Profile Any -Action Allow
                              #PChat
                              new-netfirewallrule -name PChat 5041_TCP_MTLS_SIP -DisplayName "PChat 5041 TCP (MTLS) SIP" -Protocol TCP -localport 5041
                              -Enabled True -Profile Any -Action Allow
                              new-netfirewallrule -name PChat 881_TCP_TLS_and_TCP_MTLS_WCF -DisplayName "PChat 881 TCP (TLS) and TCP (MTLS) WCF"
                              -Protocol TCP -localport 881 -Enabled True -Profile Any -Action Allow
                              new-netfirewallrule -name PChat 443_TCP_TLS -DisplayName "PChat 443 TCP (TLS)" -Protocol TCP -localport 443 -Enabled True
                              -Profile Any -Action Allow
                             
                              #Edge
                              new-netfirewallrule -name EDGE_TCP_443 -DisplayName "Edge 443 TCP" -Protocol TCP -localport 443 -Enabled True -Profile Any
                              -Action Allow
                              new-netfirewallrule -name EDGE_UDP_3478 -DisplayName "Edge 3478 UDP A/V Service" -Protocol UDP -localport 3478 -Enabled
                              True -Profile Any -Action Allow
                              new-netfirewallrule -name EDGE_50000-59999_TCP -DisplayName "Edge 50,000-59,999 TCP AV Svc" -Protocol TCP -localport
                              50000-59999 -Enabled True -Profile Any -Action Allow
Листинг 2. Изменение фона окна командной строки при работе с повышенными привилегиями
#Set-Location c:\
             $shell = $Host.UI.RawUI
            
             if((whoami /all | Select-String S-1-16-12288) -ne $null) #if admin
             {
                     $shell.WindowTitle="John's Admin PowerShell"
                     $shell.BackgroundColor = "DarkRed"
                     $shell.ForegroundColor = "White"
                     #Set the prompt to say admin
                     function prompt
                     {
                             $(if (test-path variable:/PSDebugContext) { '[DBG]: ' }
                             else { "ADMIN PS [$env:COMPUTERNAME] " }) +
                             $(Get-Location) `
                             + $(if ($nestedpromptlevel -ge 1) { '>>' }) + '> '
                     }
             }
             else #not admin
             {
                     $shell.WindowTitle="John's PowerShell"
                     $shell.BackgroundColor = "Black"
                     $shell.ForegroundColor = "White"
             }
                          #Import-Module ....
             New-Item alias:np -value c:\windows\system32\notepad.exe
             Clear-Host