Глава 4. Применение PowerShell 7 в вашей корпорации

В этой главе мы рассмотрим следующие рецепты:

  • Установку инструментов RSAT в Windows Server

  • Исследование управления пакетами

  • Исследование PowerShellGet и Галереи PS

  • СОздание локального репозитория PowerShell

  • Установление подписанного сеанса сценария

  • Работу с закладками и модуль PSShortcut

  • Работу с архивированными файлами

Введение

Для многих пользователей PowerShell и те команды, которые поставляются с Windows Server и клиентом Windows, вполне достаточны. Однако в более крупных организациях требуются дополнительные моменты для управления инфраструктурой ИТ вашей организации. Они включают инструменты, которые способны упрощать ваши задания.

Вам требуется создать некую среду, в которой вы сможете применять PowerShell для приведения в исполнение вашего администрирования. Такая среда гарантирует вам под рукой все необходимые инструменты и обеспечивает безопасность вашей среды на максимально возможном уровне. Существуют также методы и инструменты, которые облегчают жизнь администратора в ещё более крупной организации. И, конечно же, эти инструменты могут быть полезными каждому ИТ- специалисту.

Для управления ролями и свойствами Windows, а также управления самим Windows при помощи PowerShell вы можете применять модули команд PowerShell. Вы можете управлять большинством свойств Windows при помощи PowerShell, применяя те инструменты, которые поставляются с самой этой функциональной возможностью. Вы можете устанавливать такие инструменты совместно с самим свойством - устанавливая модуль ActiveDirectory при установке в вашей системе Active Directory.

Вы также можете устанавливать такие инструменты управления отдельно и управлять свойствами удалённо. RSAT (Remote Server Administration Tools, Инструменты удалённого администрирования сервером) позволяют вам управлять ролями и свойствами Windows. В рецепте Устанавливаем инструменты RSAT в Windows Server вы получите сведения относительно самих инструментов RSAT и того как их устанавливать в Windows Server.

Хотя инструменты RSAT и и обеспечивают отличную функциональность, они не позволяют вам выполнять всё, что вы бы могли пожелать. Для заполнения таких пробелов сообщество PowerShell создало большое число сторонних модулей/ команд, которые вы можете применять для расширения предоставляемых Microsoft модулей. Чтобы справляться с ними, вам потребуется управление пакетами, которое вы изучите в Изучаем управление пакетами. В рецепте Изучаем PowerShellGet и PS Gallery вы взглянете на один из источников модулей и исследуете как находить и применять модули, содержащиеся в Галерее PS.

PowerShell позволяет вам применять технологии цифровой подписи для подписи сценария и гарантии того, что ваши пользователи будут применять только подписанные сценарии. В Устанавливаем среду подписанных сценариев вы изучите как подписывать сценарии и применять сценарии с цифровой подписью.

Для того чтобы вы могли подписывать как приложения, так и сценарии PowerShell PowerShell применяет технологию Microsoft Authenticode. Собственно подпись это криптографический хэш соответствующих исполняемого файла или сценария, основанный на сертификате кода подписи X.509. Основным ключевым преимуществом является то, что подпись предоставляет криптографическое доказательство того, что подписанный исполняемый файл или сценарий не изменялись с момента их подписания. Кроме того, вы можете применять такую цифровую подпись для предоставления невозможности отказа от авторства (non-repudiation) - то есть, лишь та персона, которая была способна подписать данный файл будет той единственной персоной, которая обладает таким частным ключом подписи сертификата.

В Работаем с закладками и модулем PSShortcut вы изучите как создавать закладки (ярлыки) и управлять ими. Некая закладка (ярлык), это файл, который указывает на другой файл. Вы можете обладать неким файлом ссылки (в расширением .LNK), который предоставляет некий ярлык на исполняемую программу. Вы можете разместить закладку на VS Code или PowerShell на своём рабочем столе. Второй тип ярлыков, закладки URL это файл (с расширением .URL). Вы можете помещать на рабочем столе закладку, которая будет указывать на определённый вебсайт. Для установления ярлыка ссылки вы можете применять объект COM Wscript.Shell. Вы также можете пользоваться модулем PSShortcut для создания, обнаружения и управления обоими типами ярлыков.

Некий архив это файл, который содержит прочие, обычно сжатые, файлы и папки. Вы запросто можете создавать новые файлы архивов и расширять уже имеющиеся. Архивы очень полезны, как для содержания в них большого числа документов, так и для их сжатия. Вы можете собирать вместе в пакет документы, сценарии и графические файлы в виде единого архива. Вы также можете применять сжатие для передачи файлов журналов - текстовый файл журнала в 100 МБ может быть сжат менее чем до 3-4 МБ, что позволяет вам отправлять такие файлы журналов электронной почтой. В Работаем с файлами архивов вы создадите и примените файлы архивов.

Устанавливаем инструменты RSAT в Windows Server

Инструменты RSAT основополагающие для администрирования ролей и свойств, которые вы можете устанавливать в Windwos Server. Всякая функциональная возможность в Windows Server может опционально обладать инструментами управления, причём так обстоят дела для большинства из них. Эти инструменты могут включать в себя командлеты PowerShell, функции и псевдонимы, а также GUI файлы MMC (Microsoft Management Console, Консоли управления Microsoft. Некоторые функциональные возможности также обладают более ранними консольными приложениями Win32. В большинстве случаев вам не нужны консольные приложения, ибо вы можете применять командлеты, но это не всегда так. У вас могут иметься более старые сценарии, которые применяют такие консольные приложения.

Вы также можете устанавливать в Windows Server инструменты RSAT независимо от функциональных возможностей Windows Server. Данный рецепт охватывает установку инструментов RSAT в Windows Server 2022.

Вы также можете устанавливать инструменты RSAT в Windows 10 и выполнять удалённое администрирование своими серверами. Сам конкретный метод установки инструментов RSAT разнится в зависимости от конкретной применяемой вами версии Windows. Для более ранних версий Windows вы можете выгружать эти инструменты отсюда: https://www.microsoft.com/download/details.aspx?id=45520. {https://www.microsoft.com/ru-ru/download/details.aspx?id=45520}

В более поздних редакциях Windows 10, начиная с октябрьского обновления Windows 10 {1809}, вы устанавливаете инструменты RSAT при помощи механизма "Features on Demand" (Компоненты по запросу) внутри Windows 10. Ссылка URL из предыдущего параграфа снабдит вас полными подробностями относительно того как устанавливать инструменты RSAT в Windows 10.

Подготовка

Вы выполняете этот рецепт в SRV1, в котором вы установили PowerShell 7 и VS Code. SRV1 является сервером рабочей группы, запущенным с Windows Server 2022 Datacenter Edition.

Как это сделать...

  1. Отображаем количество доступных команд PowerShell

    
    $CommandsBeforeRSAT = Get-Command
    $CmdletsBeforeRSAT = $CommandsBeforeRSAT  |
        Where-Object CommandType -eq 'Cmdlet'
    $CommandCountBeforeRSAT = $CommandsBeforeRSAT.Count
    $CmdletCountBeforeRSAT  = $CmdletsBeforeRSAT.Count
    "On Host: [$(hostname)]"
    "Total Commands available before RSAT installed [$CommandCountBeforeRSAT]"
    "Cmdlets available before RSAT installed [$CmdletCountBeforeRSAT]"
    		
  2. Получаем типы команд, возвращаемых Get-Command

    
    $CommandsBeforeRSAT | 
      Group-Object -Property CommandType
    		
  3. Проверяем подробности типа полученного объекта

    
    $CommandsBeforeRSAT | 
      Get-Member |
        Select-Object -ExpandProperty TypeName -Unique
    		
  4. Получаем имеющуюся коллекцию модулей PowerShell и количество модулей до добавления инструментов RSAT

    
    $ModulesBefore = Get-Module -ListAvailable
    		
  5. Отображаем количество модулей до добавления инструментов RSAT

    
    $CountOfModulesBeforeRSAT = $ModulesBefore.Count
    "$CountOfModulesBeforeRSAT modules available"
    		
  6. Получаем количество доступных в SRV1 компонентов (свойств)

    
    Import-Module -Name ServerManager -WarningAction SilentlyContinue
    $Features  = Get-WindowsFeature 
    $FeaturesI = $Features | Where-Object Installed
    $RsatF     = $Features |
                   Where-Object Name -Match 'RSAT'
    $RSATFI    = $RSATF | 
                  Where-Object Installed
    		
  7. Отображаем количество установленных компонентов

    
    "On Host [$(hostname)]"
    "Total features available      [{0}]"  -f $Features.count
    "Total features installed      [{0}]"  -f $FeaturesI.count
    "Total RSAT features available [{0}]"  -f $RSATF.count
    "Total RSAT features installed [{0}]"  -f $RSATFI.count
    		
  8. Добавляем все инструменты RSAT в SRV1

    
    Get-WindowsFeature -Name *RSAT* | 
      Install-WindowsFeature
    		
  9. Перезапускаем SRV1

    
    Restart-Computer -Force
    		
  10. Получаем подробности об установленных в SRV1 инструментах RSAT

    
    $FSRV1A   = Get-WindowsFeature
    $IFSRV1A  = $FSRV1A | Where-Object Installed
    $RSFSRV1A = $FSRV1A | Where-Object Installed | 
                  Where-Object Name -Match 'RSAT'
    		
  11. Отображаем количество команд после установки инструментов RSAT

    
    "After Installation of RSAT tools on SRV1"
    "$($IFSRV1A.count) features installed on SRV1"
    "$($RSFSRV1A.count) RSAT features installed on SRV1"
    		
  12. Отображаем инструменты RSAT в SRV1

    
    $MODS = "$env:windir\system32\windowspowerShell\v1.0\modules"
    $SMMOD = "$MODS\ServerManager"
    Update-FormatData -PrependPath "$SMMOD\*.format.ps1xml"
    Get-WindowsFeature |
      Where-Object Name -Match 'RSAT'
    		

Как это работает...

На Шаге 1 для получения всех команд внутри всех модулей в SRV1 мы пользуемся командой Get-Command. Этот шаг затем отображает счётчик общего числа доступных в SRV1 команд и того сколько реальных командлетов имеется в SRV1 перед установкой инструментов RSAT. Получаемый на этом этапе вывод выглядит примерно так:

 

Рисунок 4-01


Отображаем счётчик доступных в PowerShell команд

На Шаге 2 мы отображаем счётчик типа команд доступных до сих пор в SRV1, что выглядит так:

 

Рисунок 4-02


Отображаем типы команд, возвращаемых Get-Command

В powerShell, когда вы применяете Get-Command, этот командлет для описания различных типов команд возвращает различные типы объектов. Как вы можете наблюдать из предыдущего этапа, имеется три различных типа команд, которые PowerShell возвращает в различных классах объектов. На Шаге 3 вы можете видеть названия соответствующих классов для этих трёх типов команд, что отображено ниже:SRV1

 

Рисунок 4-03


Проверяем подробности полученного типа объекта

На Шаге 4, который не производит вывод, вы получаете все типы доступных в SRV1 модулей. На Шаге 5 вы отображаете счётчик общег числа доступных модулей (79), что выглядит как-то так:

 

Рисунок 4-04


Отображаем счётчик доступных модулей

На Шаге 6 вы получаете счётчики доступных компонентов и установленных компонентов, а также общее число доступных и установленных функциональных возможностей RSAT. Этот этап не вырабатывает вывод.

На Шаге 7 вы отображаете значения полученных на Шаге 6 счётчиков, что отображается следующим образом:

 

Рисунок 4-05


Отображаем счётчики установленных компонентов

На Шаге 8 вы получаете все компоненты RSAT и устанавливаете их в Windows Server. Этот процесс потребует некоторого времени и выработает вывод, подобный такому:

 

Рисунок 4-06


Добавляем все инструменты RSAT

Установка этих инструментов потребует перезапуска, как вы могли заметить на нашем предыдущем снимке экрана. Таким образом, на Шаге 9 мы перезапускаем свою систему. После такого перезапуска для продолжения вы регистрируетесь в SRV1 в качестве администратора.

Теперь, когда вы добавили все относящиеся к RSAT компоненты Windows, вы можете получить подробности о том что вы установили. На Шаге 10, который не производит вывод, вы получаете подробности только что установленных компонентов и числа команд, которые они содержат. На Шаге 11 вы отображаете счётчик не доступных в SRV1 компонентов RSAT, что выглядит так:

 

Рисунок 4-07


Отображаем счётчики команд после установки инструментов RSAT

На Шаге 12 вы отображаете те компоненты RSAT, которые вы установили на более раннем шаге. Вывод этого шага приводится ниже:

 

Рисунок 4-08


Отображаем установленные компоненты RSAT

Есть кое- что ещё...

Вывод на Шаге 1 показывает что, перед добавлением инструментов RSAT, доступными в SRV1в сумме имеются 1 829 команд и 594 командлета на основе модулей. Значение получаемого числа может отличаться в зависимости от того какие дополнительные инструменты, компоненты или приложения вы могли добавлять в SRV1 или в саму версию Windows Server.

На Шаге 2 и на Шаге 3 вы находите виды доступных команд и название типа их объектов, которые PowerShell применяет для описания этих различных типов команд. Когда вы получили значения названий классов, вы можете воспользоваться предпочитаемым вами механизмом поиска для выявления дополнительных подробностей относительно этих типов команд.

Изучаем управление пакетами

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

Для работы с различными системами управления пакетами вы можете применять командлеты в пакете PackageManagement.

Этот модуль, по существу. Это некий API для поставщиков управления пакетами, такими как PowerShellGet, обсуждается в нашем рецепте Изучаем PowerShellGet и PS Gallery. Самая первейшая функция этого модуля PackageManagement состоит в управлении определёнными репозиториями наборов программного обеспечения, в которых инструменты управления пакетами способны выполнять поиск, получать, устанавливать и удалять пакеты. Этот модуль позволяет вам выявлять и применять пакеты программного обеспечения из различных источников. Имеющиеся в такой галерее модули отличаются по качеству. Некоторые из них исключительны и интенсивно применяются всем сообществом, в то время как прочие менее полезны или обладают меньшим качеством. Будьте уверены что вы тщательно рассмотрели модули сторонних производителей для помещения их в промышленную среду.

Данный модуль исследует модуль PackageManagement в сервере SRV1.

Подготовка

Вы выполняете этот рецепт в SRV1, в котором вы установили PowerShell 7 и VS Code. SRV1 является сервером рабочей группы, запущенным с Windows Server Datacenter Edition.

Как это сделать...

  1. Просмотрим командлеты в модуле PackageManagement

    
    Get-Command -Module PackageManagement
    		
  2. Просмотрим при помощи Get-PackageProvider установленных поставщиков

    
    Get-PackageProvider | 
      Format-Table -Property Name, 
                             Version, 
                             SupportedFileExtensions,
                             FromTrustedSource
    		
  3. Исследуем доступных поставщиков пакетов

    
    $PROVIDERS = Find-PackageProvider
    $PROVIDERS |
        Select-Object -Property Name,Summary |
          Format-Table -AutoSize -Wrap
    		
  4. Выявляем и подсчитываем доступные пакеты

    
    $PAGKAGES = Find-Package
    "Discovered {0:N0} packages" -f $PACKAGES.Count
    		
  5. Отображаем первые пять выявленных пакетов

    
    $PAGKAGES  |
        Select-Object -First 5 |
          Format-Table -AutoSize -Wrap
    		
  6. Устанавливаем поставщика Chocolatier

    
    Install-PackageProvider -Name Chocolatier -Force
    		
  7. Убедимся что Chocolatier появился в списке установленных поставщиков

    
    Get-PackageProvider |
      Select-Object -Property Name,Version
    		
  8. Выявим пакеты из Chocolatier

    
    $Start = Get-Date
    $CPackages = Find-Package -ProviderName Chocolatier -Name *
    "$($CPackages.Count) packages available from Chocolatey"
    $End = Get-Date
    		
  9. Отобразим как долго выполнялся поиск пакетов у поставщика Chocolatier

    
    $Elapsed = $End - $Start
    "Took {0:n3} seconds" -f $Elapsed.TotalSeconds
    		

Как это работает...

На Шаге 1 вы применяете Get-Command для просмотра производимых PackageManagement команд, что выглядит примерно так:

 

Рисунок 4-09


Просматриваем команды, предоставляемые модулем PackageManagement

На Шаге 2 вы пользуетесь командлетом Get-PackageProvider для выявления установленных поставщиков, что выглядит следующим образом:

 

Рисунок 4-10


Просмотр установленных поставщиков пакетов

На Шаге 3 вы используете Find-PackageProvider для выявления всех прочих поставщиков, которых вы можете применять. Её вывод отображается так:

 

Рисунок 4-11


Просмотр доступных поставщиков пакетов

На Шаге 4 вы выявляете и подсчитываете те пакеты, которые вы можете найти с помощью Find-Package со следующим выводом:

 

Рисунок 4-12


Выявление и подсчёт доступных пакетов

Чтобы проиллюстрировать некоторые из тех пакетов, которые мы только что выявили, на Шаге 5 вы просматриваете самые первые пять пакетов, которые отображаются так:

 

Рисунок 4-13


Просмотр самых первых пяти выявленных пакетов

На Шаге 6 вы устанавливаете поставщика пакетов Chocolatier, который снабдит вас через управление пакетами его репозиторием Chocolatey. Chocolatey это репозиторий сторонних приложений, хотя и не напрямую, но поддерживаемый Microsoft. Для дополнительных сведений относительно репозитория Chocolatey обращайтесь к https://chocolatey.org/.

На Шаге 7 вы пересматриваете тех поставщиков, которые теперь доступны в SRV1, чтобы убедиться что в них включён Chocolatier, что выглядит теперь так:

 

Рисунок 4-14


Убеждаемся что Chocolatier установлен

На Шаге 8 вы выявляете те пакеты, которые доступны через поставщика Chocolatier и отображаете счётчик пакетов. На этом шаге вы также фиксируете дату и время между началом и концом поиска пакетов. Вывод с данного этапа выглядит так:

 

Рисунок 4-15


Выявление пакета Chocolatier

На Шаге 9 вы отображаете то время, которое потребовалось для поиска пакетов в Chocolatier, который отображается следующим образом:

 

Рисунок 4-16


Отображение времени, которое занял поиск пакетов в Chocolatier

Есть кое- что ещё...

На Шаге 4 вы получаете список пакетов (и отображаете счётчик обнаруженных пакетов) и затем, на Шаге 5, отображаете первые пять. Те пакеты, которые вы наблюдаете на этом шаге, скорее всего изменятся - все репозитории пакетов в состоянии почти постоянного изменения. Когда вы ищите пакеты, окажется полезным подход, предлагаемый на этих двух шагах. Вы выгружаете весь список пакетов, которые хранятся локально. Затем мы дополнительно исследуем о существующих пакетах не тратя слишком много времени для выемки полного списка пакетов с любого выбранного репозитория. Позднее, на Шаге 9, вы отображаете сколько времени потребовалось для получения списка пакетов с Chocolatey. В вашей среде это время может отличаться от показанного здесь, однако это иллюстрирует полезность получения перечня пакетов прежде чем погружаться в поиски.

На Шаге 6 вы устанавливаете другого поставщика пакетов, Chocolatier. Этот поставщик предоставляет вам доступ через имеющиеся команды управления пакетами к репозиторию Chocolatey. Chocolatey снабжает вас доступом к общим приложениям платформ подобно apt-get в Linux (но для Windows). Как всегда, будьте внимательны при получении приложений или компонентов приложений из репозиториев сторонних разработчиков, поскольку ваши производители и партнёры могут не предоставлять полную поддержку в случае некого инцидента.

На Шаге 9 вы просматриваете насколько долго продолжалось выявление пакетов из одного репозитория. Этот шаг отображает длительность затраченного времени и это время может меняться. Обратите внимание, что когда вы самый первый раз исполняете это шаг, его код выдаёт приглашение на установку choco.exe.

Изучаем PowerShellGet и PS Gallery

В идеальном мире PowerShell будет поставляться с командами, которые выполняет любое действие, которое может потребоваться любому ИТ специалисту или которое он может пожелать. Но, как говорит Джеффри Сновер (изобретатель PowerShell): "Снабжать - то же самое что выбирать". А это означает, что в самой PowerShell, а также в некоторых компонентах Windows, могут иметься не все необходимые команды. И здесь на помощь приходит сообщество PowerShell.

С тех пор, как была выпущена V1 (а возможно и ранее!) члены сообщества предоставляли надстройки. Некоторые попытки любезными, не совсем оптимальными, но это всё же лучше чем ничего. По мере роста PowerShell и сообщества росло и качество этих надстроек.

Подготовка

Вы выполняете этот рецепт в SRV1, в котором вы установили PowerShell 7 и VS Code. SRV1 является сервером рабочей группы, запущенным с Windows Server Datacenter Edition.

Как это сделать...

  1. Просматриваем те команды, которые доступны в модуле PowerShellGet

    
    Get-Command -Module PowerShellGet
    		
  2. Выявляем командлеты Find-* в модуле PowerShellGet

    
    Get-Command -Module PowerShellGet -Verb Find
    		
  3. Получаем все команды, модули, ресурсы DSC и сценарии

    
    $COM = Find-Command
    $MOD = Find-Module
    $DSC = Find-DscResource
    $SCR = Find-Script
    		
  4. Выдаём отчёт о результатах

    
    "On Host [$(hostname)]"
    "Commands found:          [{0:N0}]"  -f $COM.count
    "Modules found:           [{0:N0}]"  -f $MOD.count
    "DSC Resources found:     [{0:N0}]"  -f $DSC.count
    "Scripts found:           [{0:N0}]"  -f $SCR.count
    		
  5. Выявляем относящиеся к NTFS модули

    
    $MOD | 
      Where-Object Name -match NTFS
    		
  6. Устанавливаем модуль NTFSSecurity

    
    Install-Module -Name NTFSSecurity -Force
    		
  7. Просматриваем команды модуля

    
    Get-Command -Module NTFSSecurity
    		
  8. Проверяем командлет Get-NTFSAccess

    
    Get-NTFSAccess -Path C:\Foo
    		
  9. Создаём папку выгрузки

    
    $DLFLDR = 'C:\Foo\DownloadedModules'
    $NIHT = @{
      ItemType    = 'Directory'
      Path        = $DLFLDR
      ErrorAction = 'SilentlyContinue'
    }
    New-Item @NIHT | Out-Null
    		
  10. Выгружаем модуль CountriesPS

    
    Save-Module -Name CountriesPS -Path $DLFLDR
    		
  11. Проверяем выгруженный модуль

    
    Get-ChildItem -Path $DLFLDR -Recurse |
      Format-Table -Property Fullname
    		
  12. Импортируйте модуль CountriesPS

    
    $ModuleFolder = "$DLFLDR\CountriesPS"
    Get-ChildItem -Path $ModuleFolder -Filter *.psm1 -Recurse |
        Select-Object -ExpandProperty FullName -First 1 |
            Import-Module -Verbose
    		
  13. Проверка команд в этом модуле

    
    Get-Command -Module CountriesPS
    		
  14. Применяем команду Get-Country

    
    Get-Country -Name 'United Kingdom'
    		

Как это работает...

На Шаге 1 вы исследуете команды внутри модуля PowerShellGet, что выглядит так:

 

Рисунок 4-17


Просмотр команд PowerShellGet

На Шаге 2 вы обнаруживаете в модуле PowerShellGet, которые позволяют вам выполнять поиск ресурсов. Естественно, они применяют глагол Find. Вывод на этом этапе выглядит подобно следующему:

 

Рисунок 4-18


Поиск команд Find в модуле PowerShellGet

На Шаге 3 вы применяете несколько команд Find-* для поиска ключевых ресурсов в Галерее PowerShell, которые не производят вывода. На Шаге 4 вы просматриваете счётчик для каждого типа ресурсов:

 

Рисунок 4-19


Отображение счётчика типов ресурсов

На Шаге 5 вы используете возвращаемый список модулей для выявления относящихся к NTFS модулей, подобно таким:

 

Рисунок 4-20


Отображение относящихся к NTFS модулей

На Шаге 6 вы устанавливаете модуль NTFSSecurity, что не приводит к выводу. На Шаге 7 вы просматриваете команды в модуле NTFSSecurity, что производит следующий вывод:

 

Рисунок 4-21


Просмотр команд модуля NTFSSecurity

При подготовке к выгрузке другого модуля, на Шаге 9 вы создаёте новую папку для сохранения соответствующего выгружаемого модуля. На Шаге 10 вы выгружаете модуль CountriesPS. Ни один из этих шагов не вырабатывает вывод.

На Шаге 11 вы исследуете те файлы, которые составляют это модуль, что выглядит так:

 

Рисунок 4-22


Исследование файлов модуля CountriesPS

На Шаге 12 вы находите модуль CountriesPS и импортируете его. Благодаря переключателю -Verbose, Import-Module производит дополнительный вывод, который вы можете наблюдать здесь:

 

Рисунок 4-23


Импорт модуля CountriesPS с переключателем -Verbose

На Шаге 13 вы пользуетесь командой Get-Command для проверки команд, доступных в модуле CountriesPS, что выглядит так:

 

Рисунок 4-24


Проверка команд в модуле CountriesPS

На окончательном шаге данного рецепта, Шаге 14, вы пользуетесь командой Get-Country для возврата подробностей страны для United Kingdom, что отображается ниже:

 

Рисунок 4-25


Применение команды Get-Country для United Kingdom

Есть кое- что ещё...

На Шаге 2 вы обнаруживаете команды внутри модуля PowerShellGet, который позволяет вам находить ресурсы в Галерее PS. Существует пять типов поддерживаемых ресурсов:

  • Command: Это индивидуальные команды внутри данной галереи. Применение команды Find-Command может быть полезным в помощи выявления названия того модуля, который может содержать некую команду.

  • Module: Это модули PowerShell; некоторые могут не работать в PowerShell 7.

  • Ресурс DSC: Это DSC ресурс Windows PowerShell. PowerShell 7 не предоставляет богатства функций и свойств DSC, доступное в Windows PowerShell.

  • Script: Это индивидуальный сценарий PowerShell.

  • Возможность Role: Это предназначалось для пакетов, расширяющих роли Windows, но не применяется.

На Шаге 3 и на Шаге 4 вы выявляете число команд, модулей, ресурсов DSC и сценариев, доступных в галерее. Поскольку присутствует активность, значение числа ресурсов PowerShell, которое вы выявите, скорее всего будет отличаться от того, что вы наблюдаете в этой книге.

На Шаге 5 вы выполняете поиск в Галерее PS модулей, которые содержат строку "NTFS". Вы также можете применять в PowerShell командлет Find-Command для просмотра конкретных команд, которые могут содержать символы "NTFS".

На Шагах с 6 по 8, вы пользуетесь модулем NTFSSecurity из галереи PowerShell. Этот модуль, который вы позднее будете применять позднее в главах этой книги, позволяют вам управлять ACL (Access Control Lists, Списками управления доступа) NTFS. Этот модуль являет исключительный пример полезного набора команд, который команда разработки PowerShell могла бы включить, на не стала, ни внутри Windows PowerShell, ни в PowerShell 7. Однако при помощи модуля PowerShellGet вы можете находить, выгружать и использовать модули из Галереи PowerShell.

На Шагах с 9 по 14 вы проходите процесс выгрузки и проверки модуля CountriesPS. Эти этапы показывают как вы можете выгружать и применять модули без необходимости их установки. Тот подход, который отражён в данных шагах, полезен когда вы изучаете модуль на предмет возможности его применения. Имеющаяся в этом модуле команда, Get-Country, пользуется интерфейсом REST для вебсайта https://restcountries.eu/. Репозиторий GitHub обладает набором образцов того, как вы некоторыми способами можете применять Get-Country, которые вы можете обнаружить в https://github.com/lazywinadmin/CountriesPS.

Те два рецепта, которые вы изучили в этом рецепте, лишь маленькая часть всей Галереи PowerShell. Как вы обнаружили, имеются тысячи модулей, команд и сценариев. Будет справедливым сказать, что некоторые из этих объектов не самого высшего качества и вы можете не применять их. Прочие же являются исключительным добавлением для вашей коллекции модулей, что продемонстрируют многие рецепты из этой книги.

Для большинства ИТ специалистов Галерея PowerShell это достойное место, где можно найти полезные модули, которые избавят вас от необходимости изобретать велосипед. В некоторых ситуациях вы можете разработать особенно полезный модуль, а затем опубликовать его в Галерее PS, чтобы поделиться им с другими. Для получения инструкций по публикации в Галерее PS обращайтесь к https://docs.microsoft.com/powershell/scripting/gallery/concepts/publishing-guidelines. И, пока вы просматриваете эту страницу, задумайтесь о применении передовых методов, предлагаемых в любом разрабатываемом вами промышленном сценарии.

Создаём локальный репозиторий PowerShell

В рецепте Изучаем PowerShellGet и PS Gallery вы выдели как вы можете выгружать модули и тому подобное PowerShell из Галереи PS. Вы можете устанавливать или сохранять их для исследования. Одной из приятных функциональных возможностей является то, что после установки модуля с применением Install-Module, позднее вы можете позднее воспользоваться Update-Module для их обновления.

Альтернативой применению общедоступного репозитория выступает создание частного внутреннего репозитория. Затем вы можете применять команды из модуля PowerShellGet для поиска, установки и управления вашими модулями. Частный репозиторий позволяет вам создавать ваш модуль и помещать его в локальном репозитории для доступа вашим профессионалов ИТ, разработчикам или пользователям.

Имеются различные способы настройки внутреннего репозитория. Одним из подходов будет применение стороннего инструмента, например, ProGet от Inedo (для подробностей относительно ProGet, обращайтесь к https://inedo.com/).

Простым способом создания репозитория является установка некого совместного ресурса SMB. Затем, вы применяете команду Register-PSRepository чтобы позволить каждой системе применять команды PowerShellGet для просмотра этого совместного ресурса в качестве репозитория PowerShell. После того как вы создаёте такой совместный ресурс и зарегистрируете этот репозиторий, вы можете публиковать свои модули в этом новом репозитории при помощи команды Publish-Module.

После того как вы настроите такой репозиторий, вам просто надлежит проверить что вы воспользовались Register-PSRepository во всех системах, в которых вы бы желали применять такой новый репозиторий, как мы сможем наблюдать в этом рецепте.

Подготовка

Вы выполняете этот рецепт в SRV1, в котором вы установили PowerShell 7 и VS Code. SRV1 является сервером рабочей группы, запущенным с Windows Server Datacenter Edition.

Как это сделать...

  1. Создаём папку репозитория

    
    $LPATH = 'C:\RKRepo'
    New-Item -Path $LPATH -ItemType Directory | Out-Null
    		
  2. Открываем общий доступ к этой папке

    
    $SMBHT = @{
      Name = 'RKRepo'
      Path = $LPATH
      Description = 'Reskit Repository.'
      FullAccess = 'Everyone'
    }
    New-SmbShare @SMBHT
    		
  3. Регистрируем этот репозиторий в качестве доверенного (в SRV1)

    
    $Path = '\\SRV1\RKRepo'
    $REPOHT = @{
      Name               = 'RKRepo'
      SourceLocation     = $Path
      PublishLocation    = $Path
      InstallationPolicy = 'Trusted'
    }
    Register-PSRepository @REPOHT
    		
  4. Просматриваем настроенные репозитории

    
    Get-PSRepository
    		
  5. Создаём папку модуля HW

    
    $HWDIR = 'C:\HW'
    New-Item -Path $HWDIR -ItemType Directory | Out-Null
    		
  6. Создаём некий элементарный модуль

    
    $HS = @"
    Function Get-HelloWorld {'Hello World'}
    Set-Alias GHW Get-HelloWorld
    "@
    $HS | Out-File $HWDIR\HW.psm1
    		
  7. Тестирование этого модуля локально

    
    Import-Module -Name $HWDIR\HW.PSM1 -Verbose
    GHW
    		
  8. Создание манифеста PowerShell для нашего нового модуля

    
    $NMHT = @{
      Path              = "$HWDIR\HW.psd1" 
      RootModule        = 'HW.psm1' 
      Description       = 'Hello World module'
      Author            = 'DoctorDNS@Gmail.com'
      FunctionsToExport = 'Get-HelloWorld'
      ModuleVersion     = '1.0.1'}
    New-ModuleManifest @NMHT
    		
  9. Публикуем этот модуль

    
    Publish-Module -Path $HWDIR -Repository RKRepo -Force
    		
  10. Просмотр полученных результатов публикации

    
    Find-Module -Repository RKRepo
    		
  11. Проверка домашней папки этого репозитория

    
    Get-ChildItem -Path $LPATH
    		

Как это работает...

На Шаге 1 вы создаёте в SRV1 папку, которую планируете применять для содержания репозитория. На этом шаге нет вывода. На Шаге 2 вы создаёте в SRV1 совместный ресурс SMB, RKRepo, что выглядит следующим образом:

 

Рисунок 4-26


Открываем совместный доступ к папке

Прежде чем команды из модуля PowerShellGet смогут пользоваться этим совместным совместным ресурсом в качестве репозитория, вам надлежит зарегистрировать этот репозиторий. Вам следует выполнить это действие из любого хоста, кторый должен применять данный репозиторий посредством команд из модуля PowerShellGet На Шаге 3 вы регистрируете этот репозиторий что не создаёт вывод.

На Шаге 4 для просмотра доступных вам репозиториев вы пользуетесь Get-PSRepository, что выглядит следующим образом:

 

Рисунок 4-27


Просматриваем доступные репозитории

Для иллюстрации того как вы можете применять репозиторий, вы программируете некий модуль. На Шаге 5 вы создаёте новую папку для содержания в ней рабочей копии своего модуля. На Шаге 6 вы создаёте некий модуль сценария и сохраняете его в этой рабочей папке. Эти два этапа не производят вывод.

На Шаге 7 вы проверяете свой модуль HW импортируя соответствующий файл .PSM1 непосредственно в свою рабочую папку и затем применяя псевдоним GHW. Чтобы просмотреть те действия, которые предпринимает Import-Module при импорте вашего нового модуля вы предписываете переключатель -Verbose. Вот вывод этого шага:

 

Рисунок 4-28


Локально тестируем модуль HW

Прежде чем вы сможете публиковать модуль в своём репозитории, вы должны создать манифест модуля для сопровождения файла этого модуля сценария. На Шаге 8 для создания манифеста данного модуля вы применяете New-ModuleManifest. На Шаге 9 вы публикуете свой вывод. Оба этапа не производят вывод.

На Шаге 10 вы просматриваете только что созданный репозиторий при помощи Find-Module и определяете свой репозиторий RKRepo. Вывод этого этапа приводится ниже.

 

Рисунок 4-29


Локально тестируем модуль HW

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

 

Рисунок 4-30


Просматриваем вновь созданный репозиторий

Есть кое- что ещё...

На Шаге 1 вы создаёте папку в устройстве C:\ для хранения содержимого репозитория. В промышленном применении вам следует рассмотреть создание такой папки в отдельных томах высокой доступности.

На Шаге 4 вы просматриваете доступность репозиториев. По умолчанию вам доступна Галерея PS, хотя и в качестве репозитория без доверия. Вы также можете наблюдать репозиторий RKRepo. Поскольку вы зарегистрировали этот репозиторий, вы видите, что он отображается как обладающий доверием.

На Шаге 11 вы исследуете папку, содержащую репозиторий RKRepo. После публикации вашего модуля HW, эта папка содержит файл, который хранит ваш модуль HW. Когда файл хранится с расширением nupkg, указывающим на то, что это пакет NuGet. Пакет NuGet это отдельный файл ZIP, который содержит откомпилированный код, сценарии, манифест модуля PowerShell и прочее. Галерея PowerShell в действительности это набор пакетов NuGet. За дополнительными сведениями относительно NuGet обращайтесь к https://docs.microsoft.com/nuget/what-is-nuget.

Устанавливаем среду подписанных сценариев

Часто вы находите, что существенно обладать знанием того, что некое приложение или сценарий PowerShell не был изменён с момента его выпуска. Для этого вы можете применять Windows Authenticode Digital Signatures (Цифровые подписи Microsoft Authenticode). Authenticode это технология подписи кода Microsoft, которая идентифицирует самого издателя подписанного Authenticode программного обеспечения. Authenticode к тому же проверяет что в это программное обеспечение не осуществлялось вмешательство с момента его подписи и публикации.

Вы также можете применять Authenticode для цифровой подписи ваших сценариев при помощи команд PowerShell. Затем вы можете гарантировать что PowerShell исполняет исключительно подписанные цифровым образом сценарии, установив политику AllSigned или RemoteSigned.

После того как вы подписали свой сценарий PowerShell, вы можете определять вносились ли какие бы то ни было изменения с момента его подписания. А применяя политику исполнения PowerShell вы можете заставлять PowerShell проверять соответствующий сценарий чтобы гарантировать что цифровая подпись всё ещё допустима и выполнять исключительно сценарии, в которых она успешна. Вы можете настроить PowerShell на выполнение этого для всех сценариев (настраивая политику выполнения на AllSigned) или же только для тех сценариев, которые вы выгружаете с удалённых площадок (устанавливая политику выполнения на RemoteSigned). Настройка политики исполнения на AllSigned также означает, что ваши файлы профиля обязаны быть подписанными, либо они не будут работать.

Это звучит как великолепная вещь, однако будет не лишним отметить, что даже когда вы настроили политику исполнения в AllSigned, достаточно просто запускать некий сценарий без подписи. Просто скиньте свой сценарий в VS Code, выберите весь имеющийся в этом сценарии текст и затем выполните этот выбранный сценарий. А когда политика исполнения RemoteSigned блокирует некий конкретный сценарий, вы можете воспользоваться соответствующим командлетом Unblock-File для того, чтобы в действительности переключить удалённый сценарий на локальный. Подпись сценария просто превращает это в слегка затруднительное, однако не в невозможное, исполнять некий сценарий, который не обладает подписью, или подпись которого отказывает.

Подписывание сценария выполняется просто когда вы обладаете цифровым сертификатом, выпущенным CA (Certifcate Authority, Органом сертификации). У вас имеются три варианта для получения соответствующего сертификата подписи кода:

  • Воспользоваться хорошо известным общедоступным CA, таким как Digicert (подробнее об их сертификатах подписи кода на https://www.digicert.com/code-signing)

  • Развернуть собственный внутренний CA и получать сертификаты от CA вашей организации

  • Прменять самостоятельно подписываемый сертификат

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

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

Подготовка

Вы выполняете этот рецепт в SRV1, в котором вы установили PowerShell 7 и VS Code. SRV1 является сервером рабочей группы, запущенным с Windows Server Datacenter Edition.

Как это сделать...

  1. Создайте сертификат подписи сценария с собственной подписью

    
    $CHT = @{
      Subject           = 'Reskit Code Signing'
      Type              = 'CodeSigning'
      CertStoreLocation = 'Cert:\CurrentUser\My'
    }
    New-SelfSignedCertificate @CHT | Out-Null
    		
  2. Отображаем этот вновь подписанный сертификат

    
    $Cert = Get-ChildItem -Path Cert:\CurrentUser\my -CodeSigningCert
    $Cert | 
      Where-Object {$_.SubjectName.Name -match $CHT.Subject}
    		
  3. Создаём и просматриваем простой сценарий

    
    $Script = @"
      # Sample Script
      'Hello World from PowerShell 7!'
      "Running on [$(Hostname)]"
    "@
    $Script | Out-File -FilePath C:\Foo\Signed.ps1
    Get-ChildItem -Path C:\Foo\Signed.ps1
    		
  4. Подписываем ваш новый сценарий

    
    $SHT = @{
      Certificate = $cert
      FilePath    = 'C:\Foo\Signed.ps1'
    }
    Set-AuthenticodeSignature @SHT
    		
  5. Проверяем это сценарий после его подписывания

    
    Get-ChildItem -Path C:\Foo\Signed.ps1
    		
  6. Просматриваем этот подписанный сценарий

    
    Get-Content -Path C:\Foo\Signed.ps1
    		
  7. Проверяем его подпись

    
    Get-AuthenticodeSignature -FilePath C:\Foo\Signed.ps1 |
      Format-List
    		
  8. Запускаем подписанный сценарий

    
    C:\Foo\Signed.ps1
    		
  9. Настраиваем политику AllSigned

    
    Set-ExecutionPolicy -ExecutionPolicy AllSigned -Scope Process
    		
  10. Выполняем тот же подписанный сценарий

    
    C:\Foo\Signed.ps1
    		
  11. Копируем сертификат в хранилище Trusted Root текущего пользователя

    
    $DestStoreName  = 'Root'
    $DestStoreScope = 'CurrentUser'
    $Type   = 'System.Security.Cryptography.X509Certificates.X509Store'
    $MHT = @{
      TypeName = $Type  
      ArgumentList  = ($DestStoreName, $DestStoreScope)
    }
    $DestStore = New-Object  @MHT
    $DestStore.Open(
      [System.Security.Cryptography.X509Certificates.OpenFlags]::ReadWrite)
    $DestStore.Add($Cert)
    $DestStore.Close()
    		
  12. Проверяем это подпись

    
    Get-AuthenticodeSignature -FilePath C:\Foo\Signed.ps1 | 
      Format-List
    		
  13. Выполняем тот же подписанный сценарий

    
    C:\Foo\Signed.ps1
    		
  14. Копируем сертификат в хранилище Trusted Publisher

    
    $DestStoreName  = 'TrustedPublisher'
    $DestStoreScope = 'CurrentUser'
    $Type   = 'System.Security.Cryptography.X509Certificates.X509Store'
    $MHT = @{
      TypeName = $Type  
      ArgumentList  = ($DestStoreName, $DestStoreScope)
    }
    $DestStore = New-Object  @MHT
    $DestStore.Open(
      [System.Security.Cryptography.X509Certificates.OpenFlags]::ReadWrite)
    $DestStore.Add($Cert)
    $DestStore.Close()
    		
  15. Выполняем тот же подписанный сценарий

    
    C:\Foo\Signed.ps1
    		

Как это работает...

На Шаге 1 вы создаёте новый сертификат подписи кода с самостоятельной подписью и сохраняете этот сертификат в хранилище My certificate текущего пользователя. Поскольку вы отправляете конвейером вывод из New-SelfSignedCertificate в Out-Null, этот этап не производит вывод.

На Шаге 2 вы выполняете выборку сертификата подписи кода из хранилища сертификатов текущего пользователя, а затем просматриваете этот сертификат, что выглядит так:

 

Рисунок 4-31


Отображаем вновь созданный сертификат

На Шаге 3 вы создаёте простой сценарий, который выводит две строки текста, одна из которых содержит название хоста. На приводимом ниже снимке экрана вы можете видеть этот сценарий:

 

Рисунок 4-32


Создаём и просматриваем простой сценарий

Теперь, когда у вас имеется сценарий, на Шаге 4 вы подписываете этот сценарий вновь созданным сертификатом подписи кода с самостоятельным подписыванием. Вывод с этого шага выглядит следующим образом:

 

Рисунок 4-33


Подписываем новый сценарий

На Шаге 5 вы просматриваете этот подписанный код, что отражается так:

 

Рисунок 4-34


Проверяем свой сценарий после подписи

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

 

Рисунок 4-35


Просматриваем подписанный сценарий

На Шаге 7 вы пользуетесь командлетом Get-AuthenticodeSignature для проверки его цифровой подписи, что выглядит так:

 

Рисунок 4-36


Тестируем подпись при помощи Get-AutenticodeSignature

На Шаге 8 вы исполняете подписанный сценарий, что отображается ниже:

 

Рисунок 4-37


Запускаем подписанный сценарий

На Шаге 9 вы установили политику в AllSigned для настройки PowerShell на обеспечение того, чтобы всякий запускаемый вами сценарий в данном сеансе обязан быть подписанным. На этом шаге нет вывода.

На Шаге 10 вы пробуете исполнить этот сценарий, что в результате приводит к ошибке, что выглядит так:

 

Рисунок 4-38


Пытаемся запустить сценарий

На Шаге 11 вы копируете свой сертификат в хранилище Trusted Root текущего пользователя. По причинам безопасности PowerShell выводит подтверждающий диалог, который вам надлежит согласовать для завершения копирования, что отображается следующим образом:

 

Рисунок 4-39


Копируем сертификат в хранилище Trusted Root текущего пользователя

На Шаге 12 вы повторно проверяете подпись этого файла, что выглядит так:

 

Рисунок 4-40


Проверяем цифровую подпись сценария

На Шаге 13 вы снова пробуете запутить свой сценарий, но с иным результатов, выглядящим следующим образом:

 

Рисунок 4-41


Запускаем подписанный сценарий

Хотя ваш сертификат и из доверенного (теперь) Центра Сертификации, он не от доверенного издателя. Чтобы разрешить это, на Шаге 14 вы копируете в хранилище Trusted Publishers, что не производит никакого вывода.

Теперь, когда у вас имеются сертификаты как для доверительного корневого хранилища, так и для доверенного хранилища издателя (для вашего пользователя), на Шаге 15 вы повторно исполняете свой сценарий, который выводит следующее:

 

Рисунок 4-42


Запускаем подписанный сценарий

Есть кое- что ещё...

В этом сценарии вы начинаете с создания сертификата подписи кода и его применения к подписи сценария. По умолчанию, Windows и PowerShell не доверяют самостоятельно подписываемым сертификатам подписи кода.

Чтобы позволить PowerShell доверять такой подписи, вы копируете его сертификат подписи кода в корневое хранилище Центра Авторизации(CA) своего текущего пользователя, что обладает воздействием превращения этого сертификата подписи кода в доверенный для текущего пользователя. Вы осуществляете это на Шаге 11 и замечаете, что вырабатывается всплывающий диалог. Вам также надлежит скопировать этот сертификат в хранилище доверенного издателя, что вы и выполняете на Шаге 14.

В промышленной среде вы бы получили сертификат подписи кода из доверенного Центра Авторизации и аккуратно управились бы со своим хранилищем доверенных сертификатов. Для корпоративных сред вы можете настраивать некий Центр Авторизации и обеспечивать пользователям автоматический контроль для сертификатов корневого Центра Авторизации. При автоматической раскрутке PowerShell (и Windows) способны доверять таким сертификатам, выпускаемым их Центром Авторизации.

В качестве альтернативы для получения сертификатов подписи кода вы можете применять сторонние Центры Авторизации, например, DigiCert, которые по умолчанию обладают доверием со стороны Windows. В распространении доверенный сертификатов корневого Центра Авторизации способствует Программа Доверенного Корня Microsoft. Относительно дополнительных сведений о сертификатах подписи кода DigiCert обращайтесь к https://digicert.leaderssl.com/suppliers/digicert/products#codesigning-products. За подробностями по программе Доверенного Корня Microsoft отсылаем вас к https://docs.microsoft.com/security/trusted-root/program-requirements.

Работаем с закладками и модулем PSShortcut

Закладка (ярлык, shortcut) это файл, содержащий указатель н иной файл или URL. Вы можете помещать некий ярлык ссылки оболочки на какую- то исполняемую программу, скажем, PowerShell, на свой рабочий стол Windows. Когда вы кликните по такой закладке в Проводнике Windows, Windows запустит целевую программу. Также вы можете создать некий ярлык для URL.

Ярлык ссылки оболочки обладает расширением .LNK, в то время как закладки URL обладают расширением .URL. Внутри себя файл закладки обладает двоичной структурой, которая не редактируется напрямую. Для получения дополнительных сведений относительно их внутреннего формата смотрите https://docs.microsoft.com/openspecs/windows_protocols/ms-shllink/.

Закладка URL это текстовый документ, который вы можете изменять в VS Code или в Блокноте. Для подробностей относительно формата файла закладок URL отсылаем вас к http://www.lyberty.com/encyc/articles/tech/dot_url_format_-_an_unofficial_guide.html.

Для управления ярлыками в PowerShell 7 нет никаких встроенных команд. Как вы видели ранее в этой книге, для создания ярлыков вы можете пользоваться более старыми объектами COM. Более последовательный способ состоит в применении модуля PSShortcut, который вы можете выгрузить из Галереи PowerShell.

В данном рецепте вы обнаружите в своей системе ярлыки и создадите ярлыки как для исполняемого файла, так и для URL.

Подготовка

Вы выполняете этот рецепт в SRV1, в котором вы установили PowerShell 7 и VS Code. SRV1 является сервером рабочей группы, запущенным с Windows Server Datacenter Edition.

Как это сделать...

  1. Находим модуль PSShortcut

    
    Find-Module -Name '*shortcut'
    		
  2. Устанавливаем модуль PSShortcut

    
    Install-Module -Name PSShortcut -Force
    		
  3. Просматриваем установленный модуль PSShortcut

    
    Get-Module -Name PSShortCut -ListAvailable |
      Format-List
    		
  4. Выявляем команды в установленном модуле PSShortcut

    
    Get-Command -Module PSShortcut
    		
  5. Обнаруживаем все закладки в SRV1

    
    $SHORTCUTS = Get-Shortcut
    "Shortcuts found on $(hostname): [{0}]" -f $SHORTCUTS.Count
    		
  6. Обнаруживаем ярлыки PWSH

    
    $SHORTCUTS | Where-Object Name -match '^PWSH'
    		
  7. Выявляем закладку URL

    
    $URLSC = Get-Shortcut -FilePath *.url
    $URLSC
    		
  8. Просматриваем содержимое своей закладки

    
    $URLSC | Get-Content
    		
  9. Создаём закладку URL

    
    $NEWURLSC = 'C:\Foo\Google.url'
    $TARGETURL = 'https://google.com'
    New-Item -Path $NEWURLSC | Out-Null
    Set-Shortcut -FilePath $NEWURLSC -TargetPath $TARGETURL
    		
  10. Применяем закладку URL

    
    & $NEWURLSC
    		
  11. Создаём ярлык файла

    
    $CMD = Get-Command -Name notepad.exe
    $NP = $CMD.Source
    $NPSC = 'C:\Foo\NotePad.lnk'
    New-Item -Path $NPSC | Out-Null
    Set-Shortcut -FilePath $NPSC -TargetPath $NP
    		
  12. Применяем этот ярлык

    
    & $NPSC
    		

Как это работает...

На Шаге 1 вы применяете команду Find-Module для обнаружения модулей в Галерее PowerShell, чьи названия заканчиваются на "shortcut". Получаемый вывод выглядит примерно так:

 

Рисунок 4-43


Обнаруживаем модуль PSShortcut

На Шаге 2 вы пользуетесь командой Install-Module для установки модуля PSShortcut. Этот шаг не производит вывод.

После того как вы установили модуль PSShortcut, на Шаге 3 вы при помощи команды Get-Module выводите дополнительные сведения относительно этого модуля PSShortcut. Вот что производит вывод на этом шаге:

 

Рисунок 4-44


Просматриваем модуль PSShortcut

На Шаге 4 вы обнаруживаете команды, предоставляемые установленным модулем PSShortcut, что выглядит так:

 

Рисунок 4-45


Выявляем команды в модуле PSShortcut

На Шаге 5 для поиска всех ярлыков в SRV1 и сохранения в некой переменной вы применяете Get-Module. Затем вы отображаете счётчик того, сколько вы их обнаружили с выводом, подобным следующему:

 

Рисунок 4-46


Обнаруживаем все ярлыки из SRV1

На Шаге 6 вы изучаете набор ярлыков файлов ссылок из SRV1 для выявления тех, которые указывают на PWSH (то есть закладки на PowerShell 7), что выглядит так:

 

Рисунок 4-47


Обнаруживаем все закладки PWSH

На Шаге 7 для обнаружения каких- нибудь закладок URL из SRV1 вы применяете Get-Shortcut, что выглядит примерно так:

 

Рисунок 4-48


Выявляем в SRV1 закладки URL

На Шаге 8 вы изучаете содержимое найденного файла .URL, что отображено ниже:

 

Рисунок 4-49


Изучаем содержимое файла .URL

На Шаге 9 вы создаёте закладку для google.com, что не производит вывод. На Шаге 10 вы исполняете эту закладку. PowerShell затем запускает ваш браузер по умолчанию (то есть Internet Explorer, например) и переходит по указанному в этом файле URL, что показано далее:

 

Рисунок 4-50


Исполняем закладку на google.com

На Шаге 11 вы создаёте ярлык ссылки, что не производит вывод. На Шаге 12 вы исполняете этот ярлык, что переносит нас в Блокнот подобно следующему:

 

Рисунок 4-51


Выполняем ярлык для Notepad

Есть кое- что ещё...

На Шаге 7 вы обнаруживаете ярлыки URL и, как вы можете обнаружить, имеется всего один: к Bing. Установщик Windows создаёт его при установке в данном хосте Windows Server.

На Шаге 8 вы изучаете содержимое закладки URL. В отличии от файлов закладок ссылок, которые обладают двоичным форматом и не полностью читаемы, закладки URL представляют собой текстовые файлы.

Работаем с файлами архивов

С самого начала эры ПК пользователи работали с разнообразием механизмов сжатия файлов. Ранние методы применяли формат файла ZIP, первоначально реализованный программой PKZip PKWare, который быстро превратился практически в стандарт для передачи данных. Позднее стала популярной версия Windows, WinZip, а в Windows 98 Microsoft предоставил встроенную поддержку для файлов архивов .ZIP. В наши дни Windows поддерживает файлы ZIP с размером до 2 ГБ. Дополнительные сведения относительно формата файла ZIP вы можете почерпнуть в https://en.wikipedia.org/wiki/Zip_(file_format).

С годами многие разработчики предоставили альтернативные схемы сжатия и связанных с ним утилит, включая WinRAR и 7-Zip. И WinZip, и WinRAR великолепные программы, но являются коммерческими. 7-Zip бесплатный инструмент и также популярен. Все три представляют свои собственные механизмы сжатия (с соответствующими расширениями файлов), а также поддерживают и прочие.

За подробностями относительно WinZip обращайтесь к https://www.winzip.com/win/en; сведения относительно WinRAR можно найти на https://www.win-rar.com/, а больше узнать об 7-Zip вы можете на https://www.7-zip.org/. Каждая из этих утилит сжатия, предлагаемых данными группами, также поддерживает механизмы сжатия из прочих сред, например, TAR.

В данном рецепте вы рассмотрите встроенные в PowerShell 7 команды для управления файлами архивов. Эти команды работают лишь с файлами ZIP. Вы можете найти модуль PowerShell для 7-Zip в https://github.com/thoemmi/7Zip4Powershell, хотя этот модуль достаточно древний и не обновлялся какое- то время.

Подготовка

Вы выполняете этот рецепт в SRV1, в котором вы установили PowerShell 7 и VS Code. SRV1 является сервером рабочей группы, запущенным с Windows Server Datacenter Edition.

Как это сделать...

  1. Получаем модуль необходимой архивации

    
    Get-Module -Name Microsoft.Powershell.Archive -ListAvailable
    		
  2. Изучаем команды в полученном модуле архивации

    
    Get-Command -Module Microsoft.PowerShell.Archive
    		
  3. Создаём новую папку

    
    $NIHT = @{
      Name        = 'Archive'
      Path        = 'C:\Foo'
      ItemType    = 'Directory'
      ErrorAction = 'SilentlyContinue'
    }
    New-Item @NIHT | Out-Null
    		
  4. Создаём файлы в своей папке архивации

    
    $Contents = "Have a Nice day with PowerShell and Windows Server" * 1000
    1..100 | 
      ForEach-Object {
        $FName = "C:\Foo\Archive\Archive_$_.txt"
        New-Item -Path $FName -ItemType File  | Out-Null
        $Contents | Out-File -FilePath $FName
    }
    		
  5. Измеряем размер всех файлов в архиве

    
    Files = Get-ChildItem -Path 'C:\Foo\Archive'
    $Count = $Files.Count
    $LenKB = (($Files | Measure-Object -Property length -Sum).Sum)/1mb
    "[{0}] files, occupying {1:n2}mb" -f $Count, $LenKB
    		
  6. Сжимаем набор файлов в некий архив

    
    $AFILE1 = 'C:\Foo\Archive1.zip'
    Compress-Archive -Path $Files -DestinationPath "$AFile1"
    		
  7. Сжимаем папку, содержащую архив

    
    $AFILE2 = 'C:\Foo\Archive2.zip'
    Compress-Archive -Path "C:\Foo\Archive" -DestinationPath $AFile2
    		
  8. Просматриваем полученные файлы архивов

    
    Get-ChildItem -Path $AFILE1, $AFILE2
    		
  9. Просматриваем содержимое архива при помощи Проводника Windows

    
    explorer.exe $AFILE1
    		
  10. Просматриваем содержимое второго архива при помощи Проводника Windows

    
    explorer.exe $AFILE2
    		
  11. Создаём новую папку вывода

    
    $Opath = 'C:\Foo\Decompressed'
    $NIHT2 = @{
      Path        = $Opath
      ItemType    = 'Directory'
      ErrorAction = 'SilentlyContinue'
    }
    New-Item @NIHT2 | Out-Null
    		
  12. Раскрываем свой архив Archive1.zip

    
    Expand-Archive -Path $AFILE1 -DestinationPath $Opath
    		
  13. Измеряем размер распакованных файлов

    
    $Files = Get-ChildItem -Path $Opath
    $Count = $Files.Count
    $LenKB = (($Files | Measure-Object -Property length -Sum).Sum)/1mb
    "[{0}] decompressed files, occupying {1:n2}mb" -f $Count, $LenKB
    		

Как это работает...

На Шаге 1 мы пользуемся Get-Module для изучения своего модуля Microsoft.PowerShell.Archive , что выглядит так:

 

Рисунок 4-52


Изучаем модуль архивации

Для выявления всех команд в нашем модуле Microsoft.PowerShell.Archive на Шаге 2 мы применяем Get-Command, что отображается следующим образом:

 

Рисунок 4-53


Выявляем команды в полученном модуле архивации

На Шаге 3 вы создаёте новую папку, которую на Шаге 4 вы заполняете 100 текстовыми файлами. Эти два шага не производят вывод.

На Шаге 5 для получения всех файлов в своей папке архива и измерения значения размера всех этих файлов вы применяете Get-ChildItem. Его вывод отображён ниже:

 

Рисунок 4-54


Измеряем общий размер всех архивных файлов

На Шаге 6 вы сжимаете весь набор файлов, созданных вами на Шаге 5. Этот шаг сжимает набор файлов в некий файл архива, что не производит вывода. На Шаге 7 вы сжимаете папку и её содержимое. Данный шаг создаёт некую корневую папку в получаемом файле архива, которая содержит все заархивированные (и сжатые) файлы. Этот шаг также не производит вывод.

На Шаге 8 вы пользуетесь Get-ChildItem для просмотра своих двух файлов архивов, что отображается так:

 

Рисунок 4-55


Просмотр полученных архивных файлов

На Шаге 9 вы применяете Проводник Windows для просмотра всех файлов в своём первом файле архива, что показывает индивидуальные сжатые вами в общий архив файлы. Вот вывод с этого шага:

 

Рисунок 4-56


Применение Проводника Windows для просмотра нашего первого архива

На Шаге 10 вы при помощи Проводника Windows просматриваете свой второй файл архива, что показано далее:

 

Рисунок 4-57


Применение Проводника Windows для просмотра нашего второго архива

На Шаге 11 вы создаёте новую папку (C:\Foo\Decompressed), что не производит вывода. На Шаге 12 вы применяете Expand-Archive для распаковки всех файлов в Archive1.ZIP в созданную на предыдущем шаге папку, что также не приводит к выводу.

На Шаге 13 вы измеряете общий размер всех распакованных файлов, что отображается следующим образом:

 

Рисунок 4-58


Измерение общего размера распакованных файлов

Есть кое- что ещё...

На Шаге 6 и на Шаге 7 вы сжали 100 файлов, которые вы создали в данном рецепте ранее. Основное отличие между этими двумя шагами заключается в том, что первый шаг просто сжимает набор файлов, в то время как второй создаёт некую корневую папку, содержащую 100 файлов. На Шаге 8 вы можете наблюдать в размерах этих файлов, когда второй архив несколько больше чем первый, обладая наличием корневой папки.

На Шаге 12 вы распаковываете свой первый архив, а на Шаге 13 вы можете наблюдать, что он содержит то же самое число файлов и тот же самый общий размер файлов что и те 100 файлов, которые вы первоначально сжали.