Компания опубликовала инструкцию по официальной установке актуальной операционной системы на компьютеры, которые не соответствуют минимальным требованиям. Однако с уточнением, что она не рекомендует этого делать.
В предыдущей части мы познакомились с Out-ConsoleGridView — мощным инструментом для интерактивной работы с данными прямо в терминале. Если вы не знаете, что такое Out-ConsoleGridView, рекомендую начать отсюда 👉 Интерактивная работа: Out-ConsoleGridView
Я не буду повторять теорию, а сразу перейду к практике и покажу 10 сценариев, в которых этот командлет может сэкономить системному администратору или продвинутому пользователю массу времени.
Дисклеймер. В пикабу нет редактора кода - поэтому такое форматирование и картинки. В конце поста я дам ссылку на github. Почитайте, и если вам интересно смотрите код на гитхабе
Out-ConsoleGridView — это не просто "просмотрщик". Это интерактивный фильтр объектов в середине вашего конвейера.
Предварительные требования:
PowerShell 7.2 или новее.
Установленный модуль Microsoft.PowerShell.ConsoleGuiTools. Если вы его еще не установили:
> # Выбираем процессы в интерактивном режиме > $procsToStop = Get-Process | Sort-Object -Property CPU -Descending | Out-ConsoleGridView -OutputMode Multiple
> # Если что-то было выбрано, передаем объекты на остановку > if ($procsToStop) { $procsToStop | Stop-Process -WhatIf }
Sort-Object упорядочивает их по загрузке CPU, чтобы самые "прожорливые" были наверху.
Out-ConsoleGridView отображает таблицу. Вы можете ввести chrome или notepad, чтобы мгновенно отфильтровать список, и выбрать нужные процессы клавишей Space.
После нажатия Enter выбранные объекты процессов попадают в переменную $procsToStop и передаются в Stop-Process.
Пример 2: Управление службами Windows
Нужно быстро перезапустить несколько служб, связанных с одним приложением (например, SQL Server).
> $services = Get-Service | Out-ConsoleGridView -OutputMode Multiple -Title "Выберите службы для перезапуска" if ($services) { $services | Restart-Service -WhatIf }
Пример 4: Добавление пользователей в группу Active Directory
Вместо того чтобы вручную вводить имена пользователей, вы получаете удобный список, где можете быстро найти и выбрать нужных сотрудников по фамилии или логину.
Пример 5: Узнать, какие программы используют интернет прямо сейчас
Одна из частых задач: "Какая программа тормозит интернет?" или "Кто и куда отправляет данные?". С помощью Out-ConsoleGridView можно получить наглядный ответ.
Get-NetTCPConnection -State Established собирает все установленные сетевые подключения.
С помощью Select-Object мы формируем удобный отчет: добавляем имя процесса (ProcessName) к его ID (OwningProcess), чтобы было понятно, какая программа установила соединение.
Out-ConsoleGridView показывает вам живую картину сетевой активности.
Пример 6: Анализ установки ПО и обновлений
Мы будем искать события от источника "MsiInstaller". Он отвечает за установку, обновление и удаление большинства программ (в формате .msi), а также за многие компоненты обновлений Windows.
Внутри таблицы: Вы можете отфильтровать список по названию программы (например, Edge или Office), чтобы увидеть всю историю ее обновлений. Вы можете отсортировать по Id, чтобы найти неудачные установки (11708).
Вы получаете список всего установленного ПО. В интерфейсе вы можете легко найти и выбрать несколько программ для удаления.
Пример 8: Связывание (Chaining) Out-ConsoleGridView
Это самый мощный прием. Выход одной интерактивной сессии становится входом для другой. Задача: Выбрать одну из ваших папок с проектами, а затем выбрать из нее определенные файлы для создания ZIP-архива.
Первый Out-ConsoleGridView показывает вам список папок внутри ваших "Документов". Вы можете быстро найти нужную, введя часть ее имени, и выбрать одну папку.
Если папка была выбрана, скрипт немедленно открывает второй Out-ConsoleGridView, который показывает уже файлы внутри этой папки.
Вы выбираете один или несколько файлов клавишей Space и нажимаете Enter.
Скрипт берет выбранные файлы и создает из них ZIP-архив на вашем рабочем столе.
Это превращает сложную многошаговую задачу (найти папку, найти в ней файлы, скопировать их пути, запустить команду архивации) в интуитивно понятный интерактивный процесс из двух шагов.
Пример 9: Управление опциональными компонентами Windows
Первый взгляд: чем отличается Proxmox от Broadcom ESXi и Microsoft Hyper-V?
Первый взгляд: требуемое место для установки. Broadcom ESXi до недавнего времени отлично (с оговорками) работал с 32 Гб хоть USB флешки, хоть SD карточки, в псевдорейде, и без. При этом, хотя с версии 6.5 флешка умирала за 3-6 месяцев, спасибо криворуким разработчикам, но сам гипервизор, и виртуальные машины на нем, продолжали работать до планового выключения или миграции (обычно). Иногда с проблемами. RAID для установки? Не нужен. Если умерла флешка, то берется новая, на нее за 10 минут ставиться ESXi той же версии. За еще 5 минут применяется или бекап конфигурации (родной, теплый, встроенный бекап, не забывайте делать), или profile с vCenter, или, если вы озаботились, то прогоняете хоть powershell (powercli) скрипт, хоть что угодно, и система снова в строю. Можно и PXE boot делать, можно и FC \ iSCSI boot. Со всеми минусами сочетания FC и кривых рук. Известная история, как отформатировать раздел с виртуальными машинами, привлекая внимание санитаров.
С Microsoft Hyper-V другая история. Хотя там и был отдельный дистрибутив с Hyper-V only, но я не видел, чтобы его в таком виде как-то массово использовали. Так что готовьте 60-100 гигабайт на загрузку плюс данные плюс логи. RAID для установки? Нуууу .. it depends on. Проблема выбора не очевидна, но. Аппаратный рейд отнимает PCIe слот, снижает производительность NVME SSD дисков (ссылка 1, ссылка 2), и очень хочется заменить его на PCIe SAS или SATA переходник или как-то еще уйти от этого. Внутри Microsoft Windows давно существует два подхода к RAID – это софтовый рейд от MS, и storage space \ storage space direct (этот требует лицензии DC). Софтовый рейд работает, но для настройки зеркалирования «и загрузчика и раздела восстановления» нужно идти в diskpart и делать там всякое, причем diskpart еще и не автоматизируется (штатно, конечно можно написать свой обработчик). Сделать можно, и это работает, но в эксплуатации решение «вроде все ок, но как-то так себе». Разовая, но все равно ручная работа. PXE и прочие варианты загрузки, конечно, тоже есть. Бекап – есть. Нужно ли при этом иметь RAID ? Не знаю. 20 лет назад, во времена 2003 \ 2008 Windows и дисков по 74 Гб, было проще сделать RAID. Сейчас мне проще настроить встроенный бекап, сделать один раз, и экспортировать задание со скриптом. Хотя это все равно колхозное решение.
Установленный для тестов и этой статьи в виртуальную машину Proxmox 8.4 занял 5 Гб, до установки обновлений, агентов, прочей обвязки.
RAID для установки? Нуууу .. it depends on. Проблема в чем. Встроенного бекапа конфигурации нет. Есть какие-то скрипты непонятной годности, их еще и читать надо. Конечно, есть LVM, но его настройка описана «как-то так». Можно заранее сделать mdadm boot on RAID1, но это все равно ручная работа и по перезагрузке, и по восстановлению. И BIOS надо настроить.
Эти все моменты «как бы есть, но как бы и не понятно», стали одним из поводов к написанию заметок, и поводом посидеть, подумать еще раз, погонять сценарии отказа в виртуальной среде. На физике было решено максимально просто: диски новые, сейчас делаем первую итерацию, для наших задач это не так важно, потом переделаем. FEEL THE POWER OF AGILE! (нет)
(Переделывать, конечно, никто не собирался).
Первый взгляд: Остаток используемого места.
Если у вас не отдельные диски «только под загрузку», и не планируется vSAN или Storage space direct, и нет системы хранения данных, то возникает вопрос «что делать с остальным местом на дисках». Broadcom ESXi решает эту задачу в лоб – отделяет себе 138 Гб, а дальше делайте что хотите, только под vSAN такое не используйте.
Microsoft Hyper-V решает эту задачу не менее прямолинейно – делайте что хотите, но место под ОС будьте добры предоставить.
С PVE Proxmox Virtual Environment все .. не так очевидно. Для тестов был сделан диск на 75 Гб, тонкий (динамический)
Если при установке сделать LVM, и потом посмотреть, что там вышло, то получим: lsblk
lvdisplay покажет: --- Logical volume --- LV Name data VG Name pve LV Size <23.50 GiB
--- Logical volume --- LV Path /dev/pve/swap LV Name swap VG Name pve LV Size 8.00 GiB
--- Logical volume --- LV Path /dev/pve/root LV Name root VG Name pve LV Size 27.37 GiB
Понятно, что не понятно.
Если смотреть из GUI, то на LVM свободно 9 Гб, а на томе Data свободно все 23. Как пишут, есть нюанс: временные файлы при копировании создаются в корневом разделе в /var/tmp/ Но, у меня /dev/mapper/pve-root создался размером 27G, занято всего 3.0G, так что переживу.
Давайте посмотрим, что с этим можно сделать, положу туда стопку ISO ! В GUI это все видно как: /dev/mapper/pve-root виден как Storage 'local' on node 'proxmox1'
И второй виден как Storage 'local-lvm' on node 'proxmox1' при этом монтируется это все ничуть не очевидно, например ISO images в GUI это /var/lib/vz/template/iso CT templates в GUI это /var/lib/vz/template/cache
CT templates позволяет закачивать только .tar.xz файлы, точнее закачивать то можно хоть ISO, но закачивать надо с именем .tar.xz , ну что за хрень. Удалить файлы пачкой из GUI нельзя, создать папок под свои представления о прекрасном нельзя, что такое то. ГДЕ СВОБОДА? В целом GUI не очень понятный, надо сидеть пытаться понять логику авторов.
Если я иду в node/disks, то вижу диски. Ок, понятно. Если я иду в node/disk/lvm, то вижу, что создана LVM группа PVE, из трех томов, и свободно 9 Гб. Ну, окей. Если я иду в node/disk/ lvm-thin, то вижу пустой pool, и .. и что мне с этим знанием делать?
Интересное наблюдение. Удаление файлов, хоть из GUI, хоть из CLI, не освобождает место на диске с точки зрения гипервизора. То есть изнутри VM место есть, но дальше, при попытке его сжать, он как был раздут до 29333222111, так и останется, вне зависимости от ключей для Optimize-VHD Решение гуглится за минуту, apt install zerofree но «из коробки» ничего этого нет. Горько мне, горько.
Первичные исправления и обновления.
Для того, чтобы это австрийское изделие заработало в продуктиве, нужно: Настроить на Nexus – proxy repo Поменять VLAN и дефолтный IP. У меня оно взяло IP из первичных настроек DHCP, которого я не ожидал. Настроить DNS Настроить нужные pero на proxmox Настроить NTP И, наконец, обновиться. Сменить настройку в CLI по умолчанию, куда прописался старый IP. Сделать нормальную авторизацию, то есть дома – по сертификату с паролем, а в продуктиве, конечно, AD/Kerberos Убрать надпись при входе
Вроде ничего не забыл, про пересылку логов событий, установки антивирусов и прочих Тайнос Агентос пусть безопасность думает, про Zabbix пусть мониторинг телеграфирует или графанирует. Сначала сделаю руками. Конечно, надо сразу делать через Ansible.
Настроить на Nexus – proxy repo Это самое простое. Settings – Repo – create proxy - Distribution to fetch e.g. bionic : bookworm для 8.4, trixie для 9. Save – done Зачем? Чтобы ваши гипервизоры не ходили в интернеты. Но, если вам ОК, то пусть ходят.
Не забудьте выписать URL. Очень смешно получается, если прописать не bookworm, а bionic, и прописать этот репозиторий в PVE. Обязательно попробуйте.
Поменять VLAN и дефолтный IP. У меня оно взяло IP из первичных настроек DHCP, которых я не ожидал Здесь, если делать руками, все максимально просто. Открываем документацию, раздел Network Configuration, раздел Default Configuration using a Bridge, и делаем. Для продуктива, конечно, открываем пример Use VLAN 5 with bond0 for the Proxmox VE management IP with traditional Linux bridge , думаем, читаем, делаем. nano /etc/network/interfaces и даже делаем If you made manual changes directly to the /etc/network/interfaces file, you can apply them by running ifreload -a
Но при этом в GUI, во вкладке localnetwork, все равно откуда-то подтягивается старый адрес для vmbr0, причем в поле COMMENT, если зайти в сети хоста. Я поленился его искать в описаниях, и исправил из GUI, и это был alias, куда я вообще смотрел.
Настроить DNS Тут тоже ничего нового, nano /etc/resolv.conf
Настроить нужные pero на proxmox nano /etc/apt/sources.list nano /etc/apt/sources.list.d/ceph.list nano /etc/apt/sources.list.d/pve-enterprise.list Надеюсь, вы поняли, что надо туда прописать, после настройки Nexus
Настроить NTP Нет ничего проще, открыли документацию, Time Synchronization, настроили. nano /etc/chrony/chrony.conf , и посмотрели: chronyc tracking В изолированной среде, разумеется, за временем придется идти или к NTP proxy, или к контроллерам домена.
И, наконец, обновиться. Было: pveversion pve-manager/8.4.0/ (running kernel: 6.8.12-9-pve) стало pve-manager/8.4.9/ (running kernel: 6.8.12-9-pve)
Сменить настройку в CLI по умолчанию, куда прописался старый IP. Это, понятно, /etc/hosts
Сделать нормальную авторизацию, то есть дома – по сертификату с паролем, а в продуктиве, конечно, AD/Kerberos Тут тоже капитанство, nano ~/.ssh/authorized_keys и готово Во всех остальных случаях надо читать документацию, Syncing LDAP-Based Realms
Убрать надпись при входе Тут тоже никакой магии. Прочитать это или это, и сделать. Или, все то же самое, но через pve-nag-buster, или, если вы совсем ленивы, то читаете тред на реддит, и делаете. Вплоть до рецепта remove_nag.yml 615-я строка, кому интересно, res.data.status.toLowerCase() \!== 'active'
Дисклеймер. в редакторе пикабу нет редактора кода поэтому картинки и вырвиглазное форматирование. Но на гитхабе лежит полноценная статья. Вы можете почитать тут, а примеры копировать из гитхаб
В предыдущей части мы исследовали конвейеры и абстрактные объекты процессов. Теперь давайте применим наши знания о конвейере и объектах к одной из частых задач пользователя или администратора — работе с файловой системой. В PowerShell эта работа построена на тех же принципах: команды возвращают объекты, которые можно передавать по конвейеру для дальнейшей обработки.
1. Концепция PowerShell Drives (PSDrives)
Прежде чем начать работать с файлами, важно понять концепцию PowerShell-дисков (PSDrives). В отличие от cmd.exe, где диски — это только буквы C:, D: и так далее, в PowerShell "диск" — это абстракция для доступа к любому иерархическому хранилищу данных.
> Get-PSDrive
Результат покажет не только физические диски, но и псевдо-диски:
Эта унификация означает, что вы можете "зайти" в реестр (Set-Location HKLM:) и получить список его ключей той же командой Get-ChildItem, которой получаете список файлов на диске C:. Это невероятно мощная концепция.
Примеры работы с различными провайдерами
Хранилище сертификатов (Cert:) Позволяет работать с цифровыми сертификатами так, будто это файлы в папках.
Задача: Найти все SSL-сертификаты на локальной машине, срок действия которых истекает в ближайшие 30 дней. > Set-Location Cert:\LocalMachine\My > Get-ChildItem | Where-Object { $_.NotAfter -lt (Get-Date).AddDays(30) } | Select-Object Subject, NotAfter, Thumbprint
Переменные окружения (Env:) Предоставляет доступ к переменным окружения Windows (%PATH%, %windir% и т.д.) как к файлам.
Задача: Получить путь к системной папке Windows и добавить к нему путь к System32.
Получаем значение переменной windir: > $windowsPath = (Get-Item Env:windir).Value Собираем полный путь > $system32Path = Join-Path -Path $windowsPath -ChildPath "System32" > Write-Host $system32Path
Реестр Windows (HKCU: и HKLM:) Представьте, что реестр — это просто еще одна файловая система. Ветки — это папки, а параметры — свойства этих папок.
Задача: Узнать полное название установленной версии Windows из реестра. Переходим в нужную ветку реестра: > Set-Location "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" Получаем свойство (параметр реестра) с именем "ProductName" > Get-ItemProperty -Path . -Name "ProductName"
Переменные сессии (Variable:) Позволяет управлять всеми переменными ($myVar, $PROFILE, $Error и т.д.), определенными в текущей сессии.
Задача: Найти все переменные, связанные с версией PowerShell ($PSVersionTable, $PSHOME и др.). Находим все переменные, начинающиеся с "PS": > Get-ChildItem Variable:PS*
Получаем значение конкретной переменной: > Get-Variable -Name "PSVersionTable"
2. Навигация и анализ
Основы навигации - Узнать, где мы находимся (возвращает объект PathInfo): > Get-Location # Псевдонимы: gl, pwd
- Переход в корень диска C: > Set-Location C:\ # Псевдонимы: sl, cd
- Переход в домашнюю папку текущего пользователя: > Set-Location ~
- Рекурсивный поиск. Найти файл hosts в системе, игнорируя ошибки "Доступ запрещен": > Get-ChildItem C:\ -Filter "hosts" -Recurse -ErrorAction SilentlyContinue
Ключ -Recurse (Рекурсивно): Заставляет командлет работать не только с указанным элементом, но и со всем его содержимым.
Ключ -ErrorAction SilentlyContinue: Инструкция игнорировать ошибки и продолжать работу молча.
Анализ дискового пространства
Классический пример мощи конвейера: найти, отсортировать, отформатировать и выбрать.
Подсказка как вводить длинные команды.
PowerShell позволяет разбивать их на несколько строк для удобства чтения.
После оператора конвейера (|): Это самый частый и удобный способ. Просто нажмите Enter после символа |. PowerShell увидит, что команда не завершена, и будет ждать продолжения на следующей строке.
В любом другом месте: Используйте символ обратной кавычки (backtick) ` в конце строки, а затем нажмите Enter. Этот символ говорит PowerShell: "Команда продолжится на следующей строке".
В редакторах (ISE, VS Code): Сочетание клавиш Shift+Enter обычно автоматически вставляет перенос строки, не запуская команду.
Фильтрация содержимого и операторы логики
- Найти все .exe файлы. Параметр -Filter работает очень быстро: > Get-ChildItem C:\Windows -Filter "*.exe"
Get-ChildItem возвращает коллекцию объектов. Мы можем передать ее по конвейеру в Where-Object для дальнейшей фильтрации.
Эта команда знакомит нас с одним из фундаментальных понятий в скриптах PowerShell: операторами сравнения.
Операторы сравнения и логики
Это специальные ключи для сравнения значений. Они всегда начинаются с дефиса (-) и являются основой для фильтрации данных в Where-Object и построения логики в if.
Тема операторов логики - очень обширная и я ей посвящу отдельную часть (или даже две). А пока вооружившись этими операторами, мы можем фильтровать, сортировать и выбирать нужные нам файлы и папки, используя всю мощь объектного конвейера.
Найти все исполняемые файлы (.exe), которые были изменены в этом году, но НЕ в этом месяце. Этот сложный пример демонстрирует мощь комбинирования операторов.
Remove-Item — потенциально опасный командлет, поэтому в PowerShell есть встроенные механизмы защиты. Ключ -WhatIf (Что если?): Ваш лучший друг. Он не выполняет команду, а лишь выводит в консоль сообщение о том, что бы произошло.
Только убедившись, что все верно, убираем -WhatIf и ВЫПОЛНЯЕМ команду > Remove-Item C:\Temp\MyFolder -Recurse -Force
Введение в функции
Когда одна строка кода превращается в сложный набор команд, который вы хотите использовать снова и снова, наступает время для создания функций.
Как использовать и сохранять функции
Существует три основных способа сделать ваши функции доступными:
Способ 1: Временный (для тестов) Вы можете набрать в консопли или просто скопировать и вставить весь код функции в консоль PowerShell. Функция будет доступна до закрытия этого окна.
Способ 2: Постоянный, но ручной (через .ps1 файл) Это самый распространенный способ для организации и обмена инструментами. Вы сохраняете функцию в файл .ps1 и загружаете ее в сессию, когда она вам нужна.
Способ 3: Автоматический (через профиль PowerShell) Это самый мощный способ для ваших личных, часто используемых инструментов.
Что такое профиль PowerShell? Это специальный скрипт .ps1, который PowerShell автоматически запускает каждый раз при старте. Все, что вы поместите в этот файл — псевдонимы, переменные и, конечно, функции — будет доступно в каждой вашей сессии по умолчанию.
Пример 1: Поиск дубликатов файлов
Давайте пройдем все шаги на примере функции Find-DuplicateFiles.
Шаг 1: Определяем код функции
Шаг 2 (Вариант А): Сохраняем в отдельный файл для ручной загрузки
Dot Sourcing (. .\Find-DuplicateFiles.ps1): Эта специальная команда выполняет скрипт в текущем контексте, делая все его функции и переменные доступными в вашей консоли.
Шаг 2 (Вариант Б): Добавляем в профиль для автоматической загрузки Сделаем эту функцию доступной всегда.
Что такое профиль PowerShell? Это специальный скрипт .ps1, который PowerShell автоматически запускает каждый раз при старте. Все, что вы поместите в этот файл — псевдонимы, переменные и функции — будет доступно в каждой вашей сессии по умолчанию.
Находим путь к файлу профиля. PowerShell хранит его в переменной $PROFILE.
Добавляем код нашей функции в конец файла профиля.
Add-Content -Path $PROFILE -Value $functionCode
Перезапустите PowerShell (или выполните . $PROFILE), и теперь ваша команда Find-DuplicateFiles будет доступна всегда, как и Get-ChildItem.
Пример 2: Создание ZIP-архива с резервной копией
Код для файла Backup-FolderToZip.ps1:
Детальный разбор функций я сделаю следующих частях.
Справочник командлетов для работы с файловой системой
1. Основные командлеты
Нужно прочитать содержимое текстового файла? Используйте Get-Content. Нужно полностью перезаписать файл новым содержимым? Используйте Set-Content. Нужно добавить строчку в лог-файл, не стирая старые данные? Используйте Add-Content. Нужно проверить, существует ли файл перед записью? Используйте Test-Path.
2. Специализированные командлеты для продвинутых задач
Когда базовых командлетов недостаточно, PowerShell предлагает более специализированные инструменты. Они не дублируют базовые, а расширяют ваши возможности.
Работа с путями (Path)
Join-Path: Безопасно объединяет части пути, автоматически вставляя \.
Split-Path: Разбивает путь на части (папка, имя файла, расширение).
Resolve-Path: Преобразует относительный путь (например, . или ..\files) в полный, абсолютный.
Работа со свойствами и содержимым (Item Properties and Content)
Get-ItemProperty: Получает свойства конкретного файла (например, IsReadOnly, CreationTime).
Set-ItemProperty: Изменяет свойства файла или папки.
Clear-Content: Удаляет всё содержимое из файла, но оставляет сам файл пустым.
Продвинутая навигация (Location Stack)
Push-Location: "Запоминает" текущую директорию и переходит в новую.
Pop-Location: Возвращается в директорию, которую "запомнил" Push-Location.
Управление правами доступа (ACL)
Get-Acl: Получает список прав доступа (ACL) для файла или папки.
Set-Acl: Устанавливает права доступа для файла или папки (сложная операция).
Нужно изменить атрибут файла, например, сделать его «только для чтения»? Используйте Set-ItemProperty. Нужно полностью очистить лог-файл, не удаляя его? Используйте Clear-Content. Нужно временно перейти в другую папку в скрипте, а потом гарантированно вернуться назад? Используйте Push-Location и Pop-Location. Нужно узнать, кто имеет права на доступ к папке? Используйте Get-Acl.
В следующей части мы узнаем, как работать с другими хранилищами данных, такими как реестр Windows, используя те же самые подходы, углубимся в понятие функций, рассмотрим операторы логики и научимся интерактивно взаимодействовать с оболочкой
Один из самых компактных в своём классе: 255 × 150 × 150 мм. А ещё с крутым дизайном и подсветкой.
🚀 Работает на базе Intel Core i9-13900H с тактовой частотой до 5,4 ГГц (Turbo Boost). В качестве видеокарты выступает NVIDIA GeForce RTX 4060 на 8 ГБ. Объём двухканальной оперативной памяти DDR5 может составлять до 64 ГБ, а ёмкость SSD-накопителя — до 2 ТБ.