Декларативное управление конфигурацией Windows через DSC — IaC начинается с dsc.exe

· Обновлено: · · Windows, DSC, IaC, PowerShell, winget, Управление конфигурацией

История изменений (первая версия, опубликована 28 Aug 2026)
Первая публикация

«Хочу заново собрать стандартный ПК», «хочу ещё раз прогнать установку, которая оборвалась на середине», «хочу найти настройки, которые кто-то поменял руками». Когда клиентами и серверами Windows управляют инструкциями и сценариями, трудно именно воспроизвести те же настройки и удержать их.

Инструкция расходится с реальностью, если не продолжать отслеживать изменения после выполнения. У BAT и PowerShell, чтобы повторный запуск не дал двойного применения или ошибки, проверки существования и ветвления приходится писать самим. Этот труд DSC (Desired State Configuration) переносит на управление, где пишут не «шаги», а «желаемое состояние».

В статье речь о Microsoft DSC v3 (dsc.exe), который в 2025 году появился как командная утилита без зависимости от PowerShell. Это входная точка, чтобы сами клиенты и серверы Windows вести декларативным IaC (Infrastructure as Code) — примерно так, как Terraform и Ansible используют в Linux и в облаке.1

Аудитория — разработчики и сотрудники ИТ, которые хотят уйти от инструкций и сценариев в управлении конфигурацией Windows. Исходные условия: Windows 10/11, DSC 3.0 и новее, базовые операции PowerShell; сложность средняя. Имена адаптеров начиная с DSC 3.2 и нужную версию WinGet разбираем в соответствующих местах отдельно.

1. Сначала вывод — пишем состояние и применяем после проверки

Если декларативное управление конфигурацией Windows начинаете сейчас, берите Microsoft DSC v3 (dsc.exe). В YAML/JSON пишут «желаемое состояние», а сравнение с текущим и применение оставляют DSC и ресурсам. Одну и ту же конфигурацию можно применять повторно: к пунктам, которые уже в желаемом состоянии, ничего не делается. Это и есть идемпотентное управление.23

Но «можно применять сколько угодно раз» и «это содержимое вообще допустимо применять» — разные вещи. Сначала читают состояние, сверяют разницу и прогноз и только потом применяют. Кроме того, DSC v3 не резидентный агент, поэтому периодический аудит и восстановление проектируют отдельно.41

Читать удобно в таком порядке.

Что решить сейчас Какие главы Что получите
О каком DSC речь и что можно ему поручить главы 2–3 Различие поколений и роли get, test и set
Попробовать на малом и собрать в файл конфигурации главы 4–5 От проверки одиночного ресурса до применения конфигурации целиком
Использовать существующие активы PSDSC и winget глава 6 Условия перехода адаптеров и формата файлов
Удержать уже применённое состояние главы 7–8 Обнаружение дрейфа, права запуска, работа с секретами
От управления шагами к управлению состояниемВ сценарии-инструкции проверки существования и ветвления для повторного запуска пишут сами, а в DSC объявляют желаемое состояние, и сравнение с текущим плюс применение берут на себя DSC и ресурсыПишем шаги (BAT, PowerShell)Сами реализуем проверки и ветвленияПишем состояние (DSC)Сравниваем с текущим состояниемПрименяем только нужные пункты

Рис. 1: Ответственность за повторный запуск переносят с развилок в сценарии на объявление состояния и использование ресурсов.

На схеме сплошная линия обозначает отношение, которое выполняется всегда, а пунктирная — условное отношение (условия указаны в пояснении к каждому отношению на странице сведений). Полный список отношений (всего 17, с доказательствами и степенью уверенности) и определения основных понятий собраны на странице сведений карты знаний (на японском). Данные: JSON-LD / Turtle

2. Какой DSC вы читаете — четыре линии и то, чего в v3 нет

2.1. Герой статьи — самостоятельный dsc.exe

Поиск по «DSC» выдаёт четыре линии с разной записью и разным способом запуска. Сначала смотрите, о какой из них материал.5

Линия Суть Место
PSDSC v1.1 Встроен в Windows PowerShell 5.1 Наследие. Резидентный LCM, формат MOF
PSDSC v2 Модуль для PowerShell 7 PSDesiredStateConfiguration 2.x
PSDSC v3 (превью) Модуль PowerShell Для Linux-поддержки Azure Machine Configuration
Microsoft DSC v3 Самостоятельный dsc.exe Герой этой статьи. Без зависимости от PowerShell, кроссплатформенный

Microsoft DSC v3 — не просто обновление модуля PowerShell DSC (PSDSC). Это другой продукт, переписанный с отвязанной зависимостью от PowerShell. Конфигурацию описывают данными JSON/YAML, ресурс можно реализовать на любом языке. Сам DSC работает на Linux, macOS и Windows.1

Родословная четырёх линий DSCОт PSDSC v1.1, встроенного в Windows PowerShell 5.1, ответвляются PSDSC v2 для PowerShell 7 и превью PSDSC v3 для Machine Configuration; отдельно от них переписанный без зависимости от PowerShell Microsoft DSC v3 становится действующим героем статьиПереписанPSDSC v1.1 (встроен в WinPS 5.1)PSDSC v2 (PowerShell 7)Превью PSDSC v3Microsoft DSC v3 (dsc.exe)Azure Machine ConfigurationГерой этой статьи

Рис. 2: Одно имя DSC, но поколение модуля PowerShell и самостоятельный dsc.exe нужно различать.

Дальше в статье «DSC» означает Microsoft DSC v3. Если в поиск добавить «DSC v3» или «dsc.exe», материалы старых поколений проще отделить. Как вызывать существующие ресурсы PSDSC — в главе 6.

2.2. v3 — не резидентная служба, которая помнит конфигурацию и чинит её сама

LCM (Local Configuration Manager) в PSDSC v1.1 был резидентным агентом: хранил конфигурацию, применял её по расписанию и восстанавливал автоматически. В DSC v3 LCM нет: это команда, которая работает, только когда её вызвали. Поставить dsc.exe и один раз применить конфигурацию недостаточно: последующие изменения сами собой не исправятся.1

Резидентный LCM в v1.1 против командной модели v3В PSDSC v1.1 резидентный LCM хранил конфигурацию и выполнял периодический pull и автовосстановление, а DSC v3 только запускается как команда, поэтому каркас периодического запуска выбирают сами среди Планировщика заданий, CI и Machine ConfigurationPSDSC v1.1: резидентный LCMХранит конфигурацию, периодический pull и автовосстановлениеDSC v3: только запуск командыКаркас запуска готовите самиПланировщик заданий, CI, Machine Configuration

Рис. 3: В v3 «как конфигурировать» и «когда запускать» разделены; второе оставляют Планировщику заданий или вышестоящей платформе управления.

Это не просто урезание функций, а смена дизайна: способ запуска открыли современным инструментам. Но если ждать тот же pull server, что в v1.1, будет непривычно. Если нужно непрерывное принуждение, придётся выбрать площадку запуска: Планировщик заданий, CI, Machine Configuration. Конкретная эксплуатация — в главе 7.

3. Понять декларативную конфигурацию — сравнить шаги и состояние

3.1. Убрать из объявления проверки существования и ветвления

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

# Императивно: пишем «шаги». Ветвления и порядок ведёте сами
$path = 'HKCU:\Software\MyCompany\App'
if (-not (Test-Path $path)) {
    New-Item -Path $path -Force | Out-Null
}
Set-ItemProperty -Path $path -Name 'Mode' -Value 'standard'

В DSC то же требование становится объявлением состояния. Проверку существования и ветку создания на стороне объявления не пишут. Полный пример, где этот фрагмент стоит в resources документа конфигурации, — в главе 5.

# Декларативно: пишем «состояние». Как создать и исправить — работа ресурса
- name: Режим работы приложения
  type: Microsoft.Windows/Registry
  properties:
    keyPath: HKCU\Software\MyCompany\App
    valueName: Mode
    valueData:
      String: standard

Разница не в том, что на PowerShell идемпотентность невозможна. Проверку и применение, которые вы писали в сценарии, поручают ресурсу. И на ПК, где установка оборвалась, и на уже настроенном можно заново применить одно и то же «желаемое состояние».2

3.2. get, test и set берёт на себя ресурс

В центре DSC стоит ресурс: для каждого объекта конфигурации — значения реестра, компонента Windows, переменной среды — он даёт операции. Пользователь пишет «что и каким должно быть», а «как настроить» оставляет ресурсу.6

Операция Роль Отличие в реализации
get Получить текущее состояние Реализуют все ресурсы
test Судить, совпадает ли текущее состояние с объявлением Если своей реализации нет, DSC подменяет синтетическим тестом: сравнивает результат получения с объявлением
set Привести к желаемому состоянию Реализуют только ресурсы, которые умеют принуждать состояние. У ресурсов только для чтения, например сведений об ОС, его нет

dsc config set для конфигурации целиком сначала делает test каждого экземпляра и вызывает set только у тех, кто не в желаемом состоянии. Поэтому одну и ту же конфигурацию можно применять повторно.3

Цикл сходимости через get, test и settest сравнивает желаемое состояние из документа конфигурации с текущим; при отсутствии разницы ничего не делает, при наличии set применяет только разницу, а get позволяет проверить результат — идемпотентная сходимостьРазницы нетЕсть разницаДокумент конфигурации (желаемое состояние)test: сравнить с текущимНичего не делать (идемпотентность)set: применить только разницуget: проверить итоговое состояние

Рис. 4: При применении конфигурации целиком сначала сравнивают и меняют только нужные экземпляры ресурсов.

3.3. Не путать одиночный resource set и config set для конфигурации целиком

dsc resource set всегда вызывает set указанного ресурса. Есть ли предварительный тест — зависит от реализации ресурса и от implementsPretest в манифесте. Важно не считать, что предварительный тест config set есть и у resource set.3

Предварительный тест: конфигурация целиком и одиночный вызовconfig set тестирует каждый экземпляр и вызывает set только при необходимости, а resource set всегда вызывает set ресурса, и предварительный тест там зависит от реализации и манифестаДаНетconfig setТестировать каждый экземплярЖелаемое состояние?set не вызыватьВызвать setresource setВызвать set ресурсаПредварительный тест — как реализовано

Рис. 5: Даже у одного set различают операцию над конфигурацией целиком, где DSC делает предварительный тест, и одиночный вызов, который передают ресурсу напрямую.

Проще начать с наблюдения через одиночные get и test, а несколько состояний собирать в документ конфигурации уже на следующем шаге. Идемпотентность — свойство для повторного запуска; она не отменяет нехватку прав и ошибки выполнения ресурса.

4. Первые операции — установить и наблюдать через get и test

4.1. Подготовить dsc.exe и посмотреть доступные ресурсы

Ставят двумя способами: распаковать архив с релизов GitHub и добавить в PATH либо на Windows поставить из winget, указав источник Microsoft Store.1

# Найти и установить стабильную версию из источника Microsoft Store
winget search DesiredStateConfiguration --source msstore
winget install --id 9NVTPZWRC6KQ --source msstore

После установки перечислите ресурсы, доступные в этой среде.

dsc resource list

Подготовить сам DSC и получить нужные ресурсы — разные проверки. Здесь находят полное имя типа, затем задают свойства для ввода. Если нужны ресурсы PSDSC старых поколений, смотрите и адаптеры в главе 6.

4.2. Сначала читать реестр в профиле пользователя

Ресурсы можно вызывать по одному, ещё не написав документ конфигурации. Следующий пример читает значение под HKCU через get и через test судит, соответствует ли оно желаемому. Ни то ни другое не меняет значение.7

# Получить текущее состояние (get)
dsc resource get --resource Microsoft.Windows/Registry `
  --input '{"keyPath":"HKCU\\Software\\MyCompany\\App","valueName":"Mode"}'

# Судить, соответствует ли желаемому (test) — изменений нет
dsc resource test --resource Microsoft.Windows/Registry `
  --input '{"keyPath":"HKCU\\Software\\MyCompany\\App","valueName":"Mode","valueData":{"String":"standard"}}'
Четыре операции команды dsc resourceПод командой dsc resource висят четыре операции: list показывает перечень ресурсов, get получает текущее состояние, test без изменений судит, соответствует ли оно желаемому, set применяет состояние (только у ресурсов с реализацией Set)команда dsc resourcelist: перечень ресурсовget: получить текущее состояниеtest: только суждение, без измененийset: применить (ресурсы с Set)

Рис. 6: list ищет ресурс, get читает текущее значение, test сверяет разницу с объявлением, и только потом переходят к set.

Для set, который меняет машину целиком — HKLM, системные настройки — нужны права администратора. Первые пробы начинают с примера в профиле пользователя (HKCU и подобные) и перед операциями с изменением сверяют объект и права. Использование адаптера для ресурсов PSDSC линии Windows PowerShell тоже предполагает запуск от администратора.7 Как разделять пользователя запуска и конфигурацию — в главе 8.

5. Документ конфигурации — от объявления до проверки после применения

5.1. Собрать в YAML, «что и каким должно быть»

Документ конфигурации — YAML/JSON-файл, в котором объявляют сразу несколько экземпляров ресурсов. Минимум задают $schema и resources; у каждого экземпляра есть name (уникальное в документе отображаемое имя), type (полное имя типа ресурса) и properties (желаемое состояние).2

# standard-pc.dsc.config.yaml — желаемое состояние стандартного ПК
$schema: https://aka.ms/dsc/schemas/v3/bundled/config/document.json
parameters:
  appMode:
    type: string
    defaultValue: standard
resources:
  - name: Режим работы приложения
    type: Microsoft.Windows/Registry
    properties:
      keyPath: HKCU\Software\MyCompany\App
      valueName: Mode
      valueData:
        String: "[parameters('appMode')]"

Здесь объявление из главы 3 собрано в файл, а режим работы вынесен в параметр appMode. Значения, которые отличаются по отделу или среде, можно держать отдельно от тела конфигурации. parameters и variables сокращают повторные определения и позволяют выразить динамические значения. В выражениях используют подмножество функций шаблонов ARM.2

Структура документа конфигурацииДокумент конфигурации состоит из schema с URI схемы документа, parameters и variables, которые поглощают различия сред, и массива resources; у каждого экземпляра есть name, type и propertiesДокумент конфигурации (YAML / JSON)$schema: URI схемы документаparameters / variablesresources: массив экземпляровname, type, properties

Рис. 7: Если схему документа, значения по средам и объявления ресурсов разделить, намерение настройки читается как данные.

Выгода данных в том, что «что должно быть настроено на этом ПК» можно ревьюить как YAML-дифф. Но «это данные» не значит «это безопасно». Ссылаемый ресурс меняет систему, поэтому проверка доверия из главы 8 тоже нужна.8

5.2. Идти в порядке test → what-if → set → get

Перед применением обязательно наблюдают. dsc config test сообщает, есть ли разница с желаемым состоянием; dsc config set --what-if показывает прогноз, ничего не меняя.4

Четыре шага безопасного примененияСначала dsc config test без изменений показывает, есть ли разница; параметр what-if у dsc config set показывает прогноз изменений; после согласия применяют set и проверяют результат через getdsc config test (есть ли разница)set --what-if (прогноз изменений)dsc config set (применение)dsc config get (проверка результата)

Рис. 8: Сначала смотрят разницу, затем прогноз изменений, применяют только когда это устраивает. В конце снова читают фактическое состояние.

# 1. Проверить, есть ли разница (без изменений)
dsc config test --file .\standard-pc.dsc.config.yaml

# 2. Показать прогноз, что изменится при применении (без изменений)
dsc config set --file .\standard-pc.dsc.config.yaml --what-if

# 3. Применить, когда прогноз устраивает
dsc config set --file .\standard-pc.dsc.config.yaml

# 4. Проверить состояние после применения
dsc config get --file .\standard-pc.dsc.config.yaml

Смотрят разное. test — суждение о совпадении, what-if — прогноз изменений, get — получение фактического состояния. Если ресурс не реализует what-if сам, прогноз синтезируют из результата test, поэтому его нельзя принимать за измерение после применения.4

Такой порядок делает смену настроек не разовым броском: на каждом шаге можно решить. Идемпотентность и what-if не заменяют проверку прав при применении и доверия к ресурсу.

5.3. Если стартуете с уже живой среды — export ресурсов с поддержкой выгрузки

dsc config export — вход в обратную сторону: выписать текущую среду. Если во входном документе через --file перечислить ресурсы с поддержкой export, в стандартный вывод вернётся документ конфигурации со всеми существующими экземплярами этих ресурсов.9

# Передать входной документ с перечнем целевых ресурсов и сохранить текущий документ конфигурации
dsc config export --file .\export-targets.dsc.config.yaml > .\current-state.dsc.config.yaml

Выгрузить можно не любой ресурс; каждый тип ресурса во входном документе объявляют один раз. Полученную картину берут как отправную точку и решают, что вести как стандарт. export выписывает текущее состояние; считать его желаемым — решение эксплуатации.9

От текущего состояния к объявлению того, чем управлятьЕсли во входном документе перечислить ресурсы с поддержкой export, получится документ конфигурации с существующими экземплярами; его содержимое проверяют и на стороне эксплуатации решают, какое состояние вести как стандартПеречислить ресурсы с exportdsc config exportДокумент с существующими экземплярамиПроверить содержимое и выбрать стандартОбъявление состояния, которым управлять

Рис. 9: Выписать текущее состояние и решить, что принять как стандарт, — разные этапы.

6. Использовать существующие активы — адаптеры и WinGet Configuration

6.1. Ресурсы PSDSC вызывают адаптером под среду выполнения

То, что v3 — другой продукт, не делает существующие ресурсы PSDSC бесполезными. Через ресурсы-адаптеры их вызывают из документа конфигурации v3. В DSC 3.2 имена сменились, поэтому сверяйте версию установки с именами в материалах.10

Среда, в которой крутят существующий ресурс Имя адаптера с DSC 3.2 Имя раньше
PowerShell 7. Классовые ресурсы Microsoft.Adapter/PowerShell Microsoft.DSC/PowerShell
Windows PowerShell 5.1. Совместимые ресурсы на MOF, сценариях и т. п. Microsoft.Adapter/WindowsPowerShell Microsoft.Windows/WindowsPowerShell

Даже если сам DSC не зависит от PowerShell, существующий ресурс, вызванный через адаптер, работает в соответствующей среде PowerShell. Сторона Windows PowerShell использует встроенный PSDesiredStateConfiguration 1.1 и умеет совместимые сценарные, классовые и двоичные ресурсы.10

Слои вокруг DSC v3Слой оркестрации вроде winget configure и Azure Machine Configuration вызывает DSC v3; DSC v3 вызывает нативные ресурсы напрямую, а существующие ресурсы PSDSC — через ресурсы-адаптерыwinget configure, Machine Configurationdsc.exe (DSC v3)Нативные ресурсы (Registry и др.)Ресурсы-адаптерыСуществующие ресурсы PSDSC (активы PowerShell)

Рис. 10: DSC v3 вызывает нативные ресурсы напрямую, а существующие активы PowerShell использует через адаптер.

6.2. В схеме v3 WinGet обработчиком указывают DSC v3

Вторая точка подключения — WinGet Configuration. Файлы .winget из статьи о комплектации ПК в схеме v3 тоже используют DSC v3 как обработчик. Нужны WinGet 1.11 и новее и процессор dscv3.11

В metadata.winget.processor.identifier файла конфигурации указывают dscv3, а resources пишут прямо в корне документа. Содержимое — документ конфигурации DSC v3.

# WinGet Configuration v3 — внутри документ конфигурации DSC v3
$schema: https://raw.githubusercontent.com/PowerShell/DSC/main/schemas/2023/08/config/document.json
metadata:
  winget:
    processor:
      identifier: dscv3
resources:
  - name: Режим работы приложения
    type: Microsoft.Windows/Registry
    properties:
      keyPath: HKCU\Software\MyCompany\App
      valueName: Mode
      valueData:
        String: standard

Существующий формат v2 нельзя передать dscv3 как есть. Файлы v2 с properties.configurationVersion: 0.2.0 и ресурсами внутри properties продолжают работать на прежнем обработчике. Чтобы посадить их на DSC v3, формат переносят по «Convert to v3» в официальном репозитории примеров.11

То есть повторно использовать нужно разное. У PSDSC это вызов ресурса через адаптер, у WinGet — совпадение формата файла конфигурации и обработчика. Объявление состояния, которое изучаете на DSC v3, — общая основа от локального dsc.exe до winget configure при комплектации и до вышестоящих платформ вроде Machine Configuration.1

7. Непрерывная эксплуатация — Git как источник истины и обнаружение дрейфа

7.1. Сначала автоматизировать только обнаружение и отделить его от восстановления

Документ конфигурации кладут в репозиторий Git. Если изменения ревьюят pull request, затем мержат и применяют, желаемая конфигурация и история её правок живут в одном месте. Управление, где отдельно догоняют инструкцию, сменяется управлением, где источником истины становится исполняемое объявление.

Когда после применения кто-то меняет настройки руками и они расходятся с объявленным состоянием, это дрейф конфигурации. Его обнаруживают периодическим запуском dsc config test. test ничего не меняет, поэтому обнаружение и восстановление можно разделить. Сначала автоматизируют только обнаружение; восстановление через set делают после сверки разницы.

Цикл управления конфигурацией с Git как исходной точкойДокумент конфигурации в репозитории Git ревьюят через pull request, затем применяют; периодический test из Планировщика заданий или CI обнаруживает дрейф; разницу смотрят и либо восстанавливают, либо возвращаются к обновлению конфигурацииОбнаружен дрейфКонфигурация вернаВерна реальностьРепозиторий Git (документ конфигурации)Изменения ревьюят в pull requestПрименить через dsc config setПериодический запуск: dsc config testСверить разницу и выбрать действиеВосстановить через set

Рис. 11: Объявление ревьюят и применяют, периодический test ловит разницу. Восстанавливать или обновлять объявление решают по содержимому.

Дрейф не всегда ошибка. Если на месте сделали нужное изменение, ПК не возвращают назад: обновляют документ конфигурации, ревьюят и мержат. Если верно объявление — восстанавливают через set. В обоих случаях дисциплина одна: источник истины лежит в Git.

7.2. Отличать «проверить не удалось» от «есть расхождение»

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

# Для периодического запуска: отличить сбой самого test, ошибку отдельного ресурса и дрейф; во всех случаях выходить с ненулевым кодом
$json = dsc config test --file C:\config\standard-pc.dsc.config.yaml
if ($LASTEXITCODE -ne 0 -or -not $json) {
    Write-Error "Сам запуск dsc config test завершился сбоем (код завершения: $LASTEXITCODE)"
    exit 2
}
$result = $json | ConvertFrom-Json
if ($result.hadErrors) {
    # Сбой проверки документа или ненулевой код части ресурсов. Проверка не дошла до конца — не сообщать, что всё здорово
    Write-Error "Проверка части ресурсов завершилась ошибкой. Смотрите messages"
    exit 2
}
if ($result.results.result.inDesiredState -contains $false) {
    Write-Error "Обнаружен дрейф конфигурации"
    exit 1
}
Отличать сбой периодической проверки от дрейфаВ примере периодической проверки смотрят код завершения и вывод DSC, затем hadErrors на ошибки проверки, и если inDesiredState равен false — сообщают о дрейфеДаНетДаНетДаНетКод завершения и вывод DSCСбой запуска или нет вывода?Сбой проверки (код 2)hadErrors?inDesiredState равен false?Обнаружен дрейф (код 1)В этой проверке разницы нет

Рис. 12: Ошибку проверки не сообщают как «разницы нет». Дрейф — это результат, когда проверка смогла отработать и состояния не совпали.

Пример рассчитан на базовую форму из главы 5, где обычные экземпляры ресурсов перечислены напрямую. Перед тем как встраивать в мониторинг, сверьте форму результата и поведение при ошибках с той конфигурацией и теми ресурсами, которые берёте. Сбой проверки документа и ошибки ресурсов, на которые указывает hadErrors, нельзя считать здоровым состоянием.

7.3. Площадку периодического запуска выбирают по тому, как управляют ПК и организацией

LCM в DSC v3 нет, поэтому кто и когда запускает test, решают отдельно. На клиенте можно взять Планировщик заданий, на парке серверов — CI-раннер. Проектирование запуска без интерактивного пользователя — в отдельной статье.

В организациях, которые уже сводят управление в Azure, Machine Configuration даёт управляемую площадку аудита и применения настроек ОС для виртуальных машин Azure и локальных серверов через Azure Arc.12 Выбирают: периодически запускать локальную команду или сажать на вышестоящую платформу управления.

8. Что проверить до применения — права запуска, секреты, доверие

8.1. Пользовательские и машинные настройки разделять уже на этапе конфигурации

Для set, который затрагивает машину целиком — HKLM, компоненты Windows — нужно повышение прав. Если ресурсы PSDSC линии Windows PowerShell вызывают через адаптер, запуск от администратора тоже предполагается.7

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

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

Рис. 13: YAML недостаточно раздавать одинаково: заранее решают, от какого пользователя и с какими правами эту конфигурацию применяют.

8.2. Не класть секреты в Git и проверять ресурсы, на которые ссылаетесь

Документ конфигурации — данные, которые кладут в Git. Пароли и ключи API не пишут напрямую: параметризуют и передают в момент запуска. Параметры главы 5 разделяют различия сред, но отделить секреты от тела конфигурации тоже важно.

Файлы .winget и документы конфигурации из публичных репозиториев запускают, только прочитав содержимое. Проверяйте не только текст файла, но и то, можно ли доверять ресурсам, на которые он ссылается. Документ конфигурации умеет менять систему через ресурсы. Это обязательное требование эксплуатации, о котором предупреждает и официальная документация.8

9. Итог — с нескольких настроек собрать исполняемый источник истины

Если декларативный IaC Windows начинаете сейчас — Microsoft DSC v3 (dsc.exe). Различив четыре линии DSC, сначала наблюдают одиночными get и test, затем собирают конфигурацию в YAML/JSON. При применении идут в порядке test → what-if → set → get, отделяя суждение, прогноз, применение и проверку.54

Повторно применять можно потому, что пишут не «шаги», а «желаемое состояние», а сравнение и нужное применение берут на себя DSC и ресурсы. Существующие ресурсы PSDSC повторно используют через адаптер; активы WinGet подключают, перенеся формат на схему v3.31011

В непрерывной эксплуатации исходят из того, что у самого v3 LCM нет. Канон конфигурации кладут в Git, периодический test обнаруживает дрейф: если верна конфигурация — восстанавливают, если верна реальность — обновляют конфигурацию.1 Права запуска, секреты и доверие к ссылкам проектируют вместе с порядком применения.

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

Похожие статьи

Смежные области консультирования

Компания KomuraSoft LLC помогает перейти к декларативному управлению конфигурацией Windows-клиентов и серверов, автоматизировать подготовку ПК и внутреннюю стандартную среду и сделать исполняемыми инструкции, которые держались на конкретных людях.

Справочные ссылки

  1. Microsoft Learn, Microsoft Desired State Configuration overview. О том, что DSC v3 — декларативная идемпотентная платформа конфигурации, не зависит от PowerShell и работает на Linux, macOS и Windows; не включает LCM (Local Configuration Manager), запускается как команда и не живёт как служба; через ресурсы-адаптеры совместим с ресурсами PSDSC; ставится из источника Microsoft Store в winget (стабильный идентификатор 9NVTPZWRC6KQ) или с релизов GitHub; ранние партнёры слоя оркестрации — WinGet, Microsoft Dev Box и Azure Machine Configuration.  2 3 4 5 6 7

  2. Microsoft Learn, DSC configuration documents. О том, что документ конфигурации — YAML/JSON-файл данных, объявляющий желаемое состояние, а «как настроить» берут на себя ресурсы; обязательные свойства — $schema и resources, у каждого экземпляра есть name, type и properties; parameters и variables позволяют сократить дубли и выразить динамические значения; обрабатывается четырьмя операциями dsc config get/test/set/export; поддерживается подмножество функций выражений шаблонов ARM.  2 3 4

  3. Microsoft Learn, dsc resource set. О том, что в dsc config set DSC обязательно тестирует каждый экземпляр (реализация test ресурса или синтетический тест) и вызывает set только у экземпляров не в желаемом состоянии; напротив, одиночный dsc resource set всегда вызывает set, а есть ли предварительный тест — зависит от set.implementsPretest в манифесте ресурса; у ресурсов без implementsPretest перед set рекомендуют выполнить dsc resource test.  2 3 4

  4. Microsoft Learn, dsc config set. О том, что dsc config set — команда, которая применяет желаемое состояние документа конфигурации к системе, и о параметре –what-if, который без фактических изменений показывает прогноз «что и как изменится при запуске». Вместе с DSC Resource manifest whatIf property: если ресурс не реализует поведение what-if напрямую, эти сведения синтезируются из результата test.  2 3 4

  5. Microsoft Learn, Desired State Configuration (DSC) Overview. О четырёх версиях DSC (PSDSC 1.1, встроенный в Windows PowerShell 5.1; PSDSC 2.0 для PowerShell 7; превью PSDSC 3.0 для Linux-поддержки Azure Machine Configuration; Microsoft DSC 3.0 как самостоятельный продукт без зависимости от PowerShell) и о том, что Microsoft DSC 3.0 по-настоящему кроссплатформенный и может использовать существующие ресурсы PSDSC.  2

  6. Microsoft Learn, DSC Resources. О том, что ресурс — стандартизированный интерфейс объекта конфигурации: декларативным синтаксисом пишут «каким должно быть», а «как настроить» берёт ресурс; обязательно есть операции Get и Test, большинство ресурсов поддерживает и принуждение через Set; ресурс задают полным именем типа (owner.group.area/name); ресурсы-адаптеры позволяют использовать ресурсы, которые не являются командными. 

  7. Microsoft Learn, Get started with DSC. О вводном потоке: обнаружение ресурсов, одиночный вызов, управление документами конфигурации; одиночные get, test и set ресурса Microsoft.Windows/Registry; проверка, применение и подтверждение конфигурации через dsc config test/set/get; о том, что для ресурсов PSDSC линии Windows PowerShell нужен терминал с правами администратора.  2 3

  8. Microsoft Learn, configure command (winget). О том, что winget configure — команда, которая по файлу WinGet Configuration приводит машину к желаемому состоянию; предупреждение проверять содержимое файла и надёжность связанных ресурсов до запуска; подкоманды show/list/test/validate/export показывают содержимое файла, перечень применённых конфигураций, сверку текущего и желаемого, проверяют файл и выгружают конфигурацию.  2

  9. Microsoft Learn, dsc config export. О том, что подкоманда export порождает и возвращает документ конфигурации, определяющий все существующие экземпляры ресурсов, перечисленных во входном документе через –file или –input; во входном документе можно указать только ресурсы с секцией export в манифесте, и каждый тип ресурса объявляют один раз.  2

  10. Microsoft Learn, Microsoft.Adapter/WindowsPowerShell. О том, что ресурс-адаптер позволяет из DSC v3 обнаруживать и вызывать совместимые с Windows PowerShell 5.1 ресурсы PSDSC (сценарные, классовые, двоичные); использует встроенный модуль PSDesiredStateConfiguration 1.1; это имя в DSC 3.2 заменило прежний адаптер Microsoft.Windows/WindowsPowerShell; для классовых ресурсов на PowerShell 7 берут Microsoft.Adapter/PowerShell (ранее Microsoft.DSC/PowerShell).  2 3

  11. Microsoft Learn, WinGet Configuration file v3 schema reference. О том, что схема v3 WinGet Configuration использует DSC v3 как обработчик; нужны WinGet 1.11 и новее и процессор dscv3 (ставится автоматически отдельным пакетом Microsoft.DesiredStateConfiguration); в metadata.winget.processor.identifier указывают dscv3, а resources пишут прямо в корне документа; руководство по преобразованию из формата v2 есть в официальном репозитории примеров.  2 3

  12. Microsoft Learn, Understanding Azure Machine Configuration. О том, что функция Machine Configuration в Azure Policy умеет управляемо аудировать (audit) и настраивать (configure) параметры внутри ОС на виртуальных машинах Azure и серверах с Azure Arc. 

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

Политика аудита безопасности Windows и расследование журнала событий на практике — как стать ИТ-службой, которая умеет читать 4625

Практическое руководство, чтобы ответить на просьбу «посмотрите журналы неудачных входов». Разбирает связь базовой и расширенной политики...

Эти страницы показывают тему статьи в более широком контексте услуг и решений.

Статья напрямую связана со следующими услугами.

Частые вопросы

Вопросы, которые часто возникают при консультациях по теме статьи.

У DSC, кажется, несколько версий. Какую брать?
Если декларативное управление конфигурацией начинаете сейчас — Microsoft DSC v3 (dsc.exe). У DSC четыре линии: PSDSC v1.1, встроенный в Windows PowerShell 5.1; PSDSC v2 как модуль для PowerShell 7; PSDSC v3 (превью), который используют для Linux-поддержки Azure Machine Configuration; и Microsoft DSC v3, переписанный как самостоятельная команда без зависимости от PowerShell. v3 кроссплатформенный: конфигурацию пишут данными YAML/JSON, а не сценариями PowerShell, а существующие ресурсы PSDSC можно вызывать через адаптеры. В поиске добавляйте «DSC v3» или «dsc.exe» — так проще отделить материалы старых поколений.
Чем DSC v3 отличается от сценария-инструкции (BAT или PowerShell)?
Сценарий-инструкция описывает «шаги, которые выполнить», поэтому идемпотентность приходится строить самим, чтобы повторный запуск не дал двойного применения или ошибки. DSC записывает «желаемое состояние» как данные, а сравнение с текущим (test) и применение разницы (set) берут на себя ресурсы. Сколько ни запускайте один и тот же документ конфигурации, к пунктам, которые уже в желаемом состоянии, он ничего не делает, поэтому распространять и повторять можно, не считая запусков. А поскольку конфигурация — YAML-данные, ревью диффов и история поколений в Git заметно проще, чем у сценариев.
Существующие ресурсы PowerShell DSC и активы WinGet Configuration пропадут зря?
Нет. DSC v3 вызывает существующие классовые и MOF-ресурсы PSDSC через ресурсы-адаптеры (с DSC 3.2 — Microsoft.Adapter/PowerShell и Microsoft.Adapter/WindowsPowerShell; раньше — Microsoft.DSC/PowerShell и Microsoft.Windows/WindowsPowerShell). WinGet Configuration начиная со схемы v3 (WinGet 1.11 и новее) использует DSC v3 как обработчик. Существующие файлы .winget формата v2 по-прежнему работают на прежнем обработчике, но чтобы посадить их на обработчик DSC v3, нужно перевести в формат v3 по официальному руководству по преобразованию.
Как в DSC v3 «непрерывно» принуждать конфигурацию?
Сам DSC v3 — инструмент, который запускают как команду: резидентного агента и автовосстановления вроде LCM (Local Configuration Manager) из v1.1 у него нет. Если нужны непрерывное применение и аудит, либо сами устраиваете обнаружение дрейфа периодическим запуском dsc config test из Планировщика заданий или CI, либо сажаете на слой оркестрации вроде Azure Machine Configuration (через Azure Arc можно охватить и локальные серверы).
Страшно сразу запускать dsc config set. Можно заранее увидеть влияние?
Можно. dsc config test без изменений показывает, какие экземпляры ресурсов не в желаемом состоянии. У dsc config set есть ещё параметр --what-if: он показывает прогноз «что и как изменится, если запустить», ничего не меняя. Сначала сверьте разницу test и --what-if, и только когда всё устраивает — запускайте set. Так безопаснее.

Об авторе

Страница с профилем автора статьи.

Го Комура

Представитель KomuraSoft LLC

Специализируется на разработке программного обеспечения для Windows, техническом консалтинге и расследовании сбоев, особенно в проектах с унаследованными системами и трудно воспроизводимыми ошибками.

Публичные ссылки

Вернуться в блог